nfsd41: refactor nfsd4_deleg_xgrade_none_ext logic out of nfsd4_process_open2
authorBenny Halevy <benny@tonian.com>
Tue, 21 Feb 2012 22:16:54 +0000 (14:16 -0800)
committerJ. Bruce Fields <bfields@redhat.com>
Tue, 6 Mar 2012 23:13:35 +0000 (18:13 -0500)
Handle the case where the nfsv4.1 client asked to uprade or downgrade
its delegations and server returns no delegation.

In this case, op_delegate_type is set to NFS4_OPEN_DELEGATE_NONE_EXT
and op_why_no_deleg is set respectively to WND4_NOT_SUPP_{UP,DOWN}GRADE

Signed-off-by: Benny Halevy <bhalevy@tonian.com>
Signed-off-by: J. Bruce Fields <bfields@redhat.com>
fs/nfsd/nfs4state.c

index 1b3e2bd..97dd2c7 100644 (file)
@@ -2951,6 +2951,24 @@ out_no_deleg:
        goto out;
 }
 
+static void nfsd4_deleg_xgrade_none_ext(struct nfsd4_open *open,
+                                       struct nfs4_delegation *dp)
+{
+       if (open->op_deleg_want == NFS4_SHARE_WANT_READ_DELEG &&
+           dp->dl_type == NFS4_OPEN_DELEGATE_WRITE) {
+               open->op_delegate_type = NFS4_OPEN_DELEGATE_NONE_EXT;
+               open->op_why_no_deleg = WND4_NOT_SUPP_DOWNGRADE;
+       } else if (open->op_deleg_want == NFS4_SHARE_WANT_WRITE_DELEG &&
+                  dp->dl_type == NFS4_OPEN_DELEGATE_WRITE) {
+               open->op_delegate_type = NFS4_OPEN_DELEGATE_NONE_EXT;
+               open->op_why_no_deleg = WND4_NOT_SUPP_UPGRADE;
+       }
+       /* Otherwise the client must be confused wanting a delegation
+        * it already has, therefore we don't return
+        * NFS4_OPEN_DELEGATE_NONE_EXT and reason.
+        */
+}
+
 /*
  * called with nfs4_lock_state() held.
  */
@@ -3035,21 +3053,8 @@ nodeleg:
 out:
        /* 4.1 client trying to upgrade/downgrade delegation? */
        if (open->op_delegate_type == NFS4_OPEN_DELEGATE_NONE && dp &&
-           open->op_deleg_want) {
-               if (open->op_deleg_want == NFS4_SHARE_WANT_READ_DELEG &&
-                   dp->dl_type == NFS4_OPEN_DELEGATE_WRITE) {
-                       open->op_delegate_type = NFS4_OPEN_DELEGATE_NONE_EXT;
-                       open->op_why_no_deleg = WND4_NOT_SUPP_DOWNGRADE;
-               } else if (open->op_deleg_want == NFS4_SHARE_WANT_WRITE_DELEG &&
-                          dp->dl_type == NFS4_OPEN_DELEGATE_WRITE) {
-                       open->op_delegate_type = NFS4_OPEN_DELEGATE_NONE_EXT;
-                       open->op_why_no_deleg = WND4_NOT_SUPP_UPGRADE;
-               }
-               /* Otherwise the client must be confused wanting a delegation
-                * it already has, therefore we don't return
-                * NFS4_OPEN_DELEGATE_NONE_EXT and reason.
-                */
-       }
+           open->op_deleg_want)
+               nfsd4_deleg_xgrade_none_ext(open, dp);
 
        if (fp)
                put_nfs4_file(fp);