Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

NFSD: Record each NFSv4 call's session slot index

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>

Chuck Lever b53a4297 281ae67c

+13
+9
fs/nfsd/nfs4proc.c
··· 1716 1716 return 0; 1717 1717 } 1718 1718 } 1719 + nfsd41_cb_destroy_referring_call_list(cb); 1719 1720 return 1; 1720 1721 } 1721 1722 ··· 1849 1848 1850 1849 nfsd4_init_cb(&cbo->co_cb, copy->cp_clp, &nfsd4_cb_offload_ops, 1851 1850 NFSPROC4_CLNT_CB_OFFLOAD); 1851 + nfsd41_cb_referring_call(&cbo->co_cb, &cbo->co_referring_sessionid, 1852 + cbo->co_referring_slotid, 1853 + cbo->co_referring_seqno); 1852 1854 trace_nfsd_cb_offload(copy->cp_clp, &cbo->co_res.cb_stateid, 1853 1855 &cbo->co_fh, copy->cp_count, copy->nfserr); 1854 1856 nfsd4_try_run_cb(&cbo->co_cb); ··· 1968 1964 memcpy(&result->cb_stateid, &copy->cp_stateid.cs_stid, 1969 1965 sizeof(result->cb_stateid)); 1970 1966 dup_copy_fields(copy, async_copy); 1967 + memcpy(async_copy->cp_cb_offload.co_referring_sessionid.data, 1968 + cstate->session->se_sessionid.data, 1969 + NFS4_MAX_SESSIONID_LEN); 1970 + async_copy->cp_cb_offload.co_referring_slotid = cstate->slot->sl_index; 1971 + async_copy->cp_cb_offload.co_referring_seqno = cstate->slot->sl_seqid; 1971 1972 async_copy->copy_task = kthread_create(nfsd4_do_async_copy, 1972 1973 async_copy, "%s", "copy thread"); 1973 1974 if (IS_ERR(async_copy->copy_task))
+4
fs/nfsd/xdr4.h
··· 676 676 __be32 co_nfserr; 677 677 unsigned int co_retries; 678 678 struct knfsd_fh co_fh; 679 + 680 + struct nfs4_sessionid co_referring_sessionid; 681 + u32 co_referring_slotid; 682 + u32 co_referring_seqno; 679 683 }; 680 684 681 685 struct nfsd4_copy {