Module Name:    src
Committed By:   hannken
Date:           Sun Jun  4 08:02:26 UTC 2017

Modified Files:
        src/sys/kern: vfs_vnode.c
        src/sys/miscfs/genfs: genfs_vnops.c layer_extern.h layer_vfsops.c
        src/sys/miscfs/nullfs: null_vnops.c
        src/sys/miscfs/overlay: overlay_vnops.c
        src/sys/miscfs/umapfs: umap_vnops.c
        src/sys/sys: vnode.h vnode_impl.h

Log Message:
Locking a layer vnode using the regular bypass routine is no longer
racy.  Undo the change from 2017-03-30 11:16:52, commitid eurqbzuGxGRlryLz
and make vi_lock a krwlock_t again.


To generate a diff of this commit:
cvs rdiff -u -r1.94 -r1.95 src/sys/kern/vfs_vnode.c
cvs rdiff -u -r1.196 -r1.197 src/sys/miscfs/genfs/genfs_vnops.c
cvs rdiff -u -r1.39 -r1.40 src/sys/miscfs/genfs/layer_extern.h
cvs rdiff -u -r1.50 -r1.51 src/sys/miscfs/genfs/layer_vfsops.c
cvs rdiff -u -r1.41 -r1.42 src/sys/miscfs/nullfs/null_vnops.c
cvs rdiff -u -r1.23 -r1.24 src/sys/miscfs/overlay/overlay_vnops.c
cvs rdiff -u -r1.59 -r1.60 src/sys/miscfs/umapfs/umap_vnops.c
cvs rdiff -u -r1.277 -r1.278 src/sys/sys/vnode.h
cvs rdiff -u -r1.14 -r1.15 src/sys/sys/vnode_impl.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/kern/vfs_vnode.c
diff -u src/sys/kern/vfs_vnode.c:1.94 src/sys/kern/vfs_vnode.c:1.95
--- src/sys/kern/vfs_vnode.c:1.94	Sun Jun  4 07:58:29 2017
+++ src/sys/kern/vfs_vnode.c	Sun Jun  4 08:02:26 2017
@@ -1,4 +1,4 @@
-/*	$NetBSD: vfs_vnode.c,v 1.94 2017/06/04 07:58:29 hannken Exp $	*/
+/*	$NetBSD: vfs_vnode.c,v 1.95 2017/06/04 08:02:26 hannken Exp $	*/
 
 /*-
  * Copyright (c) 1997-2011 The NetBSD Foundation, Inc.
@@ -156,7 +156,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: vfs_vnode.c,v 1.94 2017/06/04 07:58:29 hannken Exp $");
+__KERNEL_RCSID(0, "$NetBSD: vfs_vnode.c,v 1.95 2017/06/04 08:02:26 hannken Exp $");
 
 #include <sys/param.h>
 #include <sys/kernel.h>
@@ -424,21 +424,6 @@ vnis_marker(vnode_t *vp)
 }
 
 /*
- * Set vnode to share another vnodes lock.
- */
-void
-vshare_lock(vnode_t *vp, vnode_t *src_vp)
-{
-	vnode_impl_t *vip = VNODE_TO_VIMPL(vp);
-	vnode_impl_t *src_vip = VNODE_TO_VIMPL(src_vp);
-	krwlock_t *oldlock = vip->vi_lock;
-
-	rw_obj_hold(src_vip->vi_lock);
-	vip->vi_lock = src_vip->vi_lock;
-	rw_obj_free(oldlock);
-}
-
-/*
  * Return the lru list this node should be on.
  */
 static vnodelst_t *
@@ -1123,7 +1108,7 @@ vcache_alloc(void)
 	vip = pool_cache_get(vcache_pool, PR_WAITOK);
 	memset(vip, 0, sizeof(*vip));
 
-	vip->vi_lock = rw_obj_alloc();
+	rw_init(&vip->vi_lock);
 	/* SLIST_INIT(&vip->vi_hash); */
 	/* LIST_INIT(&vip->vi_nclist); */
 	/* LIST_INIT(&vip->vi_dnclist); */
@@ -1185,7 +1170,7 @@ vcache_free(vnode_impl_t *vip)
 	if (vp->v_type == VBLK || vp->v_type == VCHR)
 		spec_node_destroy(vp);
 
-	rw_obj_free(vip->vi_lock);
+	rw_destroy(&vip->vi_lock);
 	uvm_obj_destroy(&vp->v_uobj, true);
 	cv_destroy(&vp->v_cv);
 	pool_cache_put(vcache_pool, vip);

