diff mbox series

[v1,3/5] NFSD: Add an nfsd4_encode_nfs_cookie4() helper

Message ID 169642691755.7503.7423015225006996766.stgit@klimt.1015granger.net (mailing list archive)
State New, archived
Headers show
Series Clean up XDR encoders for NFSv4 READDIR | expand

Commit Message

Chuck Lever Oct. 4, 2023, 1:41 p.m. UTC
From: Chuck Lever <chuck.lever@oracle.com>

De-duplicate the entry4 cookie encoder, similar to the arrangement
for the NFSv2 and NFSv3 directory entry encoders.

Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
---
 fs/nfsd/nfs4xdr.c |   32 ++++++++++++++++++++------------
 1 file changed, 20 insertions(+), 12 deletions(-)
diff mbox series

Patch

diff --git a/fs/nfsd/nfs4xdr.c b/fs/nfsd/nfs4xdr.c
index 26a9391d7766..3eba3f316d97 100644
--- a/fs/nfsd/nfs4xdr.c
+++ b/fs/nfsd/nfs4xdr.c
@@ -3660,6 +3660,22 @@  __be32 nfsd4_encode_fattr_to_buf(__be32 **p, int words,
 	return ret;
 }
 
+/*
+ * The buffer space for this field was reserved during a previous
+ * call to nfsd4_encode_entry4().
+ */
+static void nfsd4_encode_entry4_nfs_cookie4(const struct nfsd4_readdir *readdir,
+					    u64 offset)
+{
+	__be64 cookie = cpu_to_be64(offset);
+	struct xdr_stream *xdr = readdir->xdr;
+
+	if (!readdir->cookie_offset)
+		return;
+	write_bytes_to_xdr_buf(xdr->buf, readdir->cookie_offset, &cookie,
+			       sizeof(cookie));
+}
+
 static inline int attributes_need_mount(u32 *bmval)
 {
 	if (bmval[0] & ~(FATTR4_WORD0_RDATTR_ERROR | FATTR4_WORD0_LEASE_TIME))
@@ -3752,7 +3768,6 @@  nfsd4_encode_entry4(void *ccdv, const char *name, int namlen,
 	u32 name_and_cookie;
 	int entry_bytes;
 	__be32 nfserr = nfserr_toosmall;
-	__be64 wire_offset;
 	__be32 *p;
 
 	/* In nfsv4, "." and ".." never make it onto the wire.. */
@@ -3761,11 +3776,8 @@  nfsd4_encode_entry4(void *ccdv, const char *name, int namlen,
 		return 0;
 	}
 
-	if (cd->cookie_offset) {
-		wire_offset = cpu_to_be64(offset);
-		write_bytes_to_xdr_buf(xdr->buf, cd->cookie_offset,
-							&wire_offset, 8);
-	}
+	/* Encode the previous entry's cookie value */
+	nfsd4_encode_entry4_nfs_cookie4(cd, offset);
 
 	p = xdr_reserve_space(xdr, 4);
 	if (!p)
@@ -4447,7 +4459,6 @@  nfsd4_encode_readdir(struct nfsd4_compoundres *resp, __be32 nfserr,
 	int maxcount;
 	int bytes_left;
 	loff_t offset;
-	__be64 wire_offset;
 	struct xdr_stream *xdr = resp->xdr;
 	int starting_len = xdr->buf->len;
 	__be32 *p;
@@ -4505,11 +4516,8 @@  nfsd4_encode_readdir(struct nfsd4_compoundres *resp, __be32 nfserr,
 	if (nfserr)
 		goto err_no_verf;
 
-	if (readdir->cookie_offset) {
-		wire_offset = cpu_to_be64(offset);
-		write_bytes_to_xdr_buf(xdr->buf, readdir->cookie_offset,
-							&wire_offset, 8);
-	}
+	/* Encode the final entry's cookie value */
+	nfsd4_encode_entry4_nfs_cookie4(readdir, offset);
 
 	p = xdr_reserve_space(xdr, 8);
 	if (!p) {