Module Name:    src
Committed By:   hannken
Date:           Fri Jan 27 10:47:13 UTC 2017

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

Log Message:
Handle v_writecount from layer_open(), layer_close() and layer_revoke()
so lower file system vnodes get marked as open for writing.


To generate a diff of this commit:
cvs rdiff -u -r1.36 -r1.37 src/sys/miscfs/genfs/layer_extern.h
cvs rdiff -u -r1.59 -r1.60 src/sys/miscfs/genfs/layer_vnops.c
cvs rdiff -u -r1.39 -r1.40 src/sys/miscfs/nullfs/null_vnops.c
cvs rdiff -u -r1.21 -r1.22 src/sys/miscfs/overlay/overlay_vnops.c
cvs rdiff -u -r1.57 -r1.58 src/sys/miscfs/umapfs/umap_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/genfs/layer_extern.h
diff -u src/sys/miscfs/genfs/layer_extern.h:1.36 src/sys/miscfs/genfs/layer_extern.h:1.37
--- src/sys/miscfs/genfs/layer_extern.h:1.36	Sun May 25 13:51:25 2014
+++ src/sys/miscfs/genfs/layer_extern.h	Fri Jan 27 10:47:13 2017
@@ -1,4 +1,4 @@
-/*	$NetBSD: layer_extern.h,v 1.36 2014/05/25 13:51:25 hannken Exp $	*/
+/*	$NetBSD: layer_extern.h,v 1.37 2017/01/27 10:47:13 hannken Exp $	*/
 
 /*
  * Copyright (c) 1999 National Aeronautics & Space Administration
@@ -106,6 +106,7 @@ int	layer_lookup(void *);
 int	layer_setattr(void *);
 int	layer_access(void *);
 int	layer_open(void *);
+int	layer_close(void *);
 int	layer_remove(void *);
 int	layer_rename(void *);
 int	layer_revoke(void *);

Index: src/sys/miscfs/genfs/layer_vnops.c
diff -u src/sys/miscfs/genfs/layer_vnops.c:1.59 src/sys/miscfs/genfs/layer_vnops.c:1.60
--- src/sys/miscfs/genfs/layer_vnops.c:1.59	Sat Aug 20 12:37:09 2016
+++ src/sys/miscfs/genfs/layer_vnops.c	Fri Jan 27 10:47:13 2017
@@ -1,4 +1,4 @@
-/*	$NetBSD: layer_vnops.c,v 1.59 2016/08/20 12:37:09 hannken Exp $	*/
+/*	$NetBSD: layer_vnops.c,v 1.60 2017/01/27 10:47:13 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.59 2016/08/20 12:37:09 hannken Exp $");
+__KERNEL_RCSID(0, "$NetBSD: layer_vnops.c,v 1.60 2017/01/27 10:47:13 hannken Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -182,6 +182,7 @@ __KERNEL_RCSID(0, "$NetBSD: layer_vnops.
 #include <sys/kmem.h>
 #include <sys/buf.h>
 #include <sys/kauth.h>
+#include <sys/fcntl.h>
 
 #include <miscfs/genfs/layer.h>
 #include <miscfs/genfs/layer_extern.h>
@@ -491,7 +492,8 @@ layer_access(void *v)
 }
 
 /*
- * We must handle open to be able to catch MNT_NODEV and friends.
+ * We must handle open to be able to catch MNT_NODEV and friends
+ * and increment the lower v_writecount.
  */
 int
 layer_open(void *v)
@@ -503,12 +505,43 @@ layer_open(void *v)
 		kauth_cred_t a_cred;
 	} */ *ap = v;
 	struct vnode *vp = ap->a_vp;
-	enum vtype lower_type = LAYERVPTOLOWERVP(vp)->v_type;
+	struct vnode *lvp = LAYERVPTOLOWERVP(vp);
+	int error;
 
-	if (((lower_type == VBLK) || (lower_type == VCHR)) &&
+	if (((lvp->v_type == VBLK) || (lvp->v_type == VCHR)) &&
 	    (vp->v_mount->mnt_flag & MNT_NODEV))
 		return ENXIO;
 
+	error = LAYERFS_DO_BYPASS(vp, ap);
+	if (error == 0 && (ap->a_mode & FWRITE)) {
+		mutex_enter(lvp->v_interlock);
+		lvp->v_writecount++;
+		mutex_exit(lvp->v_interlock);
+	}
+	return error;
+}
+
+/*
+ * We must handle close to decrement the lower v_writecount.
+ */
+int
+layer_close(void *v)
+{
+	struct vop_close_args /* {
+		const struct vnodeop_desc *a_desc;
+		struct vnode *a_vp;
+		int a_fflag;
+		kauth_cred_t a_cred;
+	} */ *ap = v;
+	struct vnode *vp = ap->a_vp;
+	struct vnode *lvp = LAYERVPTOLOWERVP(vp);
+
+	if ((ap->a_fflag & FWRITE)) {
+		mutex_enter(lvp->v_interlock);
+		KASSERT(lvp->v_writecount > 0);
+		lvp->v_writecount--;
+		mutex_exit(lvp->v_interlock);
+	}
 	return LAYERFS_DO_BYPASS(vp, ap);
 }
 
