NFSD: Add a helper that encodes NFSv3 directory offset cookies
authorChuck Lever <chuck.lever@oracle.com>
Fri, 13 Nov 2020 21:53:17 +0000 (16:53 -0500)
committerChuck Lever <chuck.lever@oracle.com>
Mon, 22 Mar 2021 14:18:58 +0000 (10:18 -0400)
Refactor: Add helper function similar to nfs3svc_encode_cookie3().

Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
fs/nfsd/nfsproc.c
fs/nfsd/nfsxdr.c
fs/nfsd/xdr.h

index 2088bb0..5a0dd6e 100644 (file)
@@ -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;
index 39d296a..a87b21c 100644 (file)
@@ -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);
index 277b74c..651de13 100644 (file)
@@ -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);