]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
NFSD: Remove kmalloc from nfsd4_do_async_copy()
authorChuck Lever <chuck.lever@oracle.com>
Wed, 27 Jul 2022 18:41:06 +0000 (14:41 -0400)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 10 Apr 2024 14:19:13 +0000 (16:19 +0200)
[ Upstream commit ad1e46c9b07b13659635ee5405f83ad0df143116 ]

Instead of manufacturing a phony struct nfsd_file, pass the
struct file returned by nfs42_ssc_open() directly to
nfsd4_do_copy().

[ cel: adjusted to apply to v5.15.y ]
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
fs/nfsd/nfs4proc.c

index 24c7d5e6c8c3363233edad961ad4b3ab15e8ad0d..f63c3c4c10ca7d058eb2808a8ef1469ea7426015 100644 (file)
@@ -1755,29 +1755,31 @@ static void cleanup_async_copy(struct nfsd4_copy *copy)
        nfs4_put_copy(copy);
 }
 
+/**
+ * nfsd4_do_async_copy - kthread function for background server-side COPY
+ * @data: arguments for COPY operation
+ *
+ * Return values:
+ *   %0: Copy operation is done.
+ */
 static int nfsd4_do_async_copy(void *data)
 {
        struct nfsd4_copy *copy = (struct nfsd4_copy *)data;
        struct nfsd4_copy *cb_copy;
 
        if (nfsd4_ssc_is_inter(copy)) {
-               copy->nf_src = kzalloc(sizeof(struct nfsd_file), GFP_KERNEL);
-               if (!copy->nf_src) {
-                       copy->nfserr = nfserr_serverfault;
-                       /* ss_mnt will be unmounted by the laundromat */
-                       goto do_callback;
-               }
-               copy->nf_src->nf_file = nfs42_ssc_open(copy->ss_mnt, &copy->c_fh,
-                                             &copy->stateid);
-               if (IS_ERR(copy->nf_src->nf_file)) {
+               struct file *filp;
+
+               filp = nfs42_ssc_open(copy->ss_mnt, &copy->c_fh,
+                                     &copy->stateid);
+               if (IS_ERR(filp)) {
                        copy->nfserr = nfserr_offload_denied;
                        /* ss_mnt will be unmounted by the laundromat */
                        goto do_callback;
                }
-               copy->nfserr = nfsd4_do_copy(copy, copy->nf_src->nf_file,
+               copy->nfserr = nfsd4_do_copy(copy, filp,
                                             copy->nf_dst->nf_file, false);
-               nfsd4_cleanup_inter_ssc(copy->ss_mnt, copy->nf_src->nf_file,
-                                       copy->nf_dst);
+               nfsd4_cleanup_inter_ssc(copy->ss_mnt, filp, copy->nf_dst);
        } else {
                copy->nfserr = nfsd4_do_copy(copy, copy->nf_src->nf_file,
                                             copy->nf_dst->nf_file, false);
@@ -1799,8 +1801,6 @@ do_callback:
                              &copy->fh, copy->cp_count, copy->nfserr);
        nfsd4_run_cb(&cb_copy->cp_cb);
 out:
-       if (nfsd4_ssc_is_inter(copy))
-               kfree(copy->nf_src);
        cleanup_async_copy(copy);
        return 0;
 }