Module Name:    src
Committed By:   rmind
Date:           Mon May 30 14:57:49 UTC 2011

Modified Files:
        src/sys/fs/tmpfs [rmind-uvmplock]: tmpfs_subr.c
        src/sys/fs/union [rmind-uvmplock]: union_subr.c
        src/sys/fs/unionfs [rmind-uvmplock]: unionfs_subr.c
        src/sys/kern [rmind-uvmplock]: vfs_vnode.c
        src/sys/miscfs/genfs [rmind-uvmplock]: layer_subr.c
        src/sys/sys [rmind-uvmplock]: vnode.h

Log Message:
- Amend getnewvnode(9) to take the lock for sharing, not a vnode.
- Update tmpfs to perform vnode and UVM object lock sharing correctly.


To generate a diff of this commit:
cvs rdiff -u -r1.56.4.6 -r1.56.4.7 src/sys/fs/tmpfs/tmpfs_subr.c
cvs rdiff -u -r1.35.4.4 -r1.35.4.5 src/sys/fs/union/union_subr.c
cvs rdiff -u -r1.5.4.5 -r1.5.4.6 src/sys/fs/unionfs/unionfs_subr.c
cvs rdiff -u -r1.5.2.4 -r1.5.2.5 src/sys/kern/vfs_vnode.c
cvs rdiff -u -r1.28.4.4 -r1.28.4.5 src/sys/miscfs/genfs/layer_subr.c
cvs rdiff -u -r1.214.2.6 -r1.214.2.7 src/sys/sys/vnode.h

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/fs/tmpfs/tmpfs_subr.c
diff -u src/sys/fs/tmpfs/tmpfs_subr.c:1.56.4.6 src/sys/fs/tmpfs/tmpfs_subr.c:1.56.4.7
--- src/sys/fs/tmpfs/tmpfs_subr.c:1.56.4.6	Sun May 22 04:29:04 2011
+++ src/sys/fs/tmpfs/tmpfs_subr.c	Mon May 30 14:57:48 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: tmpfs_subr.c,v 1.56.4.6 2011/05/22 04:29:04 rmind Exp $	*/
+/*	$NetBSD: tmpfs_subr.c,v 1.56.4.7 2011/05/30 14:57:48 rmind Exp $	*/
 
 /*
  * Copyright (c) 2005, 2006, 2007 The NetBSD Foundation, Inc.
@@ -35,7 +35,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: tmpfs_subr.c,v 1.56.4.6 2011/05/22 04:29:04 rmind Exp $");
+__KERNEL_RCSID(0, "$NetBSD: tmpfs_subr.c,v 1.56.4.7 2011/05/30 14:57:48 rmind Exp $");
 
 #include <sys/param.h>
 #include <sys/dirent.h>
@@ -344,6 +344,7 @@
 int
 tmpfs_alloc_vp(struct mount *mp, struct tmpfs_node *node, struct vnode **vpp)
 {
+	struct uvm_object *uobj;
 	int error;
 	struct vnode *vp;
 
@@ -364,16 +365,18 @@
 		break;
 	}
 
-	/* Get a new vnode and associate it with our node. */
-	error = getnewvnode(VT_TMPFS, mp, tmpfs_vnodeop_p, NULL, &vp);
+	/*
+	 * Get a new vnode and associate it with our inode.  Share the
+	 * lock with underlying UVM object.
+	 */
+	uobj = node->tn_spec.tn_reg.tn_aobj;
+	error = getnewvnode(VT_TMPFS, mp, tmpfs_vnodeop_p,
+	    uobj->vmobjlock, &vp);
 	if (error != 0) {
 		mutex_exit(&node->tn_vlock);
 		return error;
 	}