Index: src/sys/miscfs/genfs/genfs_vnops.c
diff -u src/sys/miscfs/genfs/genfs_vnops.c:1.196 src/sys/miscfs/genfs/genfs_vnops.c:1.197
--- src/sys/miscfs/genfs/genfs_vnops.c:1.196	Sun Jun  4 08:01:33 2017
+++ src/sys/miscfs/genfs/genfs_vnops.c	Sun Jun  4 08:02:26 2017
@@ -1,4 +1,4 @@
-/*	$NetBSD: genfs_vnops.c,v 1.196 2017/06/04 08:01:33 hannken Exp $	*/
+/*	$NetBSD: genfs_vnops.c,v 1.197 2017/06/04 08:02:26 hannken Exp $	*/
 
 /*-
  * Copyright (c) 2008 The NetBSD Foundation, Inc.
@@ -57,7 +57,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: genfs_vnops.c,v 1.196 2017/06/04 08:01:33 hannken Exp $");
+__KERNEL_RCSID(0, "$NetBSD: genfs_vnops.c,v 1.197 2017/06/04 08:02:26 hannken Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -294,10 +294,10 @@ genfs_deadlock(void *v)
 
 	op = (ISSET(flags, LK_EXCLUSIVE) ? RW_WRITER : RW_READER);
 	if (ISSET(flags, LK_NOWAIT)) {
-		if (! rw_tryenter(vip->vi_lock, op))
+		if (! rw_tryenter(&vip->vi_lock, op))
 			return EBUSY;
 	} else {
-		rw_enter(vip->vi_lock, op);
+		rw_enter(&vip->vi_lock, op);
 	}
 	VSTATE_ASSERT_UNLOCKED(vp, VS_RECLAIMED);
 	return 0;
@@ -315,7 +315,7 @@ genfs_deadunlock(void *v)
 	vnode_t *vp = ap->a_vp;
 	vnode_impl_t *vip = VNODE_TO_VIMPL(vp);
 
-	rw_exit(vip->vi_lock);
+	rw_exit(&vip->vi_lock);
 
 	return 0;
 }
@@ -337,10 +337,10 @@ genfs_lock(void *v)
 
 	op = (ISSET(flags, LK_EXCLUSIVE) ? RW_WRITER : RW_READER);
 	if (ISSET(flags, LK_NOWAIT)) {
-		if (! rw_tryenter(vip->vi_lock, op))
+		if (! rw_tryenter(&vip->vi_lock, op))
 			return EBUSY;
 	} else {
-		rw_enter(vip->vi_lock, op);
+		rw_enter(&vip->vi_lock, op);
 	}
 	VSTATE_ASSERT_UNLOCKED(vp, VS_ACTIVE);
 	return 0;
@@ -358,7 +358,7 @@ genfs_unlock(void *v)
 	vnode_t *vp = ap->a_vp;
 	vnode_impl_t *vip = VNODE_TO_VIMPL(vp);
 
-	rw_exit(vip->vi_lock);
+	rw_exit(&vip->vi_lock);
 
 	return 0;
 }
@@ -375,10 +375,10 @@ genfs_islocked(void *v)
 	vnode_t *vp = ap->a_vp;
 	vnode_impl_t *vip = VNODE_TO_VIMPL(vp);
 
-	if (rw_write_held(vip->vi_lock))
+	if (rw_write_held(&vip->vi_lock))
 		return LK_EXCLUSIVE;
 
-	if (rw_read_held(vip->vi_lock))
+	if (rw_read_held(&vip->vi_lock))
 		return LK_SHARED;
 
 	return 0;

Index: src/sys/miscfs/genfs/layer_extern.h
diff -u src/sys/miscfs/genfs/layer_extern.h:1.39 src/sys/miscfs/genfs/layer_extern.h:1.40
--- src/sys/miscfs/genfs/layer_extern.h:1.39	Thu Mar 30 09:16:52 2017
+++ src/sys/miscfs/genfs/layer_extern.h	Sun Jun  4 08:02:26 2017
@@ -1,4 +1,4 @@
-/*	$NetBSD: layer_extern.h,v 1.39 2017/03/30 09:16:52 hannken Exp $	*/
+/*	$NetBSD: layer_extern.h,v 1.40 2017/06/04 08:02:26 hannken Exp $	*/
 
 /*
  * Copyright (c) 1999 National Aeronautics & Space Administration
@@ -113,8 +113,5 @@ int	layer_revoke(void *);
 int	layer_rmdir(void *);
 int	layer_getpages(void *);
 int	layer_putpages(void *);
-#define layer_lock	genfs_lock
-#define layer_unlock	genfs_unlock
-#define layer_islocked	genfs_islocked
 
 #endif /* _MISCFS_GENFS_LAYER_EXTERN_H_ */

