Commit 8d18f6c5 authored by Anna Schumaker's avatar Anna Schumaker
Browse files

NFSv4.2: Fix READ_PLUS size calculations



I bump the decode_read_plus_maxsz to account for hole segments, but I
need to subtract out this increase when calling
rpc_prepare_reply_pages() so the common case of single data segment
replies can be directly placed into the xdr pages without needing to be
shifted around.

Reported-by: default avatarChuck Lever <chuck.lever@oracle.com>
Fixes: d3b00a80 ("NFS: Replace the READ_PLUS decoding code")
Signed-off-by: default avatarAnna Schumaker <Anna.Schumaker@Netapp.com>
parent bb05a617
Loading
Loading
Loading
Loading
+9 −3
Original line number Diff line number Diff line
@@ -54,10 +54,16 @@
					(1 /* data_content4 */ + \
					 2 /* data_info4.di_offset */ + \
					 1 /* data_info4.di_length */)
#define NFS42_READ_PLUS_HOLE_SEGMENT_SIZE \
					(1 /* data_content4 */ + \
					 2 /* data_info4.di_offset */ + \
					 2 /* data_info4.di_length */)
#define READ_PLUS_SEGMENT_SIZE_DIFF	(NFS42_READ_PLUS_HOLE_SEGMENT_SIZE - \
					 NFS42_READ_PLUS_DATA_SEGMENT_SIZE)
#define decode_read_plus_maxsz		(op_decode_hdr_maxsz + \
					 1 /* rpr_eof */ + \
					 1 /* rpr_contents count */ + \
					 NFS42_READ_PLUS_DATA_SEGMENT_SIZE)
					 NFS42_READ_PLUS_HOLE_SEGMENT_SIZE)
#define encode_seek_maxsz		(op_encode_hdr_maxsz + \
					 encode_stateid_maxsz + \
					 2 /* offset */ + \
@@ -617,8 +623,8 @@ static void nfs4_xdr_enc_read_plus(struct rpc_rqst *req,
	encode_putfh(xdr, args->fh, &hdr);
	encode_read_plus(xdr, args, &hdr);

	rpc_prepare_reply_pages(req, args->pages, args->pgbase,
				args->count, hdr.replen);
	rpc_prepare_reply_pages(req, args->pages, args->pgbase, args->count,
				hdr.replen - READ_PLUS_SEGMENT_SIZE_DIFF);
	encode_nops(&hdr);
}