Module Name:    src
Committed By:   hannken
Date:           Mon Jan 10 11:11:04 UTC 2011

Modified Files:
        src/sys/miscfs/genfs: layer_extern.h layer_vnops.c
        src/sys/miscfs/nullfs: null_vnops.c
        src/sys/miscfs/overlay: overlay_vnops.c
        src/sys/miscfs/umapfs: umap_vnops.c
        src/tests/fs/ptyfs: t_nullpts.c

Log Message:
Add layer_revoke() that adjusts the lower vnode use count to be at least as
high as the upper vnode count before passing down the VOP_REVOKE().

This way vclean() check for active (vp->v_usecount > 1) vnodes gets it right.

Should fix PR kern/43456.


To generate a diff of this commit:
cvs rdiff -u -r1.26 -r1.27 src/sys/miscfs/genfs/layer_extern.h
cvs rdiff -u -r1.44 -r1.45 src/sys/miscfs/genfs/layer_vnops.c
cvs rdiff -u -r1.36 -r1.37 src/sys/miscfs/nullfs/null_vnops.c
cvs rdiff -u -r1.17 -r1.18 src/sys/miscfs/overlay/overlay_vnops.c
cvs rdiff -u -r1.50 -r1.51 src/sys/miscfs/umapfs/umap_vnops.c
cvs rdiff -u -r1.4 -r1.5 src/tests/fs/ptyfs/t_nullpts.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/genfs/layer_extern.h
diff -u src/sys/miscfs/genfs/layer_extern.h:1.26 src/sys/miscfs/genfs/layer_extern.h:1.27
--- src/sys/miscfs/genfs/layer_extern.h:1.26	Fri Jul  2 08:09:51 2010
+++ src/sys/miscfs/genfs/layer_extern.h	Mon Jan 10 11:11:03 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: layer_extern.h,v 1.26 2010/07/02 08:09:51 hannken Exp $	*/
+/*	$NetBSD: layer_extern.h,v 1.27 2011/01/10 11:11:03 hannken Exp $	*/
 
 /*
  * Copyright (c) 1999 National Aeronautics & Space Administration
@@ -113,6 +113,7 @@
 int	layer_open(void *);
 int	layer_remove(void *);
 int	layer_rename(void *);
+int	layer_revoke(void *);
 int	layer_rmdir(void *);
 int	layer_getpages(void *);
 int	layer_putpages(void *);

Index: src/sys/miscfs/genfs/layer_vnops.c
diff -u src/sys/miscfs/genfs/layer_vnops.c:1.44 src/sys/miscfs/genfs/layer_vnops.c:1.45
--- src/sys/miscfs/genfs/layer_vnops.c:1.44	Sun Jan  2 10:38:02 2011
+++ src/sys/miscfs/genfs/layer_vnops.c	Mon Jan 10 11:11:03 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: layer_vnops.c,v 1.44 2011/01/02 10:38:02 hannken Exp $	*/
+/*	$NetBSD: layer_vnops.c,v 1.45 2011/01/10 11:11:03 hannken Exp $	*/
 
 /*
  * Copyright (c) 1999 National Aeronautics & Space Administration
@@ -170,7 +170,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: layer_vnops.c,v 1.44 2011/01/02 10:38:02 hannken Exp $");
+__KERNEL_RCSID(0, "$NetBSD: layer_vnops.c,v 1.45 2011/01/10 11:11:03 hannken Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -650,6 +650,32 @@
 }
 
 int
+layer_revoke(void *v)
+{
+        struct vop_revoke_args /* {
+		struct vnode *a_vp;
+		int a_flags;
+	} */ *ap = v;
+	struct vnode *vp = ap->a_vp;
+	struct vnode *lvp = LAYERVPTOLOWERVP(vp);
+	int i, n, error;
+
+	/*
+	 * We will most likely end up in vclean which uses the v_usecount
+	 * to determine if a vnode is active.  So we have to adjust the
+	 * lower vp's usecount to be at least as high as our usecount.
+	 */
+	n = vp->v_usecount - lvp->v_usecount;
+	for (i = 0; i < n; i++)
+		vref(lvp);
+	error = LAYERFS_DO_BYPASS(vp, ap);
+	for (i = 0; i < n; i++)
+		vrele(lvp);
+
+	return error;
+}
+
+int
 layer_reclaim(void *v)
 {
 	struct vop_reclaim_args /* {

Index: src/sys/miscfs/nullfs/null_vnops.c
diff -u src/sys/miscfs/nullfs/null_vnops.c:1.36 src/sys/miscfs/nullfs/null_vnops.c:1.37
--- src/sys/miscfs/nullfs/null_vnops.c:1.36	Fri Jul  2 08:09:51 2010
+++ src/sys/miscfs/nullfs/null_vnops.c	Mon Jan 10 11:11:03 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: null_vnops.c,v 1.36 2010/07/02 08:09:51 hannken Exp $	*/
+/*	$NetBSD: null_vnops.c,v 1.37 2011/01/10 11:11:03 hannken Exp $	*/
 
 /*
  * Copyright (c) 1999 National Aeronautics & Space Administration
@@ -80,7 +80,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: null_vnops.c,v 1.36 2010/07/02 08:09:51 hannken Exp $");
+__KERNEL_RCSID(0, "$NetBSD: null_vnops.c,v 1.37 2011/01/10 11:11:03 hannken Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -109,6 +109,7 @@
 	{ &vop_print_desc,	layer_print },
 	{ &vop_remove_desc,	layer_remove },
 	{ &vop_rename_desc,	layer_rename },
+	{ &vop_revoke_desc,	layer_revoke },
 	{ &vop_rmdir_desc,	layer_rmdir },
 
 	{ &vop_open_desc,	layer_open },	/* mount option handling */

Index: src/sys/miscfs/overlay/overlay_vnops.c
diff -u src/sys/miscfs/overlay/overlay_vnops.c:1.17 src/sys/miscfs/overlay/overlay_vnops.c:1.18
--- src/sys/miscfs/overlay/overlay_vnops.c:1.17	Fri Jul  2 08:09:51 2010
+++ src/sys/miscfs/overlay/overlay_vnops.c	Mon Jan 10 11:11:03 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: overlay_vnops.c,v 1.17 2010/07/02 08:09:51 hannken Exp $	*/
+/*	$NetBSD: overlay_vnops.c,v 1.18 2011/01/10 11:11:03 hannken Exp $	*/
 
 /*
  * Copyright (c) 1999, 2000 National Aeronautics & Space Administration
@@ -67,7 +67,7 @@
  *
  * Ancestors:
  *	@(#)lofs_vnops.c	1.2 (Berkeley) 6/18/92
- *	$Id: overlay_vnops.c,v 1.17 2010/07/02 08:09:51 hannken Exp $
+ *	$Id: overlay_vnops.c,v 1.18 2011/01/10 11:11:03 hannken Exp $
  *	...and...
  *	@(#)null_vnodeops.c 1.20 92/07/07 UCLA Ficus project
  */
@@ -126,7 +126,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: overlay_vnops.c,v 1.17 2010/07/02 08:09:51 hannken Exp $");
+__KERNEL_RCSID(0, "$NetBSD: overlay_vnops.c,v 1.18 2011/01/10 11:11:03 hannken Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -158,6 +158,7 @@
 	{ &vop_print_desc,    layer_print },
 	{ &vop_remove_desc,   layer_remove },
 	{ &vop_rename_desc,   layer_rename },
+	{ &vop_revoke_desc,   layer_revoke },
 	{ &vop_rmdir_desc,    layer_rmdir },
 
 	{ &vop_open_desc,     layer_open },	/* mount option handling */

Index: src/sys/miscfs/umapfs/umap_vnops.c
diff -u src/sys/miscfs/umapfs/umap_vnops.c:1.50 src/sys/miscfs/umapfs/umap_vnops.c:1.51
--- src/sys/miscfs/umapfs/umap_vnops.c:1.50	Fri Jul  2 08:09:51 2010
+++ src/sys/miscfs/umapfs/umap_vnops.c	Mon Jan 10 11:11:04 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: umap_vnops.c,v 1.50 2010/07/02 08:09:51 hannken Exp $	*/
+/*	$NetBSD: umap_vnops.c,v 1.51 2011/01/10 11:11:04 hannken Exp $	*/
 
 /*
  * Copyright (c) 1992, 1993
@@ -39,7 +39,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: umap_vnops.c,v 1.50 2010/07/02 08:09:51 hannken Exp $");
+__KERNEL_RCSID(0, "$NetBSD: umap_vnops.c,v 1.51 2011/01/10 11:11:04 hannken Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -93,6 +93,7 @@
 	{ &vop_setattr_desc,	layer_setattr },
 	{ &vop_access_desc,	layer_access },
 	{ &vop_remove_desc,	layer_remove },
+	{ &vop_revoke_desc,	layer_revoke },
 	{ &vop_rmdir_desc,	layer_rmdir },
 
 	{ &vop_bwrite_desc,	layer_bwrite },

Index: src/tests/fs/ptyfs/t_nullpts.c
diff -u src/tests/fs/ptyfs/t_nullpts.c:1.4 src/tests/fs/ptyfs/t_nullpts.c:1.5
--- src/tests/fs/ptyfs/t_nullpts.c:1.4	Sat Jul  3 08:18:30 2010
+++ src/tests/fs/ptyfs/t_nullpts.c	Mon Jan 10 11:11:04 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: t_nullpts.c,v 1.4 2010/07/03 08:18:30 jmmv Exp $	*/
+/*	$NetBSD: t_nullpts.c,v 1.5 2011/01/10 11:11:04 hannken Exp $	*/
 
 #include <sys/types.h>
 #include <sys/mount.h>
@@ -113,11 +113,10 @@
 	 */
 	rump_sys_close(ptg.sfd);
 
-	/* revoke slave tty.  boom */
-	atf_tc_expect_signal(-1, "PR kern/43456");
+	/* revoke slave tty. */
 	rump_sys_revoke(path);
 
-	/* done? */
+	/* done */
 }
 
 ATF_TP_ADD_TCS(tp)

Reply via email to