NFSD: Shrink size of struct nfsd4_copy
authorChuck Lever <chuck.lever@oracle.com>
Wed, 27 Jul 2022 18:40:22 +0000 (14:40 -0400)
committerChuck Lever <chuck.lever@oracle.com>
Sat, 30 Jul 2022 00:16:58 +0000 (20:16 -0400)
struct nfsd4_copy is part of struct nfsd4_op, which resides in an
8-element array.

sizeof(struct nfsd4_op):
Before: /* size: 1696, cachelines: 27, members: 5 */
After:  /* size: 672, cachelines: 11, members: 5 */

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

index 9090532..d8621d0 100644 (file)
@@ -1289,6 +1289,7 @@ void nfs4_put_copy(struct nfsd4_copy *copy)
 {
        if (!refcount_dec_and_test(&copy->refcount))
                return;
+       kfree(copy->cp_src);
        kfree(copy);
 }
 
@@ -1549,7 +1550,7 @@ nfsd4_setup_inter_ssc(struct svc_rqst *rqstp,
        if (status)
                goto out;
 
-       status = nfsd4_interssc_connect(&copy->cp_src, rqstp, mount);
+       status = nfsd4_interssc_connect(copy->cp_src, rqstp, mount);
        if (status)
                goto out;
 
@@ -1761,7 +1762,7 @@ static void dup_copy_fields(struct nfsd4_copy *src, struct nfsd4_copy *dst)
                dst->nf_src = nfsd_file_get(src->nf_src);
 
        memcpy(&dst->cp_stateid, &src->cp_stateid, sizeof(src->cp_stateid));
-       memcpy(&dst->cp_src, &src->cp_src, sizeof(struct nl4_server));
+       memcpy(dst->cp_src, src->cp_src, sizeof(struct nl4_server));
        memcpy(&dst->stateid, &src->stateid, sizeof(src->stateid));
        memcpy(&dst->c_fh, &src->c_fh, sizeof(src->c_fh));
        dst->ss_mnt = src->ss_mnt;
@@ -1855,6 +1856,9 @@ nfsd4_copy(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
                async_copy = kzalloc(sizeof(struct nfsd4_copy), GFP_KERNEL);
                if (!async_copy)
                        goto out_err;
+               async_copy->cp_src = kmalloc(sizeof(*async_copy->cp_src), GFP_KERNEL);
+               if (!async_copy->cp_src)
+                       goto out_err;
                if (!nfs4_init_copy_state(nn, copy))
                        goto out_err;
                refcount_set(&async_copy->refcount, 1);
index 06a9d76..90d3a1a 100644 (file)
@@ -1920,6 +1920,9 @@ nfsd4_decode_copy(struct nfsd4_compoundargs *argp, struct nfsd4_copy *copy)
 
        if (xdr_stream_decode_u32(argp->xdr, &count) < 0)
                return nfserr_bad_xdr;
+       copy->cp_src = svcxdr_tmpalloc(argp, sizeof(*copy->cp_src));
+       if (copy->cp_src == NULL)
+               return nfserr_jukebox;
        copy->cp_intra = false;
        if (count == 0) { /* intra-server copy */
                copy->cp_intra = true;
@@ -1927,7 +1930,7 @@ nfsd4_decode_copy(struct nfsd4_compoundargs *argp, struct nfsd4_copy *copy)
        }
 
        /* decode all the supplied server addresses but use only the first */
-       status = nfsd4_decode_nl4_server(argp, &copy->cp_src);
+       status = nfsd4_decode_nl4_server(argp, copy->cp_src);
        if (status)
                return status;
 
index f253fc3..f5ad293 100644 (file)
@@ -540,7 +540,7 @@ struct nfsd4_copy {
        u64                     cp_src_pos;
        u64                     cp_dst_pos;
        u64                     cp_count;
-       struct nl4_server       cp_src;
+       struct nl4_server       *cp_src;
        bool                    cp_intra;
 
        /* both */