NFSD: Clean up nfsd4_encode_entry4()
authorChuck Lever <chuck.lever@oracle.com>
Wed, 4 Oct 2023 13:42:03 +0000 (09:42 -0400)
committerChuck Lever <chuck.lever@oracle.com>
Mon, 16 Oct 2023 16:44:35 +0000 (12:44 -0400)
Reshape nfsd4_encode_entry4() to be more like the legacy dirent
encoders, which were recently rewritten to use xdr_stream.

Reviewed-by: Jeff Layton <jlayton@kernel.org>
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
fs/nfsd/nfs4xdr.c
fs/nfsd/xdr4.h

index 210cb924b9b4349000321779780250646440e8ef..71f3bc09c1c5e37d2bc217b92ee7e270a963ff07 100644 (file)
@@ -3772,7 +3772,6 @@ nfsd4_encode_entry4(void *ccdv, const char *name, int namlen,
        u32 name_and_cookie;
        int entry_bytes;
        __be32 nfserr = nfserr_toosmall;
-       __be32 *p;
 
        /* In nfsv4, "." and ".." never make it onto the wire.. */
        if (name && isdotent(name, namlen)) {
@@ -3783,17 +3782,15 @@ nfsd4_encode_entry4(void *ccdv, const char *name, int namlen,
        /* Encode the previous entry's cookie value */
        nfsd4_encode_entry4_nfs_cookie4(cd, offset);
 
-       p = xdr_reserve_space(xdr, 4);
-       if (!p)
+       if (xdr_stream_encode_item_present(xdr) != XDR_UNIT)
                goto fail;
-       *p++ = xdr_one;                             /* mark entry present */
+
+       /* Reserve send buffer space for this entry's cookie value. */
        cookie_offset = xdr->buf->len;
-       p = xdr_reserve_space(xdr, 3*4 + namlen);
-       if (!p)
+       if (nfsd4_encode_nfs_cookie4(xdr, OFFSET_MAX) != nfs_ok)
+               goto fail;
+       if (nfsd4_encode_component4(xdr, name, namlen) != nfs_ok)
                goto fail;
-       p = xdr_encode_hyper(p, OFFSET_MAX);        /* offset of next entry */
-       p = xdr_encode_array(p, name, namlen);      /* name length & name */
-
        nfserr = nfsd4_encode_entry4_fattr(cd, name, namlen);
        switch (nfserr) {
        case nfs_ok:
index c8c21b2d4d149702e70d58ecea32ea25c7f34fa2..a97297915112a7f846a2ebf4be9c2a0a23c63923 100644 (file)
@@ -120,6 +120,7 @@ nfsd4_encode_uint64_t(struct xdr_stream *xdr, u64 val)
 }
 
 #define nfsd4_encode_changeid4(x, v)   nfsd4_encode_uint64_t(x, v)
+#define nfsd4_encode_nfs_cookie4(x, v) nfsd4_encode_uint64_t(x, v)
 #define nfsd4_encode_length4(x, v)     nfsd4_encode_uint64_t(x, v)
 #define nfsd4_encode_offset4(x, v)     nfsd4_encode_uint64_t(x, v)
 
@@ -174,6 +175,8 @@ nfsd4_encode_opaque(struct xdr_stream *xdr, const void *data, size_t size)
        return nfs_ok;
 }
 
+#define nfsd4_encode_component4(x, d, s)       nfsd4_encode_opaque(x, d, s)
+
 struct nfsd4_compound_state {
        struct svc_fh           current_fh;
        struct svc_fh           save_fh;