mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-08-05 16:54:27 +00:00

We have yet to implement a mechanism in NFSD for resolving races between a server's reply and a related callback operation. For example, a CB_OFFLOAD callback can race with the matching COPY response. The client will not recognize the copy state ID in the CB_OFFLOAD callback until the COPY response arrives. Trond adds: > It is also needed for the same kind of race with delegation > recalls, layout recalls, CB_NOTIFY_DEVICEID and would also be > helpful (although not as strongly required) for CB_NOTIFY_LOCK. RFC 8881 Section 20.9.3 describes referring call lists this way: > The csa_referring_call_lists array is the list of COMPOUND > requests, identified by session ID, slot ID, and sequence ID. > These are requests that the client previously sent to the server. > These previous requests created state that some operation(s) in > the same CB_COMPOUND as the csa_referring_call_lists are > identifying. A session ID is included because leased state is tied > to a client ID, and a client ID can have multiple sessions. See > Section 2.10.6.3. Introduce the XDR infrastructure for populating the csa_referring_call_lists argument of CB_SEQUENCE. Subsequent patches will put the referring call list to use. Note that cb_sequence_enc_sz estimates that only zero or one rcl is included in each CB_SEQUENCE, but the new infrastructure can manage any number of referring calls. Reviewed-by: Jeff Layton <jlayton@kernel.org> Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
81 lines
2.8 KiB
C
81 lines
2.8 KiB
C
/* SPDX-License-Identifier: GPL-2.0 */
|
|
#define NFS4_MAXTAGLEN 20
|
|
|
|
#define NFS4_enc_cb_null_sz 0
|
|
#define NFS4_dec_cb_null_sz 0
|
|
#define cb_compound_enc_hdr_sz 4
|
|
#define cb_compound_dec_hdr_sz (3 + (NFS4_MAXTAGLEN >> 2))
|
|
#define sessionid_sz (NFS4_MAX_SESSIONID_LEN >> 2)
|
|
#define enc_referring_call4_sz (1 + 1)
|
|
#define enc_referring_call_list4_sz (sessionid_sz + 1 + \
|
|
enc_referring_call4_sz)
|
|
#define cb_sequence_enc_sz (sessionid_sz + 4 + \
|
|
enc_referring_call_list4_sz)
|
|
#define cb_sequence_dec_sz (op_dec_sz + sessionid_sz + 4)
|
|
|
|
#define op_enc_sz 1
|
|
#define op_dec_sz 2
|
|
#define enc_nfs4_fh_sz (1 + (NFS4_FHSIZE >> 2))
|
|
#define enc_stateid_sz (NFS4_STATEID_SIZE >> 2)
|
|
#define NFS4_enc_cb_recall_sz (cb_compound_enc_hdr_sz + \
|
|
cb_sequence_enc_sz + \
|
|
1 + enc_stateid_sz + \
|
|
enc_nfs4_fh_sz)
|
|
|
|
#define NFS4_dec_cb_recall_sz (cb_compound_dec_hdr_sz + \
|
|
cb_sequence_dec_sz + \
|
|
op_dec_sz)
|
|
#define NFS4_enc_cb_layout_sz (cb_compound_enc_hdr_sz + \
|
|
cb_sequence_enc_sz + \
|
|
1 + 3 + \
|
|
enc_nfs4_fh_sz + 4)
|
|
#define NFS4_dec_cb_layout_sz (cb_compound_dec_hdr_sz + \
|
|
cb_sequence_dec_sz + \
|
|
op_dec_sz)
|
|
|
|
#define NFS4_enc_cb_notify_lock_sz (cb_compound_enc_hdr_sz + \
|
|
cb_sequence_enc_sz + \
|
|
2 + 1 + \
|
|
XDR_QUADLEN(NFS4_OPAQUE_LIMIT) + \
|
|
enc_nfs4_fh_sz)
|
|
#define NFS4_dec_cb_notify_lock_sz (cb_compound_dec_hdr_sz + \
|
|
cb_sequence_dec_sz + \
|
|
op_dec_sz)
|
|
#define enc_cb_offload_info_sz (1 + 1 + 2 + 1 + \
|
|
XDR_QUADLEN(NFS4_VERIFIER_SIZE))
|
|
#define NFS4_enc_cb_offload_sz (cb_compound_enc_hdr_sz + \
|
|
cb_sequence_enc_sz + \
|
|
enc_nfs4_fh_sz + \
|
|
enc_stateid_sz + \
|
|
enc_cb_offload_info_sz)
|
|
#define NFS4_dec_cb_offload_sz (cb_compound_dec_hdr_sz + \
|
|
cb_sequence_dec_sz + \
|
|
op_dec_sz)
|
|
#define NFS4_enc_cb_recall_any_sz (cb_compound_enc_hdr_sz + \
|
|
cb_sequence_enc_sz + \
|
|
1 + 1 + 1)
|
|
#define NFS4_dec_cb_recall_any_sz (cb_compound_dec_hdr_sz + \
|
|
cb_sequence_dec_sz + \
|
|
op_dec_sz)
|
|
|
|
/*
|
|
* 1: CB_GETATTR opcode (32-bit)
|
|
* N: file_handle
|
|
* 1: number of entry in attribute array (32-bit)
|
|
* 3: entry 0-2 in attribute array (32-bit * 3)
|
|
*/
|
|
#define NFS4_enc_cb_getattr_sz (cb_compound_enc_hdr_sz + \
|
|
cb_sequence_enc_sz + \
|
|
1 + enc_nfs4_fh_sz + 1 + 3)
|
|
/*
|
|
* 4: fattr_bitmap_maxsz
|
|
* 1: attribute array len
|
|
* 2: change attr (64-bit)
|
|
* 2: size (64-bit)
|
|
* 2: atime.seconds (64-bit)
|
|
* 1: atime.nanoseconds (32-bit)
|
|
* 2: mtime.seconds (64-bit)
|
|
* 1: mtime.nanoseconds (32-bit)
|
|
*/
|
|
#define NFS4_dec_cb_getattr_sz (cb_compound_dec_hdr_sz + \
|
|
cb_sequence_dec_sz + 4 + 1 + 2 + 2 + 2 + 1 + 2 + 1 + op_dec_sz)
|