nfsd: Add support for CLAIM_DELEG_CUR_FH to the NFSv4.1/4.2 Open
The Linux NFSv4.1/4.2 client now uses the CLAIM_DELEG_CUR_FH variant of the Open operation when delegations are recalled and the client has a local open of the file. This patch adds support for this variant of Open to the NFSv4.1/4.2 server. This patch only affects mounts from Linux clients when delegations are enabled on the server. MFC after: 2 weeks
This commit is contained in:
parent
3d846e4822
commit
b3d4c70dc6
@ -2981,7 +2981,8 @@ nfsrvd_open(struct nfsrv_descript *nd, __unused int isdgram,
|
|||||||
*/
|
*/
|
||||||
NFSM_DISSECT(tl, u_int32_t *, NFSX_UNSIGNED);
|
NFSM_DISSECT(tl, u_int32_t *, NFSX_UNSIGNED);
|
||||||
claim = fxdr_unsigned(int, *tl);
|
claim = fxdr_unsigned(int, *tl);
|
||||||
if (claim == NFSV4OPEN_CLAIMDELEGATECUR) {
|
if (claim == NFSV4OPEN_CLAIMDELEGATECUR || claim ==
|
||||||
|
NFSV4OPEN_CLAIMDELEGATECURFH) {
|
||||||
NFSM_DISSECT(tl, u_int32_t *, NFSX_STATEID);
|
NFSM_DISSECT(tl, u_int32_t *, NFSX_STATEID);
|
||||||
stateid.seqid = fxdr_unsigned(u_int32_t, *tl++);
|
stateid.seqid = fxdr_unsigned(u_int32_t, *tl++);
|
||||||
NFSBCOPY((caddr_t)tl,(caddr_t)stateid.other,NFSX_STATEIDOTHER);
|
NFSBCOPY((caddr_t)tl,(caddr_t)stateid.other,NFSX_STATEIDOTHER);
|
||||||
@ -3056,7 +3057,7 @@ nfsrvd_open(struct nfsrv_descript *nd, __unused int isdgram,
|
|||||||
&exclusive_flag, &nva, cverf, create, aclp, &attrbits,
|
&exclusive_flag, &nva, cverf, create, aclp, &attrbits,
|
||||||
nd->nd_cred, exp, &vp);
|
nd->nd_cred, exp, &vp);
|
||||||
} else if (claim == NFSV4OPEN_CLAIMPREVIOUS || claim ==
|
} else if (claim == NFSV4OPEN_CLAIMPREVIOUS || claim ==
|
||||||
NFSV4OPEN_CLAIMFH) {
|
NFSV4OPEN_CLAIMFH || claim == NFSV4OPEN_CLAIMDELEGATECURFH) {
|
||||||
if (claim == NFSV4OPEN_CLAIMPREVIOUS) {
|
if (claim == NFSV4OPEN_CLAIMPREVIOUS) {
|
||||||
NFSM_DISSECT(tl, u_int32_t *, NFSX_UNSIGNED);
|
NFSM_DISSECT(tl, u_int32_t *, NFSX_UNSIGNED);
|
||||||
i = fxdr_unsigned(int, *tl);
|
i = fxdr_unsigned(int, *tl);
|
||||||
@ -3074,7 +3075,6 @@ nfsrvd_open(struct nfsrv_descript *nd, __unused int isdgram,
|
|||||||
}
|
}
|
||||||
stp->ls_flags |= NFSLCK_RECLAIM;
|
stp->ls_flags |= NFSLCK_RECLAIM;
|
||||||
} else {
|
} else {
|
||||||
/* CLAIM_NULL_FH */
|
|
||||||
if (nd->nd_repstat == 0 && create == NFSV4OPEN_CREATE)
|
if (nd->nd_repstat == 0 && create == NFSV4OPEN_CREATE)
|
||||||
nd->nd_repstat = NFSERR_INVAL;
|
nd->nd_repstat = NFSERR_INVAL;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user