]> www.infradead.org Git - users/hch/misc.git/commitdiff
NFSD: Record each NFSv4 call's session slot index
authorChuck Lever <chuck.lever@oracle.com>
Sat, 1 Mar 2025 18:31:51 +0000 (13:31 -0500)
committerChuck Lever <chuck.lever@oracle.com>
Sun, 11 May 2025 23:48:21 +0000 (19:48 -0400)
Help the client resolve the race between the reply to an
asynchronous COPY reply and the associated CB_OFFLOAD callback by
planting the session, slot, and sequence number of the COPY in the
CB_SEQUENCE contained in the CB_OFFLOAD COMPOUND.

Suggested-by: Trond Myklebust <trondmy@hammerspace.com>
Reviewed-by: Jeff Layton <jlayton@kernel.org>
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
fs/nfsd/nfs4proc.c
fs/nfsd/xdr4.h

index f8b2a57050122fc18fd72a2d5eb18b65ff3938b2..c20f1abcb94f131b1ec898860ba2c394b22e61e1 100644 (file)
@@ -1716,6 +1716,7 @@ static int nfsd4_cb_offload_done(struct nfsd4_callback *cb,
                        return 0;
                }
        }
+       nfsd41_cb_destroy_referring_call_list(cb);
        return 1;
 }
 
@@ -1848,6 +1849,9 @@ static void nfsd4_send_cb_offload(struct nfsd4_copy *copy)
 
        nfsd4_init_cb(&cbo->co_cb, copy->cp_clp, &nfsd4_cb_offload_ops,
                      NFSPROC4_CLNT_CB_OFFLOAD);
+       nfsd41_cb_referring_call(&cbo->co_cb, &cbo->co_referring_sessionid,
+                                cbo->co_referring_slotid,
+                                cbo->co_referring_seqno);
        trace_nfsd_cb_offload(copy->cp_clp, &cbo->co_res.cb_stateid,
                              &cbo->co_fh, copy->cp_count, copy->nfserr);
        nfsd4_try_run_cb(&cbo->co_cb);
@@ -1964,6 +1968,11 @@ nfsd4_copy(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
                memcpy(&result->cb_stateid, &copy->cp_stateid.cs_stid,
                        sizeof(result->cb_stateid));
                dup_copy_fields(copy, async_copy);
+               memcpy(async_copy->cp_cb_offload.co_referring_sessionid.data,
+                      cstate->session->se_sessionid.data,
+                      NFS4_MAX_SESSIONID_LEN);
+               async_copy->cp_cb_offload.co_referring_slotid = cstate->slot->sl_index;
+               async_copy->cp_cb_offload.co_referring_seqno = cstate->slot->sl_seqid;
                async_copy->copy_task = kthread_create(nfsd4_do_async_copy,
                                async_copy, "%s", "copy thread");
                if (IS_ERR(async_copy->copy_task))
index c26ba86dbdfde2d354e59fa3f98e679e4c3ad3f0..aa2a356da7843a18910d101b359f62de6b29ee52 100644 (file)
@@ -676,6 +676,10 @@ struct nfsd4_cb_offload {
        __be32                  co_nfserr;
        unsigned int            co_retries;
        struct knfsd_fh         co_fh;
+
+       struct nfs4_sessionid   co_referring_sessionid;
+       u32                     co_referring_slotid;
+       u32                     co_referring_seqno;
 };
 
 struct nfsd4_copy {