svn commit: r216875 - in head/sys/fs: nfs nfsserver
Rick Macklem
rmacklem at FreeBSD.org
Sat Jan 1 18:50:49 UTC 2011
Author: rmacklem
Date: Sat Jan 1 18:50:49 2011
New Revision: 216875
URL: http://svn.freebsd.org/changeset/base/216875
Log:
Add support for shared vnode locks for the Read operation
in the experimental NFSv4 server.
Reviewed by: kib
MFC after: 2 weeks
Modified:
head/sys/fs/nfs/nfs_commonsubs.c
head/sys/fs/nfsserver/nfs_nfsdstate.c
Modified: head/sys/fs/nfs/nfs_commonsubs.c
==============================================================================
--- head/sys/fs/nfs/nfs_commonsubs.c Sat Jan 1 17:39:38 2011 (r216874)
+++ head/sys/fs/nfs/nfs_commonsubs.c Sat Jan 1 18:50:49 2011 (r216875)
@@ -109,7 +109,7 @@ struct nfsv4_opflag nfsv4_opflag[NFSV4OP
{ 1, 0, 0, 0, LK_EXCLUSIVE }, /* PutFH */
{ 1, 0, 0, 0, LK_EXCLUSIVE }, /* PutPubFH */
{ 1, 0, 0, 0, LK_EXCLUSIVE }, /* PutRootFH */
- { 0, 1, 0, 0, LK_EXCLUSIVE }, /* Read */
+ { 0, 1, 0, 0, LK_SHARED }, /* Read */
{ 0, 1, 0, 0, LK_SHARED }, /* Readdir */
{ 0, 1, 0, 0, LK_SHARED }, /* ReadLink */
{ 0, 2, 1, 1, LK_EXCLUSIVE }, /* Remove */
Modified: head/sys/fs/nfsserver/nfs_nfsdstate.c
==============================================================================
--- head/sys/fs/nfsserver/nfs_nfsdstate.c Sat Jan 1 17:39:38 2011 (r216874)
+++ head/sys/fs/nfsserver/nfs_nfsdstate.c Sat Jan 1 18:50:49 2011 (r216875)
@@ -4217,7 +4217,7 @@ static int
nfsrv_clientconflict(struct nfsclient *clp, int *haslockp, __unused vnode_t vp,
NFSPROC_T *p)
{
- int gotlock;
+ int gotlock, lktype;
/*
* If lease hasn't expired, we can't fix it.
@@ -4227,7 +4227,8 @@ nfsrv_clientconflict(struct nfsclient *c
return (0);
if (*haslockp == 0) {
NFSUNLOCKSTATE();
- NFSVOPUNLOCK(vp, 0, p);
+ lktype = VOP_ISLOCKED(vp);
+ VOP_UNLOCK(vp, 0);
NFSLOCKV4ROOTMUTEX();
nfsv4_relref(&nfsv4rootfs_lock);
do {
@@ -4236,7 +4237,7 @@ nfsrv_clientconflict(struct nfsclient *c
} while (!gotlock);
NFSUNLOCKV4ROOTMUTEX();
*haslockp = 1;
- NFSVOPLOCK(vp, LK_EXCLUSIVE | LK_RETRY, p);
+ vn_lock(vp, lktype | LK_RETRY);
return (1);
}
NFSUNLOCKSTATE();
@@ -4278,7 +4279,7 @@ nfsrv_delegconflict(struct nfsstate *stp
vnode_t vp)
{
struct nfsclient *clp = stp->ls_clp;
- int gotlock, error, retrycnt, zapped_clp;
+ int gotlock, error, lktype, retrycnt, zapped_clp;
nfsv4stateid_t tstateid;
fhandle_t tfh;
@@ -4391,7 +4392,8 @@ nfsrv_delegconflict(struct nfsstate *stp
*/
if (*haslockp == 0) {
NFSUNLOCKSTATE();
- NFSVOPUNLOCK(vp, 0, p);
+ lktype = VOP_ISLOCKED(vp);
+ VOP_UNLOCK(vp, 0);
NFSLOCKV4ROOTMUTEX();
nfsv4_relref(&nfsv4rootfs_lock);
do {
@@ -4400,7 +4402,7 @@ nfsrv_delegconflict(struct nfsstate *stp
} while (!gotlock);
NFSUNLOCKV4ROOTMUTEX();
*haslockp = 1;
- NFSVOPLOCK(vp, LK_EXCLUSIVE | LK_RETRY, p);
+ vn_lock(vp, lktype | LK_RETRY);
return (-1);
}
More information about the svn-src-all
mailing list