Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 7 Jun 2009 19:21:46 +0400
From:      georg@dts.su
To:        freebsd-fs@freebsd.org
Subject:   Re[2]: fatal trap 12
Message-ID:  <1186509222.20090607192146@dts.su>
In-Reply-To: <20090607134038.GL1927@deviant.kiev.zoral.com.ua>
References:  <20090606161600.GB61928@dchagin.static.corbina.ru> <20090606175033.GJ1927@deviant.kiev.zoral.com.ua> <49009886.20090607153452@dts.su> <20090607134038.GL1927@deviant.kiev.zoral.com.ua>

next in thread | previous in thread | raw e-mail | index | archive | help
Hello, Kostik.

Have this after apply patch:
cc1: warnings being treated as errors
/usr/src/sys/fs/pseudofs/pseudofs_vnops.c: In function 'pfs_ioctl':
/usr/src/sys/fs/pseudofs/pseudofs_vnops.c:265: warning: 'pn' is used uninit=
ialized in this function
/usr/src/sys/fs/pseudofs/pseudofs_vnops.c:295: warning: 'pvd' is used unini=
tialized in this function
*** Error code 1


> I asked to remove questions@, isn't it ?

> On Sun, Jun 07, 2009 at 03:34:52PM +0400, georg@dts.su wrote:
>> Hello.
>>=20
>> After patch, whan make kernel I have this:
>> /usr/src/sys/kern/vfs_vnops.c:750:37: error: macro "vn_lock" requires 3 =
arguments, but only 2 given
>> /usr/src/sys/kern/vfs_vnops.c: In function 'vn_ioctl':
>> /usr/src/sys/kern/vfs_vnops.c:750: error: 'vn_lock' undeclared (first us=
e in this function)
>> /usr/src/sys/kern/vfs_vnops.c:750: error: (Each undeclared identifier is=
 reported only once
>> /usr/src/sys/kern/vfs_vnops.c:750: error: for each function it appears i=
n.)
>> /usr/src/sys/kern/vfs_vnops.c:769: error: too few arguments to function =
'VOP_UNLOCK'
>> *** Error code 1
>>=20
> The patch is for HEAD. You did not specified the version of your system.
> For RELENG_7, patch shall be adopted by adding curthread parameter
> to several calls, among them are vn_lock, VOP_ISLOCKED and VOP_UNLOCK().

> The patch probably cannot be merged to RELENG_7 due to KBI breakage.
> There, I think the following workaround for pseudofs might be enough,
> but it would be also needed for cd9660 and devfs at least.

> Try this.

