mirror of
https://github.com/freebsd/freebsd-src
synced 2024-10-16 21:34:10 +00:00
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:
parent
edf93b25d3
commit
5a12538bd7
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=216875
|
@ -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 */
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue