summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChuck Lever <chuck.lever@oracle.com>2020-11-13 22:53:17 +0100
committerChuck Lever <chuck.lever@oracle.com>2021-03-22 15:18:58 +0100
commitd52532002ffa217ad3fa4c3ba86c95203d21dd21 (patch)
treeb7aedf13cdecd9d738890181ca38fb968439c8d9
parentNFSD: Update the NFSv2 STATFS result encoder to use struct xdr_stream (diff)
downloadlinux-d52532002ffa217ad3fa4c3ba86c95203d21dd21.tar.xz
linux-d52532002ffa217ad3fa4c3ba86c95203d21dd21.zip
NFSD: Add a helper that encodes NFSv3 directory offset cookies
Refactor: Add helper function similar to nfs3svc_encode_cookie3(). Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
-rw-r--r--fs/nfsd/nfsproc.c3
-rw-r--r--fs/nfsd/nfsxdr.c18
-rw-r--r--fs/nfsd/xdr.h1
3 files changed, 18 insertions, 4 deletions
diff --git a/fs/nfsd/nfsproc.c b/fs/nfsd/nfsproc.c
index 2088bb0887ba..5a0dd6e23c85 100644
--- a/fs/nfsd/nfsproc.c
+++ b/fs/nfsd/nfsproc.c
@@ -595,8 +595,7 @@ nfsd_proc_readdir(struct svc_rqst *rqstp)
&resp->common, nfssvc_encode_entry);
resp->count = resp->buffer - buffer;
- if (resp->offset)
- *resp->offset = htonl(offset);
+ nfssvc_encode_nfscookie(resp, offset);
fh_put(&argp->fh);
return rpc_success;
diff --git a/fs/nfsd/nfsxdr.c b/fs/nfsd/nfsxdr.c
index 39d296aecd3e..a87b21cfe0d0 100644
--- a/fs/nfsd/nfsxdr.c
+++ b/fs/nfsd/nfsxdr.c
@@ -614,6 +614,21 @@ nfssvc_encode_statfsres(struct svc_rqst *rqstp, __be32 *p)
return 1;
}
+/**
+ * nfssvc_encode_nfscookie - Encode a directory offset cookie
+ * @resp: readdir result context
+ * @offset: offset cookie to encode
+ *
+ */
+void nfssvc_encode_nfscookie(struct nfsd_readdirres *resp, u32 offset)
+{
+ if (!resp->offset)
+ return;
+
+ *resp->offset = cpu_to_be32(offset);
+ resp->offset = NULL;
+}
+
int
nfssvc_encode_entry(void *ccdv, const char *name,
int namlen, loff_t offset, u64 ino, unsigned int d_type)
@@ -632,8 +647,7 @@ nfssvc_encode_entry(void *ccdv, const char *name,
cd->common.err = nfserr_fbig;
return -EINVAL;
}
- if (cd->offset)
- *cd->offset = htonl(offset);
+ nfssvc_encode_nfscookie(cd, offset);
/* truncate filename */
namlen = min(namlen, NFS2_MAXNAMLEN);
diff --git a/fs/nfsd/xdr.h b/fs/nfsd/xdr.h
index 277b74c511ce..651de13e62fe 100644
--- a/fs/nfsd/xdr.h
+++ b/fs/nfsd/xdr.h
@@ -157,6 +157,7 @@ int nfssvc_encode_readres(struct svc_rqst *, __be32 *);
int nfssvc_encode_statfsres(struct svc_rqst *, __be32 *);
int nfssvc_encode_readdirres(struct svc_rqst *, __be32 *);
+void nfssvc_encode_nfscookie(struct nfsd_readdirres *resp, u32 offset);
int nfssvc_encode_entry(void *, const char *name,
int namlen, loff_t offset, u64 ino, unsigned int);