Index: src/sys/miscfs/genfs/layer_vfsops.c
diff -u src/sys/miscfs/genfs/layer_vfsops.c:1.50 src/sys/miscfs/genfs/layer_vfsops.c:1.51
--- src/sys/miscfs/genfs/layer_vfsops.c:1.50	Thu Jun  1 02:45:13 2017
+++ src/sys/miscfs/genfs/layer_vfsops.c	Sun Jun  4 08:02:26 2017
@@ -1,4 +1,4 @@
-/*	$NetBSD: layer_vfsops.c,v 1.50 2017/06/01 02:45:13 chs Exp $	*/
+/*	$NetBSD: layer_vfsops.c,v 1.51 2017/06/04 08:02:26 hannken Exp $	*/
 
 /*
  * Copyright (c) 1999 National Aeronautics & Space Administration
@@ -74,7 +74,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: layer_vfsops.c,v 1.50 2017/06/01 02:45:13 chs Exp $");
+__KERNEL_RCSID(0, "$NetBSD: layer_vfsops.c,v 1.51 2017/06/04 08:02:26 hannken Exp $");
 
 #include <sys/param.h>
 #include <sys/sysctl.h>
@@ -218,9 +218,6 @@ layerfs_loadvnode(struct mount *mp, stru
 	mutex_obj_hold(lowervp->v_interlock);
 	uvm_obj_setlock(&vp->v_uobj, lowervp->v_interlock);
 
-	/* Share the lock with the lower node. */
-	vshare_lock(vp, lowervp);
-
 	vp->v_tag = lmp->layerm_tag;
 	vp->v_type = lowervp->v_type;
 	vp->v_op = lmp->layerm_vnodeop_p;

Index: src/sys/miscfs/nullfs/null_vnops.c
diff -u src/sys/miscfs/nullfs/null_vnops.c:1.41 src/sys/miscfs/nullfs/null_vnops.c:1.42
--- src/sys/miscfs/nullfs/null_vnops.c:1.41	Thu Mar 30 09:16:52 2017
+++ src/sys/miscfs/nullfs/null_vnops.c	Sun Jun  4 08:02:26 2017
@@ -1,4 +1,4 @@
-/*	$NetBSD: null_vnops.c,v 1.41 2017/03/30 09:16:52 hannken Exp $	*/
+/*	$NetBSD: null_vnops.c,v 1.42 2017/06/04 08:02:26 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.41 2017/03/30 09:16:52 hannken Exp $");
+__KERNEL_RCSID(0, "$NetBSD: null_vnops.c,v 1.42 2017/06/04 08:02:26 hannken Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -106,9 +106,6 @@ const struct vnodeopv_entry_desc null_vn
 	{ &vop_fsync_desc,	layer_fsync },
 	{ &vop_inactive_desc,	layer_inactive },
 	{ &vop_reclaim_desc,	layer_reclaim },
-	{ &vop_lock_desc,	layer_lock },
-	{ &vop_unlock_desc,	layer_unlock },
-	{ &vop_islocked_desc,	layer_islocked },
 	{ &vop_print_desc,	layer_print },
 	{ &vop_remove_desc,	layer_remove },
 	{ &vop_rename_desc,	layer_rename },

Index: src/sys/miscfs/overlay/overlay_vnops.c
diff -u src/sys/miscfs/overlay/overlay_vnops.c:1.23 src/sys/miscfs/overlay/overlay_vnops.c:1.24
--- src/sys/miscfs/overlay/overlay_vnops.c:1.23	Thu Mar 30 09:16:52 2017
+++ src/sys/miscfs/overlay/overlay_vnops.c	Sun Jun  4 08:02:26 2017
@@ -1,4 +1,4 @@
-/*	$NetBSD: overlay_vnops.c,v 1.23 2017/03/30 09:16:52 hannken Exp $	*/
+/*	$NetBSD: overlay_vnops.c,v 1.24 2017/06/04 08:02:26 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.23 2017/03/30 09:16:52 hannken Exp $
+ *	$Id: overlay_vnops.c,v 1.24 2017/06/04 08:02:26 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.23 2017/03/30 09:16:52 hannken Exp $");
+__KERNEL_RCSID(0, "$NetBSD: overlay_vnops.c,v 1.24 2017/06/04 08:02:26 hannken Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -154,9 +154,6 @@ const struct vnodeopv_entry_desc overlay
 	{ &vop_fsync_desc,    layer_fsync },
 	{ &vop_inactive_desc, layer_inactive },
 	{ &vop_reclaim_desc,  layer_reclaim },
-	{ &vop_lock_desc,     layer_lock },
-	{ &vop_unlock_desc,   layer_unlock },
-	{ &vop_islocked_desc, layer_islocked },
 	{ &vop_print_desc,    layer_print },
 	{ &vop_remove_desc,   layer_remove },
 	{ &vop_rename_desc,   layer_rename },

Index: src/sys/miscfs/umapfs/umap_vnops.c
diff -u src/sys/miscfs/umapfs/umap_vnops.c:1.59 src/sys/miscfs/umapfs/umap_vnops.c:1.60
--- src/sys/miscfs/umapfs/umap_vnops.c:1.59	Thu Mar 30 09:16:53 2017
+++ src/sys/miscfs/umapfs/umap_vnops.c	Sun Jun  4 08:02:26 2017
@@ -1,4 +1,4 @@
-/*	$NetBSD: umap_vnops.c,v 1.59 2017/03/30 09:16:53 hannken Exp $	*/
+/*	$NetBSD: umap_vnops.c,v 1.60 2017/06/04 08:02:26 hannken Exp $	*/
 
 /*
  * Copyright (c) 1992, 1993
@@ -39,7 +39,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: umap_vnops.c,v 1.59 2017/03/30 09:16:53 hannken Exp $");
+__KERNEL_RCSID(0, "$NetBSD: umap_vnops.c,v 1.60 2017/06/04 08:02:26 hannken Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -88,9 +88,6 @@ const struct vnodeopv_entry_desc umap_vn
 	{ &vop_fsync_desc,	layer_fsync },
 	{ &vop_inactive_desc,	layer_inactive },
 	{ &vop_reclaim_desc,	layer_reclaim },
-	{ &vop_lock_desc,	layer_lock },
-	{ &vop_unlock_desc,	layer_unlock },
-	{ &vop_islocked_desc,	layer_islocked },
 	{ &vop_open_desc,	layer_open },
 	{ &vop_close_desc,	layer_close },
 	{ &vop_setattr_desc,	layer_setattr },

Index: src/sys/sys/vnode.h
diff -u src/sys/sys/vnode.h:1.277 src/sys/sys/vnode.h:1.278
--- src/sys/sys/vnode.h:1.277	Tue Apr 11 14:29:32 2017
+++ src/sys/sys/vnode.h	Sun Jun  4 08:02:26 2017
@@ -1,4 +1,4 @@
-/*	$NetBSD: vnode.h,v 1.277 2017/04/11 14:29:32 riastradh Exp $	*/
+/*	$NetBSD: vnode.h,v 1.278 2017/06/04 08:02:26 hannken Exp $	*/
 
 /*-
  * Copyright (c) 2008 The NetBSD Foundation, Inc.
@@ -512,7 +512,6 @@ bool	vrecycle(struct vnode *);
 void 	vrele(struct vnode *);
 void 	vrele_async(struct vnode *);
 void	vrele_flush(struct mount *);
-void	vshare_lock(vnode_t *, vnode_t *);
 int	vtruncbuf(struct vnode *, daddr_t, bool, int);
 void	vwakeup(struct buf *);
 int	vdead_check(struct vnode *, int);

Index: src/sys/sys/vnode_impl.h
diff -u src/sys/sys/vnode_impl.h:1.14 src/sys/sys/vnode_impl.h:1.15
--- src/sys/sys/vnode_impl.h:1.14	Sun Jun  4 07:58:30 2017
+++ src/sys/sys/vnode_impl.h	Sun Jun  4 08:02:26 2017
@@ -1,4 +1,4 @@
-/*	$NetBSD: vnode_impl.h,v 1.14 2017/06/04 07:58:30 hannken Exp $	*/
+/*	$NetBSD: vnode_impl.h,v 1.15 2017/06/04 08:02:26 hannken Exp $	*/
 
 /*-
  * Copyright (c) 2016 The NetBSD Foundation, Inc.
@@ -77,7 +77,7 @@ struct vnode_impl {
 	TAILQ_ENTRY(vnode_impl) vi_synclist;	/* s: vnodes with dirty bufs */
 	TAILQ_ENTRY(vnode_impl) vi_mntvnodes;	/* m: vnodes for mount point */
 	SLIST_ENTRY(vnode_impl) vi_hash;	/* c: vnode cache list */
-	krwlock_t *vi_lock;			/* -: lock for this vnode */
+	krwlock_t vi_lock;			/* -: lock for this vnode */
 	struct vcache_key vi_key;		/* c: vnode cache key */
 };
 typedef struct vnode_impl vnode_impl_t;

Reply via email to