]> git.baikalelectronics.ru Git - kernel.git/commitdiff
NFSD: Add a helper that encodes NFSv3 directory offset cookies
authorChuck Lever <chuck.lever@oracle.com>
Tue, 10 Nov 2020 14:57:14 +0000 (09:57 -0500)
committerChuck Lever <chuck.lever@oracle.com>
Mon, 22 Mar 2021 14:18:55 +0000 (10:18 -0400)
Refactor: De-duplicate identical code that handles encoding of
directory offset cookies across page boundaries.

Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
fs/nfsd/nfs3proc.c
fs/nfsd/nfs3xdr.c
fs/nfsd/xdr3.h

index 93d196752f87c946199011022bec2eb67f064bb5..90566cd01bdca6eb49701873494d8c474338fb1d 100644 (file)
@@ -495,17 +495,7 @@ nfsd3_proc_readdir(struct svc_rqst *rqstp)
                count += PAGE_SIZE;
        }
        resp->count = count >> 2;
-       if (resp->offset) {
-               if (unlikely(resp->offset1)) {
-                       /* we ended up with offset on a page boundary */
-                       *resp->offset = htonl(offset >> 32);
-                       *resp->offset1 = htonl(offset & 0xffffffff);
-                       resp->offset1 = NULL;
-               } else {
-                       xdr_encode_hyper(resp->offset, offset);
-               }
-               resp->offset = NULL;
-       }
+       nfs3svc_encode_cookie3(resp, offset);
 
        return rpc_success;
 }
@@ -560,17 +550,7 @@ nfsd3_proc_readdirplus(struct svc_rqst *rqstp)
                count += PAGE_SIZE;
        }
        resp->count = count >> 2;
-       if (resp->offset) {
-               if (unlikely(resp->offset1)) {
-                       /* we ended up with offset on a page boundary */
-                       *resp->offset = htonl(offset >> 32);
-                       *resp->offset1 = htonl(offset & 0xffffffff);
-                       resp->offset1 = NULL;
-               } else {
-                       xdr_encode_hyper(resp->offset, offset);
-               }
-               resp->offset = NULL;
-       }
+       nfs3svc_encode_cookie3(resp, offset);
 
 out:
        return rpc_success;
index eab14b52db202b0b48b02a15ad456cfc2667df87..e334a1454edbbcef32fbbcca0b5c69335fcd20e7 100644 (file)
@@ -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",
index 8073350418ae04bdf7268f483cdb1b95650383e7..e76e9230827e491cfd710079863d18cb1bb2c8be 100644 (file)
@@ -300,6 +300,8 @@ int nfs3svc_encode_commitres(struct svc_rqst *, __be32 *);
 
 void nfs3svc_release_fhandle(struct svc_rqst *);
 void nfs3svc_release_fhandle2(struct svc_rqst *);
+
+void nfs3svc_encode_cookie3(struct nfsd3_readdirres *resp, u64 offset);
 int nfs3svc_encode_entry(void *, const char *name,
                                int namlen, loff_t offset, u64 ino,
                                unsigned int);