summaryrefslogtreecommitdiff
path: root/fs/nfsd/nfs3xdr.c
diff options
context:
space:
mode:
authorChuck Lever <chuck.lever@oracle.com>2020-11-10 09:57:14 -0500
committerChuck Lever <chuck.lever@oracle.com>2021-03-22 10:18:55 -0400
commita161e6c76aeba835e475a2f27dbbe5c37e565e94 (patch)
tree7cceba50ef0c175dca424b5429cf783d6eeec171 /fs/nfsd/nfs3xdr.c
parent5ef2826c761079e27904c85034df34e601b82d94 (diff)
downloadlinux-a161e6c76aeba835e475a2f27dbbe5c37e565e94.tar.gz
NFSD: Add a helper that encodes NFSv3 directory offset cookies
Refactor: De-duplicate identical code that handles encoding of directory offset cookies across page boundaries. Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Diffstat (limited to 'fs/nfsd/nfs3xdr.c')
-rw-r--r--fs/nfsd/nfs3xdr.c36
1 files changed, 23 insertions, 13 deletions
diff --git a/fs/nfsd/nfs3xdr.c b/fs/nfsd/nfs3xdr.c
index eab14b52db20..e334a1454edb 100644
--- a/fs/nfsd/nfs3xdr.c
+++ b/fs/nfsd/nfs3xdr.c
@@ -1219,6 +1219,28 @@ out:
return p;
}
+/**
+ * nfs3svc_encode_cookie3 - Encode a directory offset cookie
+ * @resp: readdir result context
+ * @offset: offset cookie to encode
+ *
+ */
+void nfs3svc_encode_cookie3(struct nfsd3_readdirres *resp, u64 offset)
+{
+ if (!resp->offset)
+ return;
+
+ if (resp->offset1) {
+ /* we ended up with offset on a page boundary */
+ *resp->offset = cpu_to_be32(offset >> 32);
+ *resp->offset1 = cpu_to_be32(offset & 0xffffffff);
+ resp->offset1 = NULL;
+ } else {
+ xdr_encode_hyper(resp->offset, offset);
+ }
+ resp->offset = NULL;
+}
+
/*
* Encode a directory entry. This one works for both normal readdir
* and readdirplus.
@@ -1244,19 +1266,7 @@ encode_entry(struct readdir_cd *ccd, const char *name, int namlen,
int elen; /* estimated entry length in words */
int num_entry_words = 0; /* actual number of words */
- if (cd->offset) {
- u64 offset64 = offset;
-
- if (unlikely(cd->offset1)) {
- /* we ended up with offset on a page boundary */
- *cd->offset = htonl(offset64 >> 32);
- *cd->offset1 = htonl(offset64 & 0xffffffff);
- cd->offset1 = NULL;
- } else {
- xdr_encode_hyper(cd->offset, offset64);
- }
- cd->offset = NULL;
- }
+ nfs3svc_encode_cookie3(cd, offset);
/*
dprintk("encode_entry(%.*s @%ld%s)\n",