@@ -660,8 +693,15 @@ layer_revoke(void *v)
 	 * We will most likely end up in vclean which uses the v_usecount
 	 * to determine if a vnode is active.  Take an extra reference on
 	 * the lower vnode so it will always close and inactivate.
+	 * Remove our writecount from the lower vnode.
 	 */
 	vref(lvp);
+
+	mutex_enter(vp->v_interlock);
+	KASSERT(vp->v_interlock == lvp->v_interlock);
+	lvp->v_writecount -= vp->v_writecount;
+	mutex_exit(vp->v_interlock);
+
 	error = LAYERFS_DO_BYPASS(vp, ap);
 	vrele(lvp);
 

Index: src/sys/miscfs/nullfs/null_vnops.c
diff -u src/sys/miscfs/nullfs/null_vnops.c:1.39 src/sys/miscfs/nullfs/null_vnops.c:1.40
--- src/sys/miscfs/nullfs/null_vnops.c:1.39	Thu Feb 27 16:51:38 2014
+++ src/sys/miscfs/nullfs/null_vnops.c	Fri Jan 27 10:47:13 2017
@@ -1,4 +1,4 @@
-/*	$NetBSD: null_vnops.c,v 1.39 2014/02/27 16:51:38 hannken Exp $	*/
+/*	$NetBSD: null_vnops.c,v 1.40 2017/01/27 10:47:13 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.39 2014/02/27 16:51:38 hannken Exp $");
+__KERNEL_RCSID(0, "$NetBSD: null_vnops.c,v 1.40 2017/01/27 10:47:13 hannken Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -114,6 +114,7 @@ const struct vnodeopv_entry_desc null_vn
 	{ &vop_rmdir_desc,	layer_rmdir },
 
 	{ &vop_open_desc,	layer_open },	/* mount option handling */
+	{ &vop_close_desc,	layer_close },
 
 	{ &vop_bmap_desc,	layer_bmap },
 	{ &vop_getpages_desc,	layer_getpages },

Index: src/sys/miscfs/overlay/overlay_vnops.c
diff -u src/sys/miscfs/overlay/overlay_vnops.c:1.21 src/sys/miscfs/overlay/overlay_vnops.c:1.22
--- src/sys/miscfs/overlay/overlay_vnops.c:1.21	Mon Nov 10 18:46:33 2014
+++ src/sys/miscfs/overlay/overlay_vnops.c	Fri Jan 27 10:47:13 2017
@@ -1,4 +1,4 @@
-/*	$NetBSD: overlay_vnops.c,v 1.21 2014/11/10 18:46:33 maxv Exp $	*/
+/*	$NetBSD: overlay_vnops.c,v 1.22 2017/01/27 10:47:13 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.21 2014/11/10 18:46:33 maxv Exp $
+ *	$Id: overlay_vnops.c,v 1.22 2017/01/27 10:47:13 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.21 2014/11/10 18:46:33 maxv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: overlay_vnops.c,v 1.22 2017/01/27 10:47:13 hannken Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -162,6 +162,7 @@ const struct vnodeopv_entry_desc overlay
 	{ &vop_rmdir_desc,    layer_rmdir },
 
 	{ &vop_open_desc,     layer_open },	/* mount option handling */
+	{ &vop_close_desc,    layer_close },
 
 	{ &vop_bmap_desc,     layer_bmap },
 	{ &vop_getpages_desc, layer_getpages },

Index: src/sys/miscfs/umapfs/umap_vnops.c
diff -u src/sys/miscfs/umapfs/umap_vnops.c:1.57 src/sys/miscfs/umapfs/umap_vnops.c:1.58
--- src/sys/miscfs/umapfs/umap_vnops.c:1.57	Sun Nov  9 18:08:07 2014
+++ src/sys/miscfs/umapfs/umap_vnops.c	Fri Jan 27 10:47:13 2017
@@ -1,4 +1,4 @@
-/*	$NetBSD: umap_vnops.c,v 1.57 2014/11/09 18:08:07 maxv Exp $	*/
+/*	$NetBSD: umap_vnops.c,v 1.58 2017/01/27 10:47:13 hannken Exp $	*/
 
 /*
  * Copyright (c) 1992, 1993
@@ -39,7 +39,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: umap_vnops.c,v 1.57 2014/11/09 18:08:07 maxv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: umap_vnops.c,v 1.58 2017/01/27 10:47:13 hannken Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -90,6 +90,7 @@ const struct vnodeopv_entry_desc umap_vn
 	{ &vop_reclaim_desc,	layer_reclaim },
 	{ &vop_lock_desc,	layer_lock },
 	{ &vop_open_desc,	layer_open },
+	{ &vop_close_desc,	layer_close },
 	{ &vop_setattr_desc,	layer_setattr },
 	{ &vop_access_desc,	layer_access },
 	{ &vop_remove_desc,	layer_remove },

Reply via email to