NFSD: Record status of async copy operation in struct nfsd4_copy
authorChuck Lever <chuck.lever@oracle.com>
Tue, 30 Apr 2024 20:05:10 +0000 (16:05 -0400)
committerChuck Lever <chuck.lever@oracle.com>
Mon, 6 May 2024 13:07:23 +0000 (09:07 -0400)
After a client has started an asynchronous COPY operation, a
subsequent OFFLOAD_STATUS operation will need to report the status
code once that COPY operation has completed. The recorded status
record will be used by a subsequent patch.

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

index 3dc173b29803ff8f6e154d1c45fe8a9f005c10f7..7e6580384cdb6a83d03a337ced4808b5ac5b5344 100644 (file)
@@ -1737,7 +1737,7 @@ static void cleanup_async_copy(struct nfsd4_copy *copy)
        nfs4_put_copy(copy);
 }
 
-static void nfsd4_send_cb_offload(struct nfsd4_copy *copy, __be32 nfserr)
+static void nfsd4_send_cb_offload(struct nfsd4_copy *copy)
 {
        struct nfsd4_cb_offload *cbo;
 
@@ -1747,12 +1747,12 @@ static void nfsd4_send_cb_offload(struct nfsd4_copy *copy, __be32 nfserr)
 
        memcpy(&cbo->co_res, &copy->cp_res, sizeof(copy->cp_res));
        memcpy(&cbo->co_fh, &copy->fh, sizeof(copy->fh));
-       cbo->co_nfserr = nfserr;
+       cbo->co_nfserr = copy->nfserr;
 
        nfsd4_init_cb(&cbo->co_cb, copy->cp_clp, &nfsd4_cb_offload_ops,
                      NFSPROC4_CLNT_CB_OFFLOAD);
        trace_nfsd_cb_offload(copy->cp_clp, &cbo->co_res.cb_stateid,
-                             &cbo->co_fh, copy->cp_count, nfserr);
+                             &cbo->co_fh, copy->cp_count, copy->nfserr);
        nfsd4_run_cb(&cbo->co_cb);
 }
 
@@ -1766,7 +1766,6 @@ static void nfsd4_send_cb_offload(struct nfsd4_copy *copy, __be32 nfserr)
 static int nfsd4_do_async_copy(void *data)
 {
        struct nfsd4_copy *copy = (struct nfsd4_copy *)data;
-       __be32 nfserr;
 
        trace_nfsd_copy_do_async(copy);
        if (nfsd4_ssc_is_inter(copy)) {
@@ -1777,24 +1776,24 @@ static int nfsd4_do_async_copy(void *data)
                if (IS_ERR(filp)) {
                        switch (PTR_ERR(filp)) {
                        case -EBADF:
-                               nfserr = nfserr_wrong_type;
+                               copy->nfserr = nfserr_wrong_type;
                                break;
                        default:
-                               nfserr = nfserr_offload_denied;
+                               copy->nfserr = nfserr_offload_denied;
                        }
                        /* ss_mnt will be unmounted by the laundromat */
                        goto do_callback;
                }
-               nfserr = nfsd4_do_copy(copy, filp, copy->nf_dst->nf_file,
-                                      false);
+               copy->nfserr = nfsd4_do_copy(copy, filp, copy->nf_dst->nf_file,
+                                            false);
                nfsd4_cleanup_inter_ssc(copy->ss_nsui, filp, copy->nf_dst);
        } else {
-               nfserr = nfsd4_do_copy(copy, copy->nf_src->nf_file,
-                                      copy->nf_dst->nf_file, false);
+               copy->nfserr = nfsd4_do_copy(copy, copy->nf_src->nf_file,
+                                            copy->nf_dst->nf_file, false);
        }
 
 do_callback:
-       nfsd4_send_cb_offload(copy, nfserr);
+       nfsd4_send_cb_offload(copy);
        cleanup_async_copy(copy);
        return 0;
 }
index 446e72b0385e74e06900e3667e370f440a951bdc..62805931e8572253f6db79ae30fd9adee9020d51 100644 (file)
@@ -694,6 +694,7 @@ struct nfsd4_copy {
 #define NFSD4_COPY_F_COMMITTED         (3)
 
        /* response */
+       __be32                  nfserr;
        struct nfsd42_write_res cp_res;
        struct knfsd_fh         fh;