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);
 }

Reply via email to