NFSD: Add helper to decode OPEN's createhow4 argument
authorChuck Lever <chuck.lever@oracle.com>
Mon, 16 Nov 2020 22:37:42 +0000 (17:37 -0500)
committerChuck Lever <chuck.lever@oracle.com>
Mon, 30 Nov 2020 19:46:38 +0000 (14:46 -0500)
Refactor for clarity.

Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
fs/nfsd/nfs4xdr.c

index f858ab4..22e6542 100644 (file)
@@ -946,6 +946,48 @@ nfsd4_decode_lookup(struct nfsd4_compoundargs *argp, struct nfsd4_lookup *lookup
        return nfsd4_decode_component4(argp, &lookup->lo_name, &lookup->lo_len);
 }
 
+static __be32
+nfsd4_decode_createhow4(struct nfsd4_compoundargs *argp, struct nfsd4_open *open)
+{
+       __be32 status;
+
+       if (xdr_stream_decode_u32(argp->xdr, &open->op_createmode) < 0)
+               return nfserr_bad_xdr;
+       switch (open->op_createmode) {
+       case NFS4_CREATE_UNCHECKED:
+       case NFS4_CREATE_GUARDED:
+               status = nfsd4_decode_fattr4(argp, open->op_bmval,
+                                            ARRAY_SIZE(open->op_bmval),
+                                            &open->op_iattr, &open->op_acl,
+                                            &open->op_label, &open->op_umask);
+               if (status)
+                       return status;
+               break;
+       case NFS4_CREATE_EXCLUSIVE:
+               status = nfsd4_decode_verifier4(argp, &open->op_verf);
+               if (status)
+                       return status;
+               break;
+       case NFS4_CREATE_EXCLUSIVE4_1:
+               if (argp->minorversion < 1)
+                       return nfserr_bad_xdr;
+               status = nfsd4_decode_verifier4(argp, &open->op_verf);
+               if (status)
+                       return status;
+               status = nfsd4_decode_fattr4(argp, open->op_bmval,
+                                            ARRAY_SIZE(open->op_bmval),
+                                            &open->op_iattr, &open->op_acl,
+                                            &open->op_label, &open->op_umask);
+               if (status)
+                       return status;
+               break;
+       default:
+               return nfserr_bad_xdr;
+       }
+
+       return nfs_ok;
+}
+
 static __be32 nfsd4_decode_share_access(struct nfsd4_compoundargs *argp, u32 *share_access, u32 *deleg_want, u32 *deleg_when)
 {
        __be32 *p;
@@ -1046,39 +1088,9 @@ nfsd4_decode_open(struct nfsd4_compoundargs *argp, struct nfsd4_open *open)
        case NFS4_OPEN_NOCREATE:
                break;
        case NFS4_OPEN_CREATE:
-               READ_BUF(4);
-               open->op_createmode = be32_to_cpup(p++);
-               switch (open->op_createmode) {
-               case NFS4_CREATE_UNCHECKED:
-               case NFS4_CREATE_GUARDED:
-                       status = nfsd4_decode_fattr4(argp, open->op_bmval,
-                                                    ARRAY_SIZE(open->op_bmval),
-                                                    &open->op_iattr, &open->op_acl,
-                                                    &open->op_label, &open->op_umask);
-                       if (status)
-                               goto out;
-                       break;
-               case NFS4_CREATE_EXCLUSIVE:
-                       status = nfsd4_decode_verifier4(argp, &open->op_verf);
-                       if (status)
-                               return status;
-                       break;
-               case NFS4_CREATE_EXCLUSIVE4_1:
-                       if (argp->minorversion < 1)
-                               goto xdr_error;
-                       status = nfsd4_decode_verifier4(argp, &open->op_verf);
-                       if (status)
-                               return status;
-                       status = nfsd4_decode_fattr4(argp, open->op_bmval,
-                                                    ARRAY_SIZE(open->op_bmval),
-                                                    &open->op_iattr, &open->op_acl,
-                                                    &open->op_label, &open->op_umask);
-                       if (status)
-                               goto out;
-                       break;
-               default:
-                       goto xdr_error;
-               }
+               status = nfsd4_decode_createhow4(argp, open);
+               if (status)
+                       return status;
                break;
        default:
                goto xdr_error;