-
-	/* Set UVM object to use vnode_t::v_interlock (share it). */
-	uvm_obj_setlock(node->tn_spec.tn_reg.tn_aobj, vp->v_interlock);
-	mutex_obj_hold(vp->v_interlock);
+	KASSERT(uobj->vmobjlock == vp->v_interlock);
 
 	error = vn_lock(vp, LK_EXCLUSIVE | LK_RETRY);
 	if (error != 0) {

Index: src/sys/fs/union/union_subr.c
diff -u src/sys/fs/union/union_subr.c:1.35.4.4 src/sys/fs/union/union_subr.c:1.35.4.5
--- src/sys/fs/union/union_subr.c:1.35.4.4	Sat May 21 03:38:24 2011
+++ src/sys/fs/union/union_subr.c	Mon May 30 14:57:48 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: union_subr.c,v 1.35.4.4 2011/05/21 03:38:24 rmind Exp $	*/
+/*	$NetBSD: union_subr.c,v 1.35.4.5 2011/05/30 14:57:48 rmind Exp $	*/
 
 /*
  * Copyright (c) 1994
@@ -72,7 +72,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: union_subr.c,v 1.35.4.4 2011/05/21 03:38:24 rmind Exp $");
+__KERNEL_RCSID(0, "$NetBSD: union_subr.c,v 1.35.4.5 2011/05/30 14:57:48 rmind Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -511,8 +511,9 @@
 	 * Get a new vnode and share the lock with upper layer vnode,
 	 * unless layers are inverted.
 	 */
+	vnode_t *svp = (uppervp != NULLVP) ? uppervp : lowervp;
 	error = getnewvnode(VT_UNION, mp, union_vnodeop_p,
-	    (uppervp != NULLVP ? uppervp : lowervp), vpp);
+	    svp->v_interlock, vpp);
 	if (error) {
 		if (uppervp) {
 			if (dvp == uppervp)

Index: src/sys/fs/unionfs/unionfs_subr.c
diff -u src/sys/fs/unionfs/unionfs_subr.c:1.5.4.5 src/sys/fs/unionfs/unionfs_subr.c:1.5.4.6
--- src/sys/fs/unionfs/unionfs_subr.c:1.5.4.5	Sat May 21 03:38:25 2011
+++ src/sys/fs/unionfs/unionfs_subr.c	Mon May 30 14:57:48 2011
@@ -95,8 +95,9 @@
 	 * Get a new vnode and share the lock with upper layer vnode,
 	 * unless layers are inverted.
 	 */
+	vnode_t *svp = (uppervp != NULLVP) ? uppervp : lowervp;
 	error = getnewvnode(VT_UNION, mp, unionfs_vnodeop_p,
-	    (uppervp != NULLVP ? uppervp : lowervp), &vp);
+	    svp->v_interlock, &vp);
 	if (error != 0) {
 		return (error);
 	}

Index: src/sys/kern/vfs_vnode.c
diff -u src/sys/kern/vfs_vnode.c:1.5.2.4 src/sys/kern/vfs_vnode.c:1.5.2.5
--- src/sys/kern/vfs_vnode.c:1.5.2.4	Sun May 22 04:29:04 2011
+++ src/sys/kern/vfs_vnode.c	Mon May 30 14:57:48 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: vfs_vnode.c,v 1.5.2.4 2011/05/22 04:29:04 rmind Exp $	*/
+/*	$NetBSD: vfs_vnode.c,v 1.5.2.5 2011/05/30 14:57:48 rmind Exp $	*/
 
 /*-
  * Copyright (c) 1997-2011 The NetBSD Foundation, Inc.
@@ -91,7 +91,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: vfs_vnode.c,v 1.5.2.4 2011/05/22 04:29:04 rmind Exp $");
+__KERNEL_RCSID(0, "$NetBSD: vfs_vnode.c,v 1.5.2.5 2011/05/30 14:57:48 rmind Exp $");
 
 #include <sys/param.h>
 #include <sys/kernel.h>
@@ -308,11 +308,11 @@
  * getnewvnode: return the next vnode from the free list.
  *
  * => Returns referenced vnode, moved into the mount queue.
- * => Shares the lock with vnode specified by 'svp', if it is not NULL.
+ * => Shares the interlock specified by 'slock', if it is not NULL.
  */
 int
 getnewvnode(enum vtagtype tag, struct mount *mp, int (**vops)(void *),
-	    const vnode_t *svp, vnode_t **vpp)
+    kmutex_t *slock, vnode_t **vpp)
 {
 	struct uvm_object *uobj;
 	static int toggle;
@@ -386,7 +386,7 @@
 			*vpp = 0;
 			return ENFILE;
 		}
