|
@@ -2862,6 +2862,27 @@ static int nfs4_set_delegation(struct nfs4_delegation *dp, int flag)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+static void nfsd4_open_deleg_none_ext(struct nfsd4_open *open, int status)
|
|
|
+{
|
|
|
+ open->op_delegate_type = NFS4_OPEN_DELEGATE_NONE_EXT;
|
|
|
+ if (status == -EAGAIN)
|
|
|
+ open->op_why_no_deleg = WND4_CONTENTION;
|
|
|
+ else {
|
|
|
+ open->op_why_no_deleg = WND4_RESOURCE;
|
|
|
+ switch (open->op_deleg_want) {
|
|
|
+ case NFS4_SHARE_WANT_READ_DELEG:
|
|
|
+ case NFS4_SHARE_WANT_WRITE_DELEG:
|
|
|
+ case NFS4_SHARE_WANT_ANY_DELEG:
|
|
|
+ break;
|
|
|
+ case NFS4_SHARE_WANT_CANCEL:
|
|
|
+ open->op_why_no_deleg = WND4_CANCELLED;
|
|
|
+ break;
|
|
|
+ case NFS4_SHARE_WANT_NO_DELEG:
|
|
|
+ BUG(); /* not supposed to get here */
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
/*
|
|
|
* Attempt to hand out a delegation.
|
|
|
*/
|
|
@@ -2918,25 +2939,9 @@ out:
|
|
|
open->op_delegate_type != NFS4_OPEN_DELEGATE_NONE)
|
|
|
dprintk("NFSD: WARNING: refusing delegation reclaim\n");
|
|
|
|
|
|
- if (open->op_deleg_want) {
|
|
|
- open->op_delegate_type = NFS4_OPEN_DELEGATE_NONE_EXT;
|
|
|
- if (status == -EAGAIN)
|
|
|
- open->op_why_no_deleg = WND4_CONTENTION;
|
|
|
- else {
|
|
|
- open->op_why_no_deleg = WND4_RESOURCE;
|
|
|
- switch (open->op_deleg_want) {
|
|
|
- case NFS4_SHARE_WANT_READ_DELEG:
|
|
|
- case NFS4_SHARE_WANT_WRITE_DELEG:
|
|
|
- case NFS4_SHARE_WANT_ANY_DELEG:
|
|
|
- break;
|
|
|
- case NFS4_SHARE_WANT_CANCEL:
|
|
|
- open->op_why_no_deleg = WND4_CANCELLED;
|
|
|
- break;
|
|
|
- case NFS4_SHARE_WANT_NO_DELEG:
|
|
|
- BUG(); /* not supposed to get here */
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
+ /* 4.1 client asking for a delegation? */
|
|
|
+ if (open->op_deleg_want)
|
|
|
+ nfsd4_open_deleg_none_ext(open, status);
|
|
|
}
|
|
|
return;
|
|
|
out_free:
|