NFSD: Clean up nfsd4_encode_setattr()
authorChuck Lever <chuck.lever@oracle.com>
Mon, 18 Sep 2023 13:57:07 +0000 (09:57 -0400)
committerChuck Lever <chuck.lever@oracle.com>
Mon, 16 Oct 2023 16:44:11 +0000 (12:44 -0400)
De-duplicate the encoding of bitmap4 results in
nfsd4_encode_setattr().

Reviewed-by: Jeff Layton <jlayton@kernel.org>
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
fs/nfsd/nfs4xdr.c

index 55a6d1b9da770b500e08ff625595fd0062b8662a..df2383fbd0e710c97b7df0e4ffc6b1ad52ca0f28 100644 (file)
@@ -4433,34 +4433,25 @@ nfsd4_encode_secinfo_no_name(struct nfsd4_compoundres *resp, __be32 nfserr,
        return nfsd4_do_encode_secinfo(xdr, secinfo->sin_exp);
 }
 
-/*
- * The SETATTR encode routine is special -- it always encodes a bitmap,
- * regardless of the error status.
- */
 static __be32
 nfsd4_encode_setattr(struct nfsd4_compoundres *resp, __be32 nfserr,
                     union nfsd4_op_u *u)
 {
        struct nfsd4_setattr *setattr = &u->setattr;
-       struct xdr_stream *xdr = resp->xdr;
-       __be32 *p;
+       __be32 status;
 
-       p = xdr_reserve_space(xdr, 16);
-       if (!p)
-               return nfserr_resource;
-       if (nfserr) {
-               *p++ = cpu_to_be32(3);
-               *p++ = cpu_to_be32(0);
-               *p++ = cpu_to_be32(0);
-               *p++ = cpu_to_be32(0);
-       }
-       else {
-               *p++ = cpu_to_be32(3);
-               *p++ = cpu_to_be32(setattr->sa_bmval[0]);
-               *p++ = cpu_to_be32(setattr->sa_bmval[1]);
-               *p++ = cpu_to_be32(setattr->sa_bmval[2]);
+       switch (nfserr) {
+       case nfs_ok:
+               /* attrsset */
+               status = nfsd4_encode_bitmap4(resp->xdr, setattr->sa_bmval[0],
+                                             setattr->sa_bmval[1],
+                                             setattr->sa_bmval[2]);
+               break;
+       default:
+               /* attrsset */
+               status = nfsd4_encode_bitmap4(resp->xdr, 0, 0, 0);
        }
-       return nfserr;
+       return status != nfs_ok ? status : nfserr;
 }
 
 static __be32