Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src Add layer_revoke() that adjusts the lower vnode use count to...



details:   https://anonhg.NetBSD.org/src/rev/8edd30baddb5
branches:  trunk
changeset: 760651:8edd30baddb5
user:      hannken <hannken%NetBSD.org@localhost>
date:      Mon Jan 10 11:11:03 2011 +0000

description:
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.

diffstat:

 sys/miscfs/genfs/layer_extern.h    |   3 ++-
 sys/miscfs/genfs/layer_vnops.c     |  30 ++++++++++++++++++++++++++++--
 sys/miscfs/nullfs/null_vnops.c     |   5 +++--
 sys/miscfs/overlay/overlay_vnops.c |   7 ++++---
 sys/miscfs/umapfs/umap_vnops.c     |   5 +++--
 tests/fs/ptyfs/t_nullpts.c         |   7 +++----
 6 files changed, 43 insertions(+), 14 deletions(-)

diffs (178 lines):

diff -r 32b7aa4b985b -r 8edd30baddb5 sys/miscfs/genfs/layer_extern.h
--- a/sys/miscfs/genfs/layer_extern.h   Mon Jan 10 09:07:27 2011 +0000
+++ b/sys/miscfs/genfs/layer_extern.h   Mon Jan 10 11:11:03 2011 +0000
@@ -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 *);
diff -r 32b7aa4b985b -r 8edd30baddb5 sys/miscfs/genfs/layer_vnops.c
--- a/sys/miscfs/genfs/layer_vnops.c    Mon Jan 10 09:07:27 2011 +0000
+++ b/sys/miscfs/genfs/layer_vnops.c    Mon Jan 10 11:11:03 2011 +0000
@@ -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 /* {
diff -r 32b7aa4b985b -r 8edd30baddb5 sys/miscfs/nullfs/null_vnops.c
--- a/sys/miscfs/nullfs/null_vnops.c    Mon Jan 10 09:07:27 2011 +0000
+++ b/sys/miscfs/nullfs/null_vnops.c    Mon Jan 10 11:11:03 2011 +0000
@@ -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 */
diff -r 32b7aa4b985b -r 8edd30baddb5 sys/miscfs/overlay/overlay_vnops.c
--- a/sys/miscfs/overlay/overlay_vnops.c        Mon Jan 10 09:07:27 2011 +0000
+++ b/sys/miscfs/overlay/overlay_vnops.c        Mon Jan 10 11:11:03 2011 +0000
@@ -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 */
diff -r 32b7aa4b985b -r 8edd30baddb5 sys/miscfs/umapfs/umap_vnops.c
--- a/sys/miscfs/umapfs/umap_vnops.c    Mon Jan 10 09:07:27 2011 +0000
+++ b/sys/miscfs/umapfs/umap_vnops.c    Mon Jan 10 11:11:03 2011 +0000
@@ -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 },
diff -r 32b7aa4b985b -r 8edd30baddb5 tests/fs/ptyfs/t_nullpts.c
--- a/tests/fs/ptyfs/t_nullpts.c        Mon Jan 10 09:07:27 2011 +0000
+++ b/tests/fs/ptyfs/t_nullpts.c        Mon Jan 10 11:11:03 2011 +0000
@@ -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)



Home | Main Index | Thread Index | Old Index