NFSD: Clean up nfsd4_encode_layoutget()

De-duplicate the open-coded stateid4 encoder. Adopt the use of the
conventional current XDR encoding helpers. Refactor the encoder to
align with the XDR specification.

Reviewed-by: Jeff Layton <jlayton@kernel.org>
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
This commit is contained in:
Chuck Lever 2023-09-25 09:27:58 -04:00
parent 73debe47df
commit 69f5f0194a
2 changed files with 36 additions and 18 deletions

View File

@ -4864,32 +4864,48 @@ toosmall:
return nfserr_toosmall;
}
static __be32
nfsd4_encode_layout4(struct xdr_stream *xdr, const struct nfsd4_layoutget *lgp)
{
const struct nfsd4_layout_ops *ops = nfsd4_layout_ops[lgp->lg_layout_type];
__be32 status;
/* lo_offset */
status = nfsd4_encode_offset4(xdr, lgp->lg_seg.offset);
if (status != nfs_ok)
return status;
/* lo_length */
status = nfsd4_encode_length4(xdr, lgp->lg_seg.length);
if (status != nfs_ok)
return status;
/* lo_iomode */
if (xdr_stream_encode_u32(xdr, lgp->lg_seg.iomode) != XDR_UNIT)
return nfserr_resource;
/* lo_content */
if (xdr_stream_encode_u32(xdr, lgp->lg_layout_type) != XDR_UNIT)
return nfserr_resource;
return ops->encode_layoutget(xdr, lgp);
}
static __be32
nfsd4_encode_layoutget(struct nfsd4_compoundres *resp, __be32 nfserr,
union nfsd4_op_u *u)
{
struct nfsd4_layoutget *lgp = &u->layoutget;
struct xdr_stream *xdr = resp->xdr;
const struct nfsd4_layout_ops *ops;
__be32 *p;
p = xdr_reserve_space(xdr, 36 + sizeof(stateid_opaque_t));
if (!p)
/* logr_return_on_close */
nfserr = nfsd4_encode_bool(xdr, true);
if (nfserr != nfs_ok)
return nfserr;
/* logr_stateid */
nfserr = nfsd4_encode_stateid4(xdr, &lgp->lg_sid);
if (nfserr != nfs_ok)
return nfserr;
/* logr_layout<> */
if (xdr_stream_encode_u32(xdr, 1) != XDR_UNIT)
return nfserr_resource;
*p++ = cpu_to_be32(1); /* we always set return-on-close */
*p++ = cpu_to_be32(lgp->lg_sid.si_generation);
p = xdr_encode_opaque_fixed(p, &lgp->lg_sid.si_opaque,
sizeof(stateid_opaque_t));
*p++ = cpu_to_be32(1); /* we always return a single layout */
p = xdr_encode_hyper(p, lgp->lg_seg.offset);
p = xdr_encode_hyper(p, lgp->lg_seg.length);
*p++ = cpu_to_be32(lgp->lg_seg.iomode);
*p++ = cpu_to_be32(lgp->lg_layout_type);
ops = nfsd4_layout_ops[lgp->lg_layout_type];
return ops->encode_layoutget(xdr, lgp);
return nfsd4_encode_layout4(xdr, lgp);
}
static __be32

View File

@ -118,6 +118,8 @@ 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_length4(x, v) nfsd4_encode_uint64_t(x, v)
#define nfsd4_encode_offset4(x, v) nfsd4_encode_uint64_t(x, v)
/**
* nfsd4_encode_opaque_fixed - Encode a fixed-length XDR opaque type result