fatal trap 12
georg at dts.su
georg at dts.su
Sun Jun 7 15:21:51 UTC 2009
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 uninitialized in this function
/usr/src/sys/fs/pseudofs/pseudofs_vnops.c:295: warning: 'pvd' is used uninitialized 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 at dts.su wrote:
>> Hello.
>>
>> 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 use 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 in.)
>> /usr/src/sys/kern/vfs_vnops.c:769: error: too few arguments to function 'VOP_UNLOCK'
>> *** Error code 1
>>
> 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
> ===================================================================
> --- 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 = va->a_vp;
> - struct pfs_vdata *pvd = vn->v_data;
> - struct pfs_node *pn = pvd->pvd_pn;
> + struct vnode *vn;
> + struct pfs_vdata *pvd;
> + struct pfs_node *pn;
> struct proc *proc;
> + struct thread *td;
> int error;
>
+ vn = va->>a_vp;
> + td = curthread;
> + vn_lock(vn, LK_SHARED | LK_RETRY, td);
+ if (vn->>v_iflag & VI_DOOMED) {
> + VOP_UNLOCK(vn, 0, td);
> + return (EBADF);
> + }
+ pvd = vn->>v_data;
+ pn = pvd->>pvd_pn;
> PFS_TRACE(("%s: %lx", pn->pn_name, va->a_command));
> pfs_assert_not_owned(pn);
>
- if (vn->>v_type != VREG)
+ if (vn->>v_type != VREG) {
> + VOP_UNLOCK(vn, 0, td);
> PFS_RETURN (EINVAL);
> + }
> KASSERT_PN_IS_FILE(pn);
>
- if (pn->>pn_ioctl == NULL)
+ if (pn->>pn_ioctl == NULL) {
> + VOP_UNLOCK(vn, 0, td);
> PFS_RETURN (ENOTTY);
> + }
>
> /*
> * 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);
> + }
>
> error = pn_ioctl(curthread, proc, pn, va->a_command, va->a_data);
>
> if (proc != NULL)
> PROC_UNLOCK(proc);
>
> + VOP_UNLOCK(vn, 0, td);
> PFS_RETURN (error);
> }
>
> Index: fs/devfs/devfs_vnops.c
> ===================================================================
> --- 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;
>
+ vp = ap->>a_vp;
+ td = 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 = 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 = devfs_rules_ioctl(dmp, ap->a_command, ap->a_data, ap->a_td);
> + error = devfs_rules_ioctl(dmp, ap->a_command, ap->a_data, td);
> sx_xunlock(&dmp->dm_lock);
> return (error);
> }
> Index: fs/cd9660/cd9660_vnops.c
> ===================================================================
> --- 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 = ap->a_vp;
> - struct iso_node *ip = VTOI(vp);
> + struct vnode *vp;
> + struct iso_node *ip;
> + struct thread *td;
> + int error;
>
- if (vp->>v_type == VCHR || vp->v_type == VBLK)
> - return (EOPNOTSUPP);
+ vp = ap->>a_vp;
+ td = ap->>a_td;
> + vn_lock(vp, LK_SHARED | LK_RETRY, td);
+ if (vp->>v_iflag & VI_DOOMED) {
> + error = EBADF;
> + goto out;
> + }
> + ip = VTOI(vp);
+ if (vp->>v_type == VCHR || vp->v_type == VBLK) {
> + error = EOPNOTSUPP;
> + goto out;
> + }
>
> + error = 0;
> switch (ap->a_command) {
> -
> case FIOGETLBA:
> *(int *)(ap->a_data) = ip->iso_start;
> - return 0;
> + break;
> default:
> - return (ENOTTY);
> + error = ENOTTY;
> + break;
> }
> +
> +out:
> + VOP_UNLOCK(vp, 0, td);
> + return (error);
> }
>
> /*
--
Regards,
Yura mailto:georg at dts.su
More information about the freebsd-fs
mailing list