> Index: fs/pseudofs/pseudofs_vnops.c
> =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
> --- fs/pseudofs/pseudofs_vnops.c        (revision 193634)
> +++ fs/pseudofs/pseudofs_vnops.c        (working copy)
> @@ -260,34 +260,51 @@
>  static int
>  pfs_ioctl(struct vop_ioctl_args *va)
>  {
> -       struct vnode *vn =3D va->a_vp;
> -       struct pfs_vdata *pvd =3D vn->v_data;
> -       struct pfs_node *pn =3D pvd->pvd_pn;
> +       struct vnode *vn;
> +       struct pfs_vdata *pvd;
> +       struct pfs_node *pn;
>         struct proc *proc;
> +       struct thread *td;
>         int error;
> =20
+       vn =3D va->>a_vp;
> +       td =3D curthread;
> +       vn_lock(vn, LK_SHARED | LK_RETRY, td);
+       if (vn->>v_iflag & VI_DOOMED) {
> +               VOP_UNLOCK(vn, 0, td);
> +               return (EBADF);
> +       }
+       pvd =3D vn->>v_data;
+       pn =3D pvd->>pvd_pn;
>         PFS_TRACE(("%s: %lx", pn->pn_name, va->a_command));
>         pfs_assert_not_owned(pn);
> =20
-       if (vn->>v_type !=3D VREG)
+       if (vn->>v_type !=3D VREG) {
> +               VOP_UNLOCK(vn, 0, td);
>                 PFS_RETURN (EINVAL);
> +       }
>         KASSERT_PN_IS_FILE(pn);
> =20
-       if (pn->>pn_ioctl =3D=3D NULL)
+       if (pn->>pn_ioctl =3D=3D NULL) {
> +               VOP_UNLOCK(vn, 0, td);
>                 PFS_RETURN (ENOTTY);
> +       }
> =20
>         /*
>          * This is necessary because process' privileges may
>          * have changed since the open() call.
>          */
> -       if (!pfs_visible(curthread, pn, pvd->pvd_pid, &proc))
> +       if (!pfs_visible(curthread, pn, pvd->pvd_pid, &proc)) {
> +               VOP_UNLOCK(vn, 0, td);
>                 PFS_RETURN (EIO);
> +       }
> =20
>         error =3D pn_ioctl(curthread, proc, pn, va->a_command, va->a_data=
);
> =20
>         if (proc !=3D NULL)
>                 PROC_UNLOCK(proc);
> =20
> +       VOP_UNLOCK(vn, 0, td);
>         PFS_RETURN (error);
>  }
> =20
> Index: fs/devfs/devfs_vnops.c
> =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
> --- fs/devfs/devfs_vnops.c      (revision 193634)
> +++ fs/devfs/devfs_vnops.c      (working copy)
> @@ -1240,11 +1240,21 @@
>  static int
>  devfs_rioctl(struct vop_ioctl_args *ap)
>  {
> +       struct vnode *vp;
> +       struct devfs_mount *dmp;
> +       struct thread *td;
>         int error;
> -       struct devfs_mount *dmp;
> =20
+       vp =3D ap->>a_vp;
+       td =3D ap->>a_td;
> +       vn_lock(vp, LK_SHARED | LK_RETRY, td);
+       if (vp->>v_iflag & VI_DOOMED) {
> +               VOP_UNLOCK(vp, 0, td);
> +               return (EBADF);
> +       }
>         dmp =3D VFSTODEVFS(ap->a_vp->v_mount);
>         sx_xlock(&dmp->dm_lock);
> +       VOP_UNLOCK(vp, 0, td);
>         DEVFS_DMP_HOLD(dmp);
>         devfs_populate(dmp);
>         if (DEVFS_DMP_DROP(dmp)) {
> @@ -1252,7 +1262,7 @@
>                 devfs_unmount_final(dmp);
>                 return (ENOENT);
>         }
> -       error =3D devfs_rules_ioctl(dmp, ap->a_command, ap->a_data, ap->a=
_td);
> +       error =3D devfs_rules_ioctl(dmp, ap->a_command, ap->a_data, td);
>         sx_xunlock(&dmp->dm_lock);
>         return (error);
>  }
> Index: fs/cd9660/cd9660_vnops.c
> =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
> --- fs/cd9660/cd9660_vnops.c    (revision 193634)
> +++ fs/cd9660/cd9660_vnops.c    (working copy)
> @@ -253,20 +253,37 @@
>                 struct thread *a_td;
>         } */ *ap;
>  {
> -       struct vnode *vp =3D ap->a_vp;
> -       struct iso_node *ip =3D VTOI(vp);
> +       struct vnode *vp;
> +       struct iso_node *ip;
> +       struct thread *td;
> +       int error;
> =20
-       if (vp->>v_type =3D=3D VCHR || vp->v_type =3D=3D VBLK)
> -               return (EOPNOTSUPP);
+       vp =3D ap->>a_vp;
+       td =3D ap->>a_td;
> +       vn_lock(vp, LK_SHARED | LK_RETRY, td);
+       if (vp->>v_iflag & VI_DOOMED) {
> +               error =3D EBADF;
> +               goto out;
> +       }
> +       ip =3D VTOI(vp);
+       if (vp->>v_type =3D=3D VCHR || vp->v_type =3D=3D VBLK) {
> +               error =3D EOPNOTSUPP;
> +               goto out;
> +       }
> =20
> +       error =3D 0;
>         switch (ap->a_command) {
> -
>         case FIOGETLBA:
>                 *(int *)(ap->a_data) =3D ip->iso_start;
> -               return 0;
> +               break;
>         default:
> -               return (ENOTTY);
> +               error =3D ENOTTY;
> +               break;
>         }
> +
> +out:
> +       VOP_UNLOCK(vp, 0, td);
> +       return (error);
>  }
> =20
>  /*



--=20
Regards,
Yura                                  mailto:georg@dts.su





Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?1186509222.20090607192146>