-		if ((vp->v_iflag & VI_LOCKSHARE) != 0 || svp) {
+		if ((vp->v_iflag & VI_LOCKSHARE) != 0 || slock) {
 			/* We must remove vnode from the old mount point. */
 			if (vp->v_mount) {
 				vfs_insmntque(vp, NULL);
@@ -421,12 +421,12 @@
 	vp->v_size = vp->v_writesize = VSIZENOTSET;
 
 	/* Share the vnode_t::v_interlock, if requested. */
-	if (svp) {
+	if (slock) {
 		/* Set the interlock and mark that it is shared. */
 		KASSERT(vp->v_mount == NULL);
-		mutex_obj_hold(svp->v_interlock);
-		uvm_obj_setlock(&vp->v_uobj, svp->v_interlock);
-		KASSERT(vp->v_interlock == svp->v_interlock);
+		mutex_obj_hold(slock);
+		uvm_obj_setlock(&vp->v_uobj, slock);
+		KASSERT(vp->v_interlock == slock);
 		vp->v_iflag |= VI_LOCKSHARE;
 	}
 

Index: src/sys/miscfs/genfs/layer_subr.c
diff -u src/sys/miscfs/genfs/layer_subr.c:1.28.4.4 src/sys/miscfs/genfs/layer_subr.c:1.28.4.5
--- src/sys/miscfs/genfs/layer_subr.c:1.28.4.4	Thu May 19 03:43:03 2011
+++ src/sys/miscfs/genfs/layer_subr.c	Mon May 30 14:57:48 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: layer_subr.c,v 1.28.4.4 2011/05/19 03:43:03 rmind Exp $	*/
+/*	$NetBSD: layer_subr.c,v 1.28.4.5 2011/05/30 14:57:48 rmind Exp $	*/
 
 /*
  * Copyright (c) 1999 National Aeronautics & Space Administration
@@ -69,7 +69,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: layer_subr.c,v 1.28.4.4 2011/05/19 03:43:03 rmind Exp $");
+__KERNEL_RCSID(0, "$NetBSD: layer_subr.c,v 1.28.4.5 2011/05/30 14:57:48 rmind Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -191,7 +191,7 @@
 
 	/* Get a new vnode and share its interlock with underlying vnode. */
 	error = getnewvnode(lmp->layerm_tag, mp, lmp->layerm_vnodeop_p,
-	    lowervp, &vp);
+	    lowervp->v_interlock, &vp);
 	if (error) {
 		return error;
 	}

Index: src/sys/sys/vnode.h
diff -u src/sys/sys/vnode.h:1.214.2.6 src/sys/sys/vnode.h:1.214.2.7
--- src/sys/sys/vnode.h:1.214.2.6	Thu May 19 03:43:04 2011
+++ src/sys/sys/vnode.h	Mon May 30 14:57:49 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: vnode.h,v 1.214.2.6 2011/05/19 03:43:04 rmind Exp $	*/
+/*	$NetBSD: vnode.h,v 1.214.2.7 2011/05/30 14:57:49 rmind Exp $	*/
 
 /*-
  * Copyright (c) 2008 The NetBSD Foundation, Inc.
@@ -546,7 +546,7 @@
 int 	bdevvp(dev_t, struct vnode **);
 int 	cdevvp(dev_t, struct vnode **);
 int 	getnewvnode(enum vtagtype, struct mount *, int (**)(void *),
-	    const struct vnode *, struct vnode **);
+	    kmutex_t *, struct vnode **);
 void	ungetnewvnode(struct vnode *);
 int	vaccess(enum vtype, mode_t, uid_t, gid_t, mode_t, kauth_cred_t);
 void 	vattr_null(struct vattr *);

Reply via email to