Add support for shared vnode locks for the Read operation

in the experimental NFSv4 server.

Reviewed by:	kib
MFC after:	2 weeks
This commit is contained in:
Rick Macklem 2011-01-01 18:50:49 +00:00
parent edf93b25d3
commit 5a12538bd7
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=216875
2 changed files with 9 additions and 7 deletions

View file

@ -109,7 +109,7 @@ struct nfsv4_opflag nfsv4_opflag[NFSV4OP_NOPS] = {
{ 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 */

View file

@ -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 *clp, int *haslockp, __unused vnode_t vp,
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 *clp, int *haslockp, __unused vnode_t vp,
} 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, int *haslockp, NFSPROC_T *p,
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, int *haslockp, NFSPROC_T *p,
*/
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, int *haslockp, NFSPROC_T *p,
} while (!gotlock);
NFSUNLOCKV4ROOTMUTEX();
*haslockp = 1;
NFSVOPLOCK(vp, LK_EXCLUSIVE | LK_RETRY, p);
vn_lock(vp, lktype | LK_RETRY);
return (-1);
}