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;