Module Name: src Committed By: hannken Date: Thu Jul 1 13:00:57 UTC 2010
Modified Files: src/sys/coda: coda_vnops.c src/sys/fs/adosfs: adutil.c src/sys/fs/cd9660: cd9660_node.c src/sys/fs/efs: efs_ihash.c src/sys/fs/filecorefs: filecore_node.c src/sys/fs/hfs: hfs_nhash.c src/sys/fs/ntfs: ntfs_vfsops.c src/sys/fs/ptyfs: ptyfs_subr.c src/sys/fs/udf: udf_subr.c src/sys/fs/union: union_vnops.c src/sys/kern: vfs_subr.c src/sys/miscfs/genfs: genfs_vnops.c src/sys/miscfs/kernfs: kernfs_subr.c src/sys/miscfs/procfs: procfs_subr.c src/sys/netsmb: smb_conn.c src/sys/nfs: nfs_node.c src/sys/sys: lock.h param.h vnode.h src/sys/ufs/lfs: lfs_syscalls.c src/sys/ufs/ufs: ufs_ihash.c Log Message: Remove vlockmgr(). Generic vnode lock operations now use a rwlock located in the vnode. All LK_* flags move from sys/lock.h to sys/vnode.h. Calls to vlockmgr() in file systems get replaced with VOP_LOCK() or VOP_UNLOCK(). Welcome to 5.99.34. Discussed on tech-kern. To generate a diff of this commit: cvs rdiff -u -r1.74 -r1.75 src/sys/coda/coda_vnops.c cvs rdiff -u -r1.11 -r1.12 src/sys/fs/adosfs/adutil.c cvs rdiff -u -r1.25 -r1.26 src/sys/fs/cd9660/cd9660_node.c cvs rdiff -u -r1.4 -r1.5 src/sys/fs/efs/efs_ihash.c cvs rdiff -u -r1.20 -r1.21 src/sys/fs/filecorefs/filecore_node.c cvs rdiff -u -r1.9 -r1.10 src/sys/fs/hfs/hfs_nhash.c cvs rdiff -u -r1.81 -r1.82 src/sys/fs/ntfs/ntfs_vfsops.c cvs rdiff -u -r1.19 -r1.20 src/sys/fs/ptyfs/ptyfs_subr.c cvs rdiff -u -r1.105 -r1.106 src/sys/fs/udf/udf_subr.c cvs rdiff -u -r1.36 -r1.37 src/sys/fs/union/union_vnops.c cvs rdiff -u -r1.407 -r1.408 src/sys/kern/vfs_subr.c cvs rdiff -u -r1.181 -r1.182 src/sys/miscfs/genfs/genfs_vnops.c cvs rdiff -u -r1.20 -r1.21 src/sys/miscfs/kernfs/kernfs_subr.c cvs rdiff -u -r1.96 -r1.97 src/sys/miscfs/procfs/procfs_subr.c cvs rdiff -u -r1.25 -r1.26 src/sys/netsmb/smb_conn.c cvs rdiff -u -r1.111 -r1.112 src/sys/nfs/nfs_node.c cvs rdiff -u -r1.85 -r1.86 src/sys/sys/lock.h cvs rdiff -u -r1.368 -r1.369 src/sys/sys/param.h cvs rdiff -u -r1.220 -r1.221 src/sys/sys/vnode.h cvs rdiff -u -r1.137 -r1.138 src/sys/ufs/lfs/lfs_syscalls.c cvs rdiff -u -r1.28 -r1.29 src/sys/ufs/ufs/ufs_ihash.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/coda/coda_vnops.c diff -u src/sys/coda/coda_vnops.c:1.74 src/sys/coda/coda_vnops.c:1.75 --- src/sys/coda/coda_vnops.c:1.74 Thu Jun 24 13:03:06 2010 +++ src/sys/coda/coda_vnops.c Thu Jul 1 13:00:54 2010 @@ -1,4 +1,4 @@ -/* $NetBSD: coda_vnops.c,v 1.74 2010/06/24 13:03:06 hannken Exp $ */ +/* $NetBSD: coda_vnops.c,v 1.75 2010/07/01 13:00:54 hannken Exp $ */ /* * @@ -46,7 +46,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: coda_vnops.c,v 1.74 2010/06/24 13:03:06 hannken Exp $"); +__KERNEL_RCSID(0, "$NetBSD: coda_vnops.c,v 1.75 2010/07/01 13:00:54 hannken Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -1775,7 +1775,6 @@ struct vop_lock_args *ap = v; struct vnode *vp = ap->a_vp; struct cnode *cp = VTOC(vp); - int flags = ap->a_flags; /* upcall decl */ /* locals */ @@ -1786,7 +1785,7 @@ coda_f2s(&cp->c_fid))); } - return (vlockmgr(&vp->v_lock, flags)); + return genfs_lock(v); } int @@ -1805,17 +1804,16 @@ coda_f2s(&cp->c_fid))); } - return (vlockmgr(&vp->v_lock, LK_RELEASE)); + return genfs_unlock(v); } int coda_islocked(void *v) { /* true args */ - struct vop_islocked_args *ap = v; ENTRY; - return (vlockstatus(&ap->a_vp->v_lock)); + return genfs_islocked(v); } /* Index: src/sys/fs/adosfs/adutil.c diff -u src/sys/fs/adosfs/adutil.c:1.11 src/sys/fs/adosfs/adutil.c:1.12 --- src/sys/fs/adosfs/adutil.c:1.11 Sat Mar 14 21:04:23 2009 +++ src/sys/fs/adosfs/adutil.c Thu Jul 1 13:00:55 2010 @@ -1,4 +1,4 @@ -/* $NetBSD: adutil.c,v 1.11 2009/03/14 21:04:23 dsl Exp $ */ +/* $NetBSD: adutil.c,v 1.12 2010/07/01 13:00:55 hannken Exp $ */ /* * Copyright (c) 1994 Christian E. Hopps @@ -32,7 +32,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: adutil.c,v 1.11 2009/03/14 21:04:23 dsl Exp $"); +__KERNEL_RCSID(0, "$NetBSD: adutil.c,v 1.12 2010/07/01 13:00:55 hannken Exp $"); #include <sys/param.h> #include <sys/vnode.h> @@ -87,7 +87,7 @@ void adosfs_ainshash(struct adosfsmount *amp, struct anode *ap) { - vlockmgr(&ap->vp->v_lock, LK_EXCLUSIVE); + VOP_LOCK(ATOV(ap), LK_EXCLUSIVE); simple_lock(&adosfs_hashlock); LIST_INSERT_HEAD(&->anodetab[AHASH(ap->block)], ap, link); Index: src/sys/fs/cd9660/cd9660_node.c diff -u src/sys/fs/cd9660/cd9660_node.c:1.25 src/sys/fs/cd9660/cd9660_node.c:1.26 --- src/sys/fs/cd9660/cd9660_node.c:1.25 Thu Jun 24 13:03:09 2010 +++ src/sys/fs/cd9660/cd9660_node.c Thu Jul 1 13:00:55 2010 @@ -1,4 +1,4 @@ -/* $NetBSD: cd9660_node.c,v 1.25 2010/06/24 13:03:09 hannken Exp $ */ +/* $NetBSD: cd9660_node.c,v 1.26 2010/07/01 13:00:55 hannken Exp $ */ /*- * Copyright (c) 1982, 1986, 1989, 1994 @@ -37,7 +37,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: cd9660_node.c,v 1.25 2010/06/24 13:03:09 hannken Exp $"); +__KERNEL_RCSID(0, "$NetBSD: cd9660_node.c,v 1.26 2010/07/01 13:00:55 hannken Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -178,7 +178,7 @@ LIST_INSERT_HEAD(ipp, ip, i_hash); mutex_exit(&cd9660_ihash_lock); - vlockmgr(&ip->i_vnode->v_lock, LK_EXCLUSIVE); + VOP_LOCK(ITOV(ip), LK_EXCLUSIVE); } /* Index: src/sys/fs/efs/efs_ihash.c diff -u src/sys/fs/efs/efs_ihash.c:1.4 src/sys/fs/efs/efs_ihash.c:1.5 --- src/sys/fs/efs/efs_ihash.c:1.4 Mon May 5 17:11:16 2008 +++ src/sys/fs/efs/efs_ihash.c Thu Jul 1 13:00:55 2010 @@ -1,4 +1,4 @@ -/* $NetBSD: efs_ihash.c,v 1.4 2008/05/05 17:11:16 ad Exp $ */ +/* $NetBSD: efs_ihash.c,v 1.5 2010/07/01 13:00:55 hannken Exp $ */ /* * Copyright (c) 1982, 1986, 1989, 1991, 1993 @@ -36,7 +36,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: efs_ihash.c,v 1.4 2008/05/05 17:11:16 ad Exp $"); +__KERNEL_RCSID(0, "$NetBSD: efs_ihash.c,v 1.5 2010/07/01 13:00:55 hannken Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -167,7 +167,7 @@ KASSERT(mutex_owned(&efs_hashlock)); /* lock the inode, then put it on the appropriate hash list */ - vlockmgr(&eip->ei_vp->v_lock, LK_EXCLUSIVE); + VOP_LOCK(EFS_ITOV(eip), LK_EXCLUSIVE); mutex_enter(&efs_ihash_lock); ipp = &ihashtbl[INOHASH(eip->ei_dev, eip->ei_number)]; Index: src/sys/fs/filecorefs/filecore_node.c diff -u src/sys/fs/filecorefs/filecore_node.c:1.20 src/sys/fs/filecorefs/filecore_node.c:1.21 --- src/sys/fs/filecorefs/filecore_node.c:1.20 Thu Jun 24 13:03:09 2010 +++ src/sys/fs/filecorefs/filecore_node.c Thu Jul 1 13:00:55 2010 @@ -1,4 +1,4 @@ -/* $NetBSD: filecore_node.c,v 1.20 2010/06/24 13:03:09 hannken Exp $ */ +/* $NetBSD: filecore_node.c,v 1.21 2010/07/01 13:00:55 hannken Exp $ */ /*- * Copyright (c) 1982, 1986, 1989, 1994 @@ -67,7 +67,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: filecore_node.c,v 1.20 2010/06/24 13:03:09 hannken Exp $"); +__KERNEL_RCSID(0, "$NetBSD: filecore_node.c,v 1.21 2010/07/01 13:00:55 hannken Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -190,15 +190,13 @@ filecore_ihashins(struct filecore_node *ip) { struct ihashhead *ipp; - struct vnode *vp; simple_lock(&filecore_ihash_slock); ipp = &filecorehashtbl[INOHASH(ip->i_dev, ip->i_number)]; LIST_INSERT_HEAD(ipp, ip, i_hash); simple_unlock(&filecore_ihash_slock); - vp = ip->i_vnode; - vlockmgr(&vp->v_lock, LK_EXCLUSIVE); + VOP_LOCK(ITOV(ip), LK_EXCLUSIVE); } /* Index: src/sys/fs/hfs/hfs_nhash.c diff -u src/sys/fs/hfs/hfs_nhash.c:1.9 src/sys/fs/hfs/hfs_nhash.c:1.10 --- src/sys/fs/hfs/hfs_nhash.c:1.9 Wed Sep 3 22:57:46 2008 +++ src/sys/fs/hfs/hfs_nhash.c Thu Jul 1 13:00:55 2010 @@ -1,4 +1,4 @@ -/* $NetBSD: hfs_nhash.c,v 1.9 2008/09/03 22:57:46 gmcgarry Exp $ */ +/* $NetBSD: hfs_nhash.c,v 1.10 2010/07/01 13:00:55 hannken Exp $ */ /*- * Copyright (c) 2005, 2007 The NetBSD Foundation, Inc. @@ -59,7 +59,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: hfs_nhash.c,v 1.9 2008/09/03 22:57:46 gmcgarry Exp $"); +__KERNEL_RCSID(0, "$NetBSD: hfs_nhash.c,v 1.10 2010/07/01 13:00:55 hannken Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -150,7 +150,7 @@ struct nhashhead *hpp; /* lock the inode, then put it on the appropriate hash list */ - vlockmgr(&hp->h_vnode->v_lock, LK_EXCLUSIVE); + VOP_LOCK(HTOV(hp), LK_EXCLUSIVE); mutex_enter(&hfs_nhash_lock); hpp = &nhashtbl[HNOHASH(hp->h_dev, hp->h_rec.u.cnid, hp->h_fork)]; Index: src/sys/fs/ntfs/ntfs_vfsops.c diff -u src/sys/fs/ntfs/ntfs_vfsops.c:1.81 src/sys/fs/ntfs/ntfs_vfsops.c:1.82 --- src/sys/fs/ntfs/ntfs_vfsops.c:1.81 Thu Jun 24 13:03:10 2010 +++ src/sys/fs/ntfs/ntfs_vfsops.c Thu Jul 1 13:00:55 2010 @@ -1,4 +1,4 @@ -/* $NetBSD: ntfs_vfsops.c,v 1.81 2010/06/24 13:03:10 hannken Exp $ */ +/* $NetBSD: ntfs_vfsops.c,v 1.82 2010/07/01 13:00:55 hannken Exp $ */ /*- * Copyright (c) 1998, 1999 Semen Ustimenko @@ -29,7 +29,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: ntfs_vfsops.c,v 1.81 2010/06/24 13:03:10 hannken Exp $"); +__KERNEL_RCSID(0, "$NetBSD: ntfs_vfsops.c,v 1.82 2010/07/01 13:00:55 hannken Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -807,7 +807,7 @@ if (ino == NTFS_ROOTINO) vp->v_vflag |= VV_ROOT; - if (lkflags & LK_TYPE_MASK) { + if (lkflags & (LK_EXCLUSIVE | LK_SHARED)) { error = vn_lock(vp, lkflags); if (error) { vput(vp); Index: src/sys/fs/ptyfs/ptyfs_subr.c diff -u src/sys/fs/ptyfs/ptyfs_subr.c:1.19 src/sys/fs/ptyfs/ptyfs_subr.c:1.20 --- src/sys/fs/ptyfs/ptyfs_subr.c:1.19 Thu Jun 24 13:03:10 2010 +++ src/sys/fs/ptyfs/ptyfs_subr.c Thu Jul 1 13:00:55 2010 @@ -1,4 +1,4 @@ -/* $NetBSD: ptyfs_subr.c,v 1.19 2010/06/24 13:03:10 hannken Exp $ */ +/* $NetBSD: ptyfs_subr.c,v 1.20 2010/07/01 13:00:55 hannken Exp $ */ /* * Copyright (c) 1993 @@ -73,7 +73,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: ptyfs_subr.c,v 1.19 2010/06/24 13:03:10 hannken Exp $"); +__KERNEL_RCSID(0, "$NetBSD: ptyfs_subr.c,v 1.20 2010/07/01 13:00:55 hannken Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -388,7 +388,7 @@ struct ptyfs_hashhead *ppp; /* lock the ptyfsnode, then put it on the appropriate hash list */ - vlockmgr(&pp->ptyfs_vnode->v_lock, LK_EXCLUSIVE); + VOP_LOCK(PTYFSTOV(pp), LK_EXCLUSIVE); mutex_enter(&ptyfs_used_slock); ppp = &ptyfs_used_tbl[PTYHASH(pp->ptyfs_type, pp->ptyfs_pty, Index: src/sys/fs/udf/udf_subr.c diff -u src/sys/fs/udf/udf_subr.c:1.105 src/sys/fs/udf/udf_subr.c:1.106 --- src/sys/fs/udf/udf_subr.c:1.105 Sun Jun 6 08:01:31 2010 +++ src/sys/fs/udf/udf_subr.c Thu Jul 1 13:00:55 2010 @@ -1,4 +1,4 @@ -/* $NetBSD: udf_subr.c,v 1.105 2010/06/06 08:01:31 hannken Exp $ */ +/* $NetBSD: udf_subr.c,v 1.106 2010/07/01 13:00:55 hannken Exp $ */ /* * Copyright (c) 2006, 2008 Reinoud Zandijk @@ -29,7 +29,7 @@ #include <sys/cdefs.h> #ifndef lint -__KERNEL_RCSID(0, "$NetBSD: udf_subr.c,v 1.105 2010/06/06 08:01:31 hannken Exp $"); +__KERNEL_RCSID(0, "$NetBSD: udf_subr.c,v 1.106 2010/07/01 13:00:55 hannken Exp $"); #endif /* not lint */ @@ -5452,7 +5452,7 @@ /* recycle udf_node */ udf_dispose_node(udf_node); - vlockmgr(&nvp->v_lock, LK_RELEASE); + VOP_UNLOCK(nvp); nvp->v_data = NULL; ungetnewvnode(nvp); @@ -5548,7 +5548,7 @@ /* recycle udf_node */ udf_dispose_node(udf_node); - vlockmgr(&nvp->v_lock, LK_RELEASE); + VOP_UNLOCK(nvp); nvp->v_data = NULL; ungetnewvnode(nvp); @@ -5883,7 +5883,7 @@ udf_do_unreserve_space(ump, NULL, vpart_num, 1); error_out_unlock: - vlockmgr(&nvp->v_lock, LK_RELEASE); + VOP_UNLOCK(nvp); error_out_unget: nvp->v_data = NULL; Index: src/sys/fs/union/union_vnops.c diff -u src/sys/fs/union/union_vnops.c:1.36 src/sys/fs/union/union_vnops.c:1.37 --- src/sys/fs/union/union_vnops.c:1.36 Thu Jun 24 13:03:11 2010 +++ src/sys/fs/union/union_vnops.c Thu Jul 1 13:00:56 2010 @@ -1,4 +1,4 @@ -/* $NetBSD: union_vnops.c,v 1.36 2010/06/24 13:03:11 hannken Exp $ */ +/* $NetBSD: union_vnops.c,v 1.37 2010/07/01 13:00:56 hannken Exp $ */ /* * Copyright (c) 1992, 1993, 1994, 1995 @@ -72,7 +72,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: union_vnops.c,v 1.36 2010/06/24 13:03:11 hannken Exp $"); +__KERNEL_RCSID(0, "$NetBSD: union_vnops.c,v 1.37 2010/07/01 13:00:56 hannken Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -1626,8 +1626,8 @@ int error; /* XXX unionfs can't handle shared locks yet */ - if ((flags & LK_TYPE_MASK) == LK_SHARED) { - flags = LK_EXCLUSIVE | (flags & ~LK_TYPE_MASK); + if ((flags & LK_SHARED) != 0) { + flags = (flags & ~LK_SHARED) | LK_EXCLUSIVE; } genfs_nolock(ap); Index: src/sys/kern/vfs_subr.c diff -u src/sys/kern/vfs_subr.c:1.407 src/sys/kern/vfs_subr.c:1.408 --- src/sys/kern/vfs_subr.c:1.407 Thu Jun 24 13:03:12 2010 +++ src/sys/kern/vfs_subr.c Thu Jul 1 13:00:56 2010 @@ -1,4 +1,4 @@ -/* $NetBSD: vfs_subr.c,v 1.407 2010/06/24 13:03:12 hannken Exp $ */ +/* $NetBSD: vfs_subr.c,v 1.408 2010/07/01 13:00:56 hannken Exp $ */ /*- * Copyright (c) 1997, 1998, 2004, 2005, 2007, 2008 The NetBSD Foundation, Inc. @@ -91,7 +91,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: vfs_subr.c,v 1.407 2010/06/24 13:03:12 hannken Exp $"); +__KERNEL_RCSID(0, "$NetBSD: vfs_subr.c,v 1.408 2010/07/01 13:00:56 hannken Exp $"); #include "opt_ddb.h" #include "opt_compat_netbsd.h" @@ -713,7 +713,7 @@ vp->v_type = VBAD; vp->v_iflag = VI_MARKER; } else { - rw_init(&vp->v_lock.vl_lock); + rw_init(&vp->v_lock); } return vp; @@ -729,7 +729,7 @@ KASSERT(vp->v_usecount == 0); if ((vp->v_iflag & VI_MARKER) == 0) { - rw_destroy(&vp->v_lock.vl_lock); + rw_destroy(&vp->v_lock); mutex_enter(&vnode_free_list_lock); numvnodes--; mutex_exit(&vnode_free_list_lock); @@ -1332,7 +1332,7 @@ * Ok, we got it in good shape. Just locking left. */ KASSERT((vp->v_iflag & VI_CLEAN) == 0); - if (flags & LK_TYPE_MASK) { + if (flags & (LK_EXCLUSIVE | LK_SHARED)) { error = vn_lock(vp, flags | LK_INTERLOCK); if (error != 0) { vrele(vp); @@ -2720,11 +2720,9 @@ void vprint(const char *label, struct vnode *vp) { - struct vnlock *vl; char bf[96]; int flag; - vl = &vp->v_lock; flag = vp->v_iflag | vp->v_vflag | vp->v_uflag; snprintb(bf, sizeof(bf), vnode_flagbits, flag); @@ -2736,7 +2734,7 @@ vp, bf, ARRAY_PRINT(vp->v_tag, vnode_tags), vp->v_tag, ARRAY_PRINT(vp->v_type, vnode_types), vp->v_type, vp->v_usecount, vp->v_writecount, vp->v_holdcnt, - vp->v_freelisthd, vp->v_mount, vp->v_data, vl); + vp->v_freelisthd, vp->v_mount, vp->v_data, &vp->v_lock); if (vp->v_data != NULL) { printf("\t"); VOP_PRINT(vp); @@ -2915,52 +2913,6 @@ rootfstime = t; } -/* - * Sham lock manager for vnodes. This is a temporary measure. - */ -int -vlockmgr(struct vnlock *vl, int flags) -{ - - KASSERT((flags & ~(LK_NOWAIT | LK_TYPE_MASK)) == 0); - - switch (flags & (LK_NOWAIT | LK_TYPE_MASK)) { - case LK_SHARED: - rw_enter(&vl->vl_lock, RW_READER); - return 0; - - case LK_SHARED | LK_NOWAIT: - return rw_tryenter(&vl->vl_lock, RW_READER) ? 0 : EBUSY; - - case LK_EXCLUSIVE: - rw_enter(&vl->vl_lock, RW_WRITER); - return 0; - - case LK_EXCLUSIVE | LK_NOWAIT: - return rw_tryenter(&vl->vl_lock, RW_WRITER) ? 0 : EBUSY; - - case LK_RELEASE: - rw_exit(&vl->vl_lock); - return 0; - - default: - panic("vlockmgr: flags %x", flags); - } -} - -int -vlockstatus(struct vnlock *vl) -{ - - if (rw_write_held(&vl->vl_lock)) { - return LK_EXCLUSIVE; - } - if (rw_read_held(&vl->vl_lock)) { - return LK_SHARED; - } - return 0; -} - static const uint8_t vttodt_tab[9] = { DT_UNKNOWN, /* VNON */ DT_REG, /* VREG */ Index: src/sys/miscfs/genfs/genfs_vnops.c diff -u src/sys/miscfs/genfs/genfs_vnops.c:1.181 src/sys/miscfs/genfs/genfs_vnops.c:1.182 --- src/sys/miscfs/genfs/genfs_vnops.c:1.181 Thu Jun 24 13:03:16 2010 +++ src/sys/miscfs/genfs/genfs_vnops.c Thu Jul 1 13:00:56 2010 @@ -1,4 +1,4 @@ -/* $NetBSD: genfs_vnops.c,v 1.181 2010/06/24 13:03:16 hannken Exp $ */ +/* $NetBSD: genfs_vnops.c,v 1.182 2010/07/01 13:00:56 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.181 2010/06/24 13:03:16 hannken Exp $"); +__KERNEL_RCSID(0, "$NetBSD: genfs_vnops.c,v 1.182 2010/07/01 13:00:56 hannken Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -288,8 +288,18 @@ } */ *ap = v; struct vnode *vp = ap->a_vp; int flags = ap->a_flags; + krw_t op; - return (vlockmgr(&vp->v_lock, flags)); + KASSERT((flags & ~(LK_EXCLUSIVE | LK_SHARED | LK_NOWAIT)) == 0); + + op = ((flags & LK_EXCLUSIVE) != 0 ? RW_WRITER : RW_READER); + + if ((flags & LK_NOWAIT) != 0) + return (rw_tryenter(&vp->v_lock, op) ? 0 : EBUSY); + + rw_enter(&vp->v_lock, op); + + return 0; } /* @@ -303,7 +313,9 @@ } */ *ap = v; struct vnode *vp = ap->a_vp; - return (vlockmgr(&vp->v_lock, LK_RELEASE)); + rw_exit(&vp->v_lock); + + return 0; } /* @@ -317,7 +329,13 @@ } */ *ap = v; struct vnode *vp = ap->a_vp; - return (vlockstatus(&vp->v_lock)); + if (rw_write_held(&vp->v_lock)) + return LK_EXCLUSIVE; + + if (rw_read_held(&vp->v_lock)) + return LK_SHARED; + + return 0; } /* Index: src/sys/miscfs/kernfs/kernfs_subr.c diff -u src/sys/miscfs/kernfs/kernfs_subr.c:1.20 src/sys/miscfs/kernfs/kernfs_subr.c:1.21 --- src/sys/miscfs/kernfs/kernfs_subr.c:1.20 Sun Mar 15 17:22:38 2009 +++ src/sys/miscfs/kernfs/kernfs_subr.c Thu Jul 1 13:00:56 2010 @@ -1,4 +1,4 @@ -/* $NetBSD: kernfs_subr.c,v 1.20 2009/03/15 17:22:38 cegger Exp $ */ +/* $NetBSD: kernfs_subr.c,v 1.21 2010/07/01 13:00:56 hannken Exp $ */ /* * Copyright (c) 1993 @@ -73,7 +73,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: kernfs_subr.c,v 1.20 2009/03/15 17:22:38 cegger Exp $"); +__KERNEL_RCSID(0, "$NetBSD: kernfs_subr.c,v 1.21 2010/07/01 13:00:56 hannken Exp $"); #ifdef _KERNEL_OPT #include "opt_ipsec.h" @@ -333,7 +333,7 @@ struct kfs_hashhead *ppp; /* lock the kfsnode, then put it on the appropriate hash list */ - vlockmgr(&pp->kfs_vnode->v_lock, LK_EXCLUSIVE); + VOP_LOCK(KERNFSTOV(pp), LK_EXCLUSIVE); mutex_enter(&kfs_ihash_lock); ppp = &kfs_hashtbl[KFSVALUEHASH(pp->kfs_value)]; Index: src/sys/miscfs/procfs/procfs_subr.c diff -u src/sys/miscfs/procfs/procfs_subr.c:1.96 src/sys/miscfs/procfs/procfs_subr.c:1.97 --- src/sys/miscfs/procfs/procfs_subr.c:1.96 Thu Jul 1 02:38:31 2010 +++ src/sys/miscfs/procfs/procfs_subr.c Thu Jul 1 13:00:56 2010 @@ -1,4 +1,4 @@ -/* $NetBSD: procfs_subr.c,v 1.96 2010/07/01 02:38:31 rmind Exp $ */ +/* $NetBSD: procfs_subr.c,v 1.97 2010/07/01 13:00:56 hannken Exp $ */ /*- * Copyright (c) 2006, 2007, 2008 The NetBSD Foundation, Inc. @@ -102,7 +102,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: procfs_subr.c,v 1.96 2010/07/01 02:38:31 rmind Exp $"); +__KERNEL_RCSID(0, "$NetBSD: procfs_subr.c,v 1.97 2010/07/01 13:00:56 hannken Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -620,7 +620,7 @@ struct pfs_hashhead *ppp; /* lock the pfsnode, then put it on the appropriate hash list */ - vlockmgr(&pp->pfs_vnode->v_lock, LK_EXCLUSIVE); + VOP_LOCK(PFSTOV(pp), LK_EXCLUSIVE); mutex_enter(&pfs_ihash_lock); ppp = &pfs_hashtbl[PFSPIDHASH(pp->pfs_pid)]; Index: src/sys/netsmb/smb_conn.c diff -u src/sys/netsmb/smb_conn.c:1.25 src/sys/netsmb/smb_conn.c:1.26 --- src/sys/netsmb/smb_conn.c:1.25 Wed Mar 18 16:00:24 2009 +++ src/sys/netsmb/smb_conn.c Thu Jul 1 13:00:56 2010 @@ -1,4 +1,4 @@ -/* $NetBSD: smb_conn.c,v 1.25 2009/03/18 16:00:24 cegger Exp $ */ +/* $NetBSD: smb_conn.c,v 1.26 2010/07/01 13:00:56 hannken Exp $ */ /*- * Copyright (c) 2008 The NetBSD Foundation, Inc. @@ -61,7 +61,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: smb_conn.c,v 1.25 2009/03/18 16:00:24 cegger Exp $"); +__KERNEL_RCSID(0, "$NetBSD: smb_conn.c,v 1.26 2010/07/01 13:00:56 hannken Exp $"); /* * Connection engine. @@ -135,7 +135,7 @@ } static int -smb_sm_lockvclist(int flags) +smb_sm_lockvclist(void) { int error; @@ -223,7 +223,7 @@ *vcpp = vcp = NULL; - error = smb_sm_lockvclist(LK_EXCLUSIVE); + error = smb_sm_lockvclist(); if (error) return error; fail = smb_sm_lookupint(vcspec, shspec, scred, vcpp); Index: src/sys/nfs/nfs_node.c diff -u src/sys/nfs/nfs_node.c:1.111 src/sys/nfs/nfs_node.c:1.112 --- src/sys/nfs/nfs_node.c:1.111 Thu Jun 24 13:03:17 2010 +++ src/sys/nfs/nfs_node.c Thu Jul 1 13:00:56 2010 @@ -1,4 +1,4 @@ -/* $NetBSD: nfs_node.c,v 1.111 2010/06/24 13:03:17 hannken Exp $ */ +/* $NetBSD: nfs_node.c,v 1.112 2010/07/01 13:00:56 hannken Exp $ */ /* * Copyright (c) 1989, 1993 @@ -35,7 +35,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: nfs_node.c,v 1.111 2010/06/24 13:03:17 hannken Exp $"); +__KERNEL_RCSID(0, "$NetBSD: nfs_node.c,v 1.112 2010/07/01 13:00:56 hannken Exp $"); #ifdef _KERNEL_OPT #include "opt_nfs.h" @@ -231,7 +231,7 @@ kauth_cred_hold(np->n_rcred); np->n_wcred = curlwp->l_cred; kauth_cred_hold(np->n_wcred); - vlockmgr(&vp->v_lock, LK_EXCLUSIVE); + VOP_LOCK(vp, LK_EXCLUSIVE); NFS_INVALIDATE_ATTRCACHE(np); uvm_vnp_setsize(vp, 0); rb_tree_insert_node(&nmp->nm_rbtree, &np->n_rbnode); Index: src/sys/sys/lock.h diff -u src/sys/sys/lock.h:1.85 src/sys/sys/lock.h:1.86 --- src/sys/sys/lock.h:1.85 Thu Jun 24 07:54:47 2010 +++ src/sys/sys/lock.h Thu Jul 1 13:00:57 2010 @@ -1,4 +1,4 @@ -/* $NetBSD: lock.h,v 1.85 2010/06/24 07:54:47 hannken Exp $ */ +/* $NetBSD: lock.h,v 1.86 2010/07/01 13:00:57 hannken Exp $ */ /*- * Copyright (c) 1999, 2000, 2006, 2007 The NetBSD Foundation, Inc. @@ -73,16 +73,6 @@ #include <machine/lock.h> -#define LK_TYPE_MASK 0x0000000f /* type of lock sought */ -#define LK_SHARED 0x00000001 /* shared lock */ -#define LK_EXCLUSIVE 0x00000002 /* exclusive lock */ -#define LK_RELEASE 0x00000006 /* release any type of lock */ - -#define LK_NOWAIT 0x00000010 /* do not sleep to await lock */ -#define LK_INTERLOCK 0x00010000 /* unlock passed simple lock after - getting lk_interlock */ -#define LK_RETRY 0x00020000 /* vn_lock: retry until locked */ - #ifdef _KERNEL /* Index: src/sys/sys/param.h diff -u src/sys/sys/param.h:1.368 src/sys/sys/param.h:1.369 --- src/sys/sys/param.h:1.368 Sat Jun 26 14:24:27 2010 +++ src/sys/sys/param.h Thu Jul 1 13:00:57 2010 @@ -1,4 +1,4 @@ -/* $NetBSD: param.h,v 1.368 2010/06/26 14:24:27 kefren Exp $ */ +/* $NetBSD: param.h,v 1.369 2010/07/01 13:00:57 hannken Exp $ */ /*- * Copyright (c) 1982, 1986, 1989, 1993 @@ -63,7 +63,7 @@ * 2.99.9 (299000900) */ -#define __NetBSD_Version__ 599003300 /* NetBSD 5.99.33 */ +#define __NetBSD_Version__ 599003400 /* NetBSD 5.99.34 */ #define __NetBSD_Prereq__(M,m,p) (((((M) * 100000000) + \ (m) * 1000000) + (p) * 100) <= __NetBSD_Version__) Index: src/sys/sys/vnode.h diff -u src/sys/sys/vnode.h:1.220 src/sys/sys/vnode.h:1.221 --- src/sys/sys/vnode.h:1.220 Fri Jun 18 16:29:02 2010 +++ src/sys/sys/vnode.h Thu Jul 1 13:00:57 2010 @@ -1,4 +1,4 @@ -/* $NetBSD: vnode.h,v 1.220 2010/06/18 16:29:02 hannken Exp $ */ +/* $NetBSD: vnode.h,v 1.221 2010/07/01 13:00:57 hannken Exp $ */ /*- * Copyright (c) 2008 The NetBSD Foundation, Inc. @@ -122,10 +122,6 @@ LIST_HEAD(buflists, buf); TAILQ_HEAD(vnodelst, vnode); -struct vnlock { - krwlock_t vl_lock; -}; - /* * Reading or writing any of these items requires holding the appropriate * lock. Field markings and the corresponding locks: @@ -137,7 +133,7 @@ * n namecache_lock * s syncer_data_lock * u locked by underlying filesystem - * v v_lock + * v vnode lock * x v_interlock + bufcache_lock to modify, either to inspect * * Each underlying filesystem allocates its own private area and hangs @@ -174,7 +170,7 @@ } v_un; enum vtype v_type; /* :: vnode type */ enum vtagtype v_tag; /* :: type of underlying data */ - struct vnlock v_lock; /* v: lock for this vnode */ + krwlock_t v_lock; /* v: lock for this vnode */ void *v_data; /* :: private data for fs */ struct klist v_klist; /* i: notes attached to vnode */ }; @@ -190,13 +186,7 @@ typedef struct vnode vnode_t; /* - * All vnode locking operations should use vp->v_lock. - * - * All filesystems must (pretend to) understand lockmanager flags. - */ - -/* - * Vnode flags. The first set are locked by vp->v_lock or are stable. + * Vnode flags. The first set are locked by vnode lock or are stable. * VSYSTEM is only used to skip vflush()ing quota files. VISTTY is used * when reading dead vnodes. */ @@ -244,6 +234,15 @@ #define VC_MASK 0x7fffffff /* + * vnode lock flags + */ +#define LK_SHARED 0x00000001 /* shared lock */ +#define LK_EXCLUSIVE 0x00000002 /* exclusive lock */ +#define LK_NOWAIT 0x00000010 /* do not sleep to await lock */ +#define LK_INTERLOCK 0x00010000 /* caller holds v_interlock */ +#define LK_RETRY 0x00020000 /* vn_lock: retry until locked */ + +/* * Vnode attributes. A field value of VNOVAL represents a field whose value * is unavailable (getattr) or which is not to be changed (setattr). */ @@ -634,8 +633,6 @@ void vn_syncer_remove_from_worklist(struct vnode *); int speedup_syncer(void); int dorevoke(struct vnode *, kauth_cred_t); -int vlockmgr(struct vnlock *, int); -int vlockstatus(struct vnlock *); int rawdev_mounted(struct vnode *, struct vnode **); uint8_t vtype2dt(enum vtype); Index: src/sys/ufs/lfs/lfs_syscalls.c diff -u src/sys/ufs/lfs/lfs_syscalls.c:1.137 src/sys/ufs/lfs/lfs_syscalls.c:1.138 --- src/sys/ufs/lfs/lfs_syscalls.c:1.137 Thu Jun 24 13:03:19 2010 +++ src/sys/ufs/lfs/lfs_syscalls.c Thu Jul 1 13:00:57 2010 @@ -1,4 +1,4 @@ -/* $NetBSD: lfs_syscalls.c,v 1.137 2010/06/24 13:03:19 hannken Exp $ */ +/* $NetBSD: lfs_syscalls.c,v 1.138 2010/07/01 13:00:57 hannken Exp $ */ /*- * Copyright (c) 1999, 2000, 2001, 2002, 2003, 2007, 2007, 2008 @@ -61,7 +61,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: lfs_syscalls.c,v 1.137 2010/06/24 13:03:19 hannken Exp $"); +__KERNEL_RCSID(0, "$NetBSD: lfs_syscalls.c,v 1.138 2010/07/01 13:00:57 hannken Exp $"); #ifndef LFS # define LFS /* for prototypes in syscallargs.h */ @@ -1140,7 +1140,7 @@ ufs_ihashrem(ip); /* Unlock and discard unneeded inode. */ - vlockmgr(&vp->v_lock, LK_RELEASE); + VOP_UNLOCK(vp); lfs_vunref(vp); *vpp = NULL; return (error); @@ -1163,7 +1163,7 @@ ufs_ihashrem(ip); /* Unlock and discard unneeded inode. */ - vlockmgr(&vp->v_lock, LK_RELEASE); + VOP_UNLOCK(vp); lfs_vunref(vp); brelse(bp, 0); *vpp = NULL; Index: src/sys/ufs/ufs/ufs_ihash.c diff -u src/sys/ufs/ufs/ufs_ihash.c:1.28 src/sys/ufs/ufs/ufs_ihash.c:1.29 --- src/sys/ufs/ufs/ufs_ihash.c:1.28 Thu Nov 5 08:18:02 2009 +++ src/sys/ufs/ufs/ufs_ihash.c Thu Jul 1 13:00:57 2010 @@ -1,4 +1,4 @@ -/* $NetBSD: ufs_ihash.c,v 1.28 2009/11/05 08:18:02 bouyer Exp $ */ +/* $NetBSD: ufs_ihash.c,v 1.29 2010/07/01 13:00:57 hannken Exp $ */ /* * Copyright (c) 1982, 1986, 1989, 1991, 1993 @@ -32,7 +32,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: ufs_ihash.c,v 1.28 2009/11/05 08:18:02 bouyer Exp $"); +__KERNEL_RCSID(0, "$NetBSD: ufs_ihash.c,v 1.29 2010/07/01 13:00:57 hannken Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -171,7 +171,7 @@ KASSERT(mutex_owned(&ufs_hashlock)); /* lock the inode, then put it on the appropriate hash list */ - vlockmgr(&ip->i_vnode->v_lock, LK_EXCLUSIVE); + VOP_LOCK(ITOV(ip), LK_EXCLUSIVE); mutex_enter(&ufs_ihash_lock); ipp = &ihashtbl[INOHASH(ip->i_dev, ip->i_number)];