Module Name: src Committed By: hannken Date: Thu Nov 7 09:45:53 UTC 2013
Modified Files: src/sys/miscfs/deadfs: dead_vnops.c Log Message: Add missing operations that unlock or dereference their arguments. Stop checking for a vnode state change -- dead vnodes never change state. To generate a diff of this commit: cvs rdiff -u -r1.51 -r1.52 src/sys/miscfs/deadfs/dead_vnops.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/miscfs/deadfs/dead_vnops.c diff -u src/sys/miscfs/deadfs/dead_vnops.c:1.51 src/sys/miscfs/deadfs/dead_vnops.c:1.52 --- src/sys/miscfs/deadfs/dead_vnops.c:1.51 Sun Jun 12 03:35:57 2011 +++ src/sys/miscfs/deadfs/dead_vnops.c Thu Nov 7 09:45:53 2013 @@ -1,4 +1,4 @@ -/* $NetBSD: dead_vnops.c,v 1.51 2011/06/12 03:35:57 rmind Exp $ */ +/* $NetBSD: dead_vnops.c,v 1.52 2013/11/07 09:45:53 hannken Exp $ */ /* * Copyright (c) 1989, 1993 @@ -32,7 +32,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: dead_vnops.c,v 1.51 2011/06/12 03:35:57 rmind Exp $"); +__KERNEL_RCSID(0, "$NetBSD: dead_vnops.c,v 1.52 2013/11/07 09:45:53 hannken Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -48,6 +48,10 @@ __KERNEL_RCSID(0, "$NetBSD: dead_vnops.c /* * Prototypes for dead operations on vnodes. */ +#define dead_bwrite genfs_nullop +int dead_lookup(void *); +int dead_create(void *); +int dead_mknod(void *); int dead_open(void *); #define dead_close genfs_nullop int dead_read(void *); @@ -55,28 +59,36 @@ int dead_write(void *); #define dead_fcntl genfs_nullop int dead_ioctl(void *); int dead_poll(void *); +int dead_remove(void *); +int dead_link(void *); +int dead_rename(void *); +int dead_mkdir(void *); +int dead_rmdir(void *); +int dead_symlink(void *); #define dead_fsync genfs_nullop #define dead_seek genfs_nullop -#define dead_inactive genfs_nullop +int dead_inactive(void *); #define dead_reclaim genfs_nullop -int dead_lock(void *); +#define dead_lock genfs_lock #define dead_unlock genfs_unlock int dead_bmap(void *); int dead_strategy(void *); int dead_print(void *); #define dead_islocked genfs_islocked -#define dead_bwrite genfs_nullop #define dead_revoke genfs_nullop int dead_getpages(void *); -#define dead_putpages genfs_null_putpages +int dead_putpages(void *); -int chkvnlock(struct vnode *); int dead_default_error(void *); int (**dead_vnodeop_p)(void *); const struct vnodeopv_entry_desc dead_vnodeop_entries[] = { { &vop_default_desc, dead_default_error }, + { &vop_bwrite_desc, dead_bwrite }, /* bwrite */ + { &vop_lookup_desc, dead_lookup }, /* lookup */ + { &vop_create_desc, dead_create }, /* create */ + { &vop_mknod_desc, dead_mknod }, /* mknod */ { &vop_open_desc, dead_open }, /* open */ { &vop_close_desc, dead_close }, /* close */ { &vop_read_desc, dead_read }, /* read */ @@ -84,7 +96,12 @@ const struct vnodeopv_entry_desc dead_vn { &vop_fcntl_desc, dead_fcntl }, /* fcntl */ { &vop_ioctl_desc, dead_ioctl }, /* ioctl */ { &vop_poll_desc, dead_poll }, /* poll */ - { &vop_revoke_desc, dead_revoke }, /* revoke */ + { &vop_remove_desc, dead_remove }, /* remove */ + { &vop_link_desc, dead_link }, /* link */ + { &vop_rename_desc, dead_rename }, /* rename */ + { &vop_mkdir_desc, dead_mkdir }, /* mkdir */ + { &vop_rmdir_desc, dead_rmdir }, /* rmdir */ + { &vop_symlink_desc, dead_symlink }, /* symlink */ { &vop_fsync_desc, dead_fsync }, /* fsync */ { &vop_seek_desc, dead_seek }, /* seek */ { &vop_inactive_desc, dead_inactive }, /* inactive */ @@ -95,7 +112,7 @@ const struct vnodeopv_entry_desc dead_vn { &vop_strategy_desc, dead_strategy }, /* strategy */ { &vop_print_desc, dead_print }, /* print */ { &vop_islocked_desc, dead_islocked }, /* islocked */ - { &vop_bwrite_desc, dead_bwrite }, /* bwrite */ + { &vop_revoke_desc, dead_revoke }, /* revoke */ { &vop_getpages_desc, dead_getpages }, /* getpages */ { &vop_putpages_desc, dead_putpages }, /* putpages */ { NULL, NULL } @@ -103,6 +120,7 @@ const struct vnodeopv_entry_desc dead_vn const struct vnodeopv_desc dead_vnodeop_opv_desc = { &dead_vnodeop_p, dead_vnodeop_entries }; +/* ARGSUSED */ int dead_default_error(void *v) { @@ -110,21 +128,78 @@ dead_default_error(void *v) return EBADF; } -/* - * Open always fails as if device did not exist. - */ +/* ARGSUSED */ +int +dead_bmap(void *v) +{ + /* struct vop_bmap_args { + struct vnode *a_vp; + daddr_t a_bn; + struct vnode **a_vpp; + daddr_t *a_bnp; + int *a_runp; + } *ap = v; */ + + return (EIO); +} + +int +dead_lookup(void *v) +{ + struct vop_lookup_args /* { + struct vnode *a_dvp; + struct vnode **a_vpp; + struct componentname *a_cnp; + } */ *ap = v; + + *(ap->a_vpp) = NULL; + + return EIO; +} + +int +dead_create(void *v) +{ + struct vop_create_args /* { + struct vnode *a_dvp; + struct vnode **a_vpp; + struct componentname *a_cnp; + struct vattr *a_vap; + } */ *ap = v; + + vput(ap->a_dvp); + + return EIO; +} + +int +dead_mknod(void *v) +{ + struct vop_mknod_args /* { + struct vnode *a_dvp; + struct vnode **a_vpp; + struct componentname *a_cnp; + struct vattr *a_vap; + } */ *ap = v; + + vput(ap->a_dvp); + + return EIO; +} + /* ARGSUSED */ int dead_open(void *v) { + /* struct vop_open_args { + struct vnode *a_vp; + int a_mode; + kauth_cred_t a_cred; + } *ap = v; */ return (ENXIO); } -/* - * Vnode op for read - */ -/* ARGSUSED */ int dead_read(void *v) { @@ -135,8 +210,6 @@ dead_read(void *v) kauth_cred_t a_cred; } */ *ap = v; - if (chkvnlock(ap->a_vp)) - panic("dead_read: lock"); /* * Return EOF for tty devices, EIO for others */ @@ -145,47 +218,36 @@ dead_read(void *v) return (0); } -/* - * Vnode op for write - */ /* ARGSUSED */ int dead_write(void *v) { - struct vop_write_args /* { + /* struct vop_write_args { struct vnode *a_vp; struct uio *a_uio; int a_ioflag; kauth_cred_t a_cred; - } */ *ap = v; + } *ap = v; */ - if (chkvnlock(ap->a_vp)) - panic("dead_write: lock"); return (EIO); } -/* - * Device ioctl operation. - */ /* ARGSUSED */ int dead_ioctl(void *v) { - struct vop_ioctl_args /* { + /* struct vop_ioctl_args { struct vnode *a_vp; u_long a_command; void *a_data; int a_fflag; kauth_cred_t a_cred; struct lwp *a_l; - } */ *ap = v; + } *ap = v; */ - if (!chkvnlock(ap->a_vp)) - return (EBADF); - return (VCALL(ap->a_vp, VOFFSET(vop_ioctl), ap)); + return (EBADF); } -/* ARGSUSED */ int dead_poll(void *v) { @@ -201,68 +263,134 @@ dead_poll(void *v) return (ap->a_events); } -/* - * Just call the device strategy routine - */ int -dead_strategy(void *v) +dead_remove(void *v) { - - struct vop_strategy_args /* { + struct vop_remove_args /* { + struct vnode *a_dvp; struct vnode *a_vp; - struct buf *a_bp; + struct componentname *a_cnp; } */ *ap = v; - struct buf *bp; - if (ap->a_vp == NULL || !chkvnlock(ap->a_vp)) { - bp = ap->a_bp; - bp->b_error = EIO; - bp->b_resid = bp->b_bcount; - biodone(ap->a_bp); - return (EIO); - } - return (VOP_STRATEGY(ap->a_vp, ap->a_bp)); + + vput(ap->a_dvp); + vput(ap->a_vp); + + return EIO; } -/* - * Wait until the vnode has finished changing state. - */ int -dead_lock(void *v) +dead_link(void *v) { - struct vop_lock_args /* { + struct vop_link_args /* { + struct vnode *a_dvp; struct vnode *a_vp; - int a_flags; - struct proc *a_p; + struct componentname *a_cnp; } */ *ap = v; - if (!chkvnlock(ap->a_vp)) { - return genfs_lock(v); - } - return (VCALL(ap->a_vp, VOFFSET(vop_lock), ap)); + vput(ap->a_dvp); + + return EIO; } -/* - * Wait until the vnode has finished changing state. - */ int -dead_bmap(void *v) +dead_rename(void *v) { - struct vop_bmap_args /* { + struct vop_rename_args /* { + struct vnode *a_fdvp; + struct vnode *a_fvp; + struct componentname *a_fcnp; + struct vnode *a_tdvp; + struct vnode *a_tvp; + struct componentname *a_tcnp; + } */ *ap = v; + + vrele(ap->a_fdvp); + vrele(ap->a_fvp); + if (ap->a_tvp != NULL && ap->a_tvp != ap->a_tdvp) + VOP_UNLOCK(ap->a_tvp); + vput(ap->a_tdvp); + if (ap->a_tvp != NULL) + vrele(ap->a_tvp); + + return EIO; +} + +int +dead_mkdir(void *v) +{ + struct vop_mkdir_args /* { + struct vnode *a_dvp; + struct vnode **a_vpp; + struct componentname *a_cnp; + struct vattr *a_vap; + } */ *ap = v; + + vput(ap->a_dvp); + + return EIO; +} + +int +dead_rmdir(void *v) +{ + struct vop_rmdir_args /* { + struct vnode *a_dvp; struct vnode *a_vp; - daddr_t a_bn; + struct componentname *a_cnp; + } */ *ap = v; + + vput(ap->a_dvp); + vput(ap->a_vp); + + return EIO; +} + +int +dead_symlink(void *v) +{ + struct vop_symlink_args /* { + struct vnode *a_dvp; struct vnode **a_vpp; - daddr_t *a_bnp; - int *a_runp; + struct componentname *a_cnp; + struct vattr *a_vap; + char *a_target; } */ *ap = v; - if (!chkvnlock(ap->a_vp)) - return (EIO); - return (VOP_BMAP(ap->a_vp, ap->a_bn, ap->a_vpp, ap->a_bnp, ap->a_runp)); + vput(ap->a_dvp); + + return EIO; +} + +int +dead_inactive(void *v) +{ + struct vop_inactive_args /* { + struct vnode *a_vp; + bool *a_recycle; + } */ *ap = v; + + *ap->a_recycle = false; + VOP_UNLOCK(ap->a_vp); + + return 0; +} + +int +dead_strategy(void *v) +{ + struct vop_strategy_args /* { + struct vnode *a_vp; + struct buf *a_bp; + } */ *ap = v; + struct buf *bp; + + bp = ap->a_bp; + bp->b_error = EIO; + bp->b_resid = bp->b_bcount; + biodone(ap->a_bp); + return (EIO); } -/* - * Print out the contents of a dead vnode. - */ /* ARGSUSED */ int dead_print(void *v) @@ -291,21 +419,16 @@ dead_getpages(void *v) return (EFAULT); } -/* - * We have to wait during times when the vnode is - * in a state of change. - */ int -chkvnlock(struct vnode *vp) +dead_putpages(void *v) { - int locked = 0; - - mutex_enter(vp->v_interlock); - while (vp->v_iflag & VI_XLOCK) { - vwait(vp, VI_XLOCK); - locked = 1; - } - mutex_exit(vp->v_interlock); + struct vop_putpages_args /* { + struct vnode *a_vp; + voff_t a_offlo; + voff_t a_offhi; + int a_flags; + } */ *ap = v; - return (locked); + mutex_exit(ap->a_vp->v_interlock); + return (EFAULT); }