aboutsummaryrefslogtreecommitdiff
path: root/sys/fs/nfsserver/nfs_nfsdstate.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/fs/nfsserver/nfs_nfsdstate.c')
-rw-r--r--sys/fs/nfsserver/nfs_nfsdstate.c28
1 files changed, 15 insertions, 13 deletions
diff --git a/sys/fs/nfsserver/nfs_nfsdstate.c b/sys/fs/nfsserver/nfs_nfsdstate.c
index d009a38fcb87..2f66d99da3e4 100644
--- a/sys/fs/nfsserver/nfs_nfsdstate.c
+++ b/sys/fs/nfsserver/nfs_nfsdstate.c
@@ -3097,7 +3097,13 @@ tryagain:
/*
* This is where we can choose to issue a delegation.
*/
- if (delegate == 0 || writedeleg == 0 ||
+ if ((new_stp->ls_flags & NFSLCK_WANTNODELEG) != 0)
+ *rflagsp |= NFSV4OPEN_WDNOTWANTED;
+ else if (nfsrv_issuedelegs == 0)
+ *rflagsp |= NFSV4OPEN_WDSUPPFTYPE;
+ else if (NFSRV_V4DELEGLIMIT(nfsrv_delegatecnt))
+ *rflagsp |= NFSV4OPEN_WDRESOURCE;
+ else if (delegate == 0 || writedeleg == 0 ||
NFSVNO_EXRDONLY(exp) || (readonly != 0 &&
nfsrv_writedelegifpos == 0) ||
!NFSVNO_DELEGOK(vp) ||
@@ -3105,11 +3111,6 @@ tryagain:
(clp->lc_flags & (LCL_CALLBACKSON | LCL_CBDOWN)) !=
LCL_CALLBACKSON)
*rflagsp |= NFSV4OPEN_WDCONTENTION;
- else if (nfsrv_issuedelegs == 0 ||
- NFSRV_V4DELEGLIMIT(nfsrv_delegatecnt))
- *rflagsp |= NFSV4OPEN_WDRESOURCE;
- else if ((new_stp->ls_flags & NFSLCK_WANTNODELEG) != 0)
- *rflagsp |= NFSV4OPEN_WDNOTWANTED;
else {
new_deleg->ls_stateid.seqid = delegstateidp->seqid = 1;
new_deleg->ls_stateid.other[0] = delegstateidp->other[0]
@@ -3160,16 +3161,17 @@ tryagain:
/*
* This is where we can choose to issue a delegation.
*/
- if (delegate == 0 || (writedeleg == 0 && readonly == 0) ||
- !NFSVNO_DELEGOK(vp) ||
+ if ((new_stp->ls_flags & NFSLCK_WANTNODELEG) != 0)
+ *rflagsp |= NFSV4OPEN_WDNOTWANTED;
+ else if (nfsrv_issuedelegs == 0)
+ *rflagsp |= NFSV4OPEN_WDSUPPFTYPE;
+ else if (NFSRV_V4DELEGLIMIT(nfsrv_delegatecnt))
+ *rflagsp |= NFSV4OPEN_WDRESOURCE;
+ else if (delegate == 0 || (writedeleg == 0 &&
+ readonly == 0) || !NFSVNO_DELEGOK(vp) ||
(clp->lc_flags & (LCL_CALLBACKSON | LCL_CBDOWN)) !=
LCL_CALLBACKSON)
*rflagsp |= NFSV4OPEN_WDCONTENTION;
- else if (nfsrv_issuedelegs == 0 ||
- NFSRV_V4DELEGLIMIT(nfsrv_delegatecnt))
- *rflagsp |= NFSV4OPEN_WDRESOURCE;
- else if ((new_stp->ls_flags & NFSLCK_WANTNODELEG) != 0)
- *rflagsp |= NFSV4OPEN_WDNOTWANTED;
else {
new_deleg->ls_stateid.seqid = delegstateidp->seqid = 1;
new_deleg->ls_stateid.other[0] = delegstateidp->other[0]