NFSD: Add simple u32, u64, and bool encoders
The generic XDR encoders return a length or a negative errno. NFSv4 encoders want to know simply whether the encode ran out of stream buffer space. The return values for server-side encoding are either nfs_ok or nfserr_resource. So far I've found it adds a lot of duplicate code to try to use the generic XDR encoder utilities when encoding the simple data types in the NFSv4 operation encoders. Add a set of NFSv4-specific utilities that handle the basic XDR data types. These are added in xdr4.h so they might eventually be used by the callback server and pNFS driver encoders too. Reviewed-by: Jeff Layton <jlayton@kernel.org> Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
This commit is contained in:
parent
789ce196a3
commit
6cc5829140
111
fs/nfsd/xdr4.h
111
fs/nfsd/xdr4.h
@ -50,6 +50,117 @@
|
|||||||
#define HAS_CSTATE_FLAG(c, f) ((c)->sid_flags & (f))
|
#define HAS_CSTATE_FLAG(c, f) ((c)->sid_flags & (f))
|
||||||
#define CLEAR_CSTATE_FLAG(c, f) ((c)->sid_flags &= ~(f))
|
#define CLEAR_CSTATE_FLAG(c, f) ((c)->sid_flags &= ~(f))
|
||||||
|
|
||||||
|
/**
|
||||||
|
* nfsd4_encode_bool - Encode an XDR bool type result
|
||||||
|
* @xdr: target XDR stream
|
||||||
|
* @val: boolean value to encode
|
||||||
|
*
|
||||||
|
* Return values:
|
||||||
|
* %nfs_ok: @val encoded; @xdr advanced to next position
|
||||||
|
* %nfserr_resource: stream buffer space exhausted
|
||||||
|
*/
|
||||||
|
static __always_inline __be32
|
||||||
|
nfsd4_encode_bool(struct xdr_stream *xdr, bool val)
|
||||||
|
{
|
||||||
|
__be32 *p = xdr_reserve_space(xdr, XDR_UNIT);
|
||||||
|
|
||||||
|
if (unlikely(p == NULL))
|
||||||
|
return nfserr_resource;
|
||||||
|
*p = val ? xdr_one : xdr_zero;
|
||||||
|
return nfs_ok;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* nfsd4_encode_uint32_t - Encode an XDR uint32_t type result
|
||||||
|
* @xdr: target XDR stream
|
||||||
|
* @val: integer value to encode
|
||||||
|
*
|
||||||
|
* Return values:
|
||||||
|
* %nfs_ok: @val encoded; @xdr advanced to next position
|
||||||
|
* %nfserr_resource: stream buffer space exhausted
|
||||||
|
*/
|
||||||
|
static __always_inline __be32
|
||||||
|
nfsd4_encode_uint32_t(struct xdr_stream *xdr, u32 val)
|
||||||
|
{
|
||||||
|
__be32 *p = xdr_reserve_space(xdr, XDR_UNIT);
|
||||||
|
|
||||||
|
if (unlikely(p == NULL))
|
||||||
|
return nfserr_resource;
|
||||||
|
*p = cpu_to_be32(val);
|
||||||
|
return nfs_ok;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* nfsd4_encode_uint64_t - Encode an XDR uint64_t type result
|
||||||
|
* @xdr: target XDR stream
|
||||||
|
* @val: integer value to encode
|
||||||
|
*
|
||||||
|
* Return values:
|
||||||
|
* %nfs_ok: @val encoded; @xdr advanced to next position
|
||||||
|
* %nfserr_resource: stream buffer space exhausted
|
||||||
|
*/
|
||||||
|
static __always_inline __be32
|
||||||
|
nfsd4_encode_uint64_t(struct xdr_stream *xdr, u64 val)
|
||||||
|
{
|
||||||
|
__be32 *p = xdr_reserve_space(xdr, XDR_UNIT * 2);
|
||||||
|
|
||||||
|
if (unlikely(p == NULL))
|
||||||
|
return nfserr_resource;
|
||||||
|
put_unaligned_be64(val, p);
|
||||||
|
return nfs_ok;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* nfsd4_encode_opaque_fixed - Encode a fixed-length XDR opaque type result
|
||||||
|
* @xdr: target XDR stream
|
||||||
|
* @data: pointer to data
|
||||||
|
* @size: length of data in bytes
|
||||||
|
*
|
||||||
|
* Return values:
|
||||||
|
* %nfs_ok: @data encoded; @xdr advanced to next position
|
||||||
|
* %nfserr_resource: stream buffer space exhausted
|
||||||
|
*/
|
||||||
|
static __always_inline __be32
|
||||||
|
nfsd4_encode_opaque_fixed(struct xdr_stream *xdr, const void *data,
|
||||||
|
size_t size)
|
||||||
|
{
|
||||||
|
__be32 *p = xdr_reserve_space(xdr, xdr_align_size(size));
|
||||||
|
size_t pad = xdr_pad_size(size);
|
||||||
|
|
||||||
|
if (unlikely(p == NULL))
|
||||||
|
return nfserr_resource;
|
||||||
|
memcpy(p, data, size);
|
||||||
|
if (pad)
|
||||||
|
memset((char *)p + size, 0, pad);
|
||||||
|
return nfs_ok;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* nfsd4_encode_opaque - Encode a variable-length XDR opaque type result
|
||||||
|
* @xdr: target XDR stream
|
||||||
|
* @data: pointer to data
|
||||||
|
* @size: length of data in bytes
|
||||||
|
*
|
||||||
|
* Return values:
|
||||||
|
* %nfs_ok: @data encoded; @xdr advanced to next position
|
||||||
|
* %nfserr_resource: stream buffer space exhausted
|
||||||
|
*/
|
||||||
|
static __always_inline __be32
|
||||||
|
nfsd4_encode_opaque(struct xdr_stream *xdr, const void *data, size_t size)
|
||||||
|
{
|
||||||
|
size_t pad = xdr_pad_size(size);
|
||||||
|
__be32 *p;
|
||||||
|
|
||||||
|
p = xdr_reserve_space(xdr, XDR_UNIT + xdr_align_size(size));
|
||||||
|
if (unlikely(p == NULL))
|
||||||
|
return nfserr_resource;
|
||||||
|
*p++ = cpu_to_be32(size);
|
||||||
|
memcpy(p, data, size);
|
||||||
|
if (pad)
|
||||||
|
memset((char *)p + size, 0, pad);
|
||||||
|
return nfs_ok;
|
||||||
|
}
|
||||||
|
|
||||||
struct nfsd4_compound_state {
|
struct nfsd4_compound_state {
|
||||||
struct svc_fh current_fh;
|
struct svc_fh current_fh;
|
||||||
struct svc_fh save_fh;
|
struct svc_fh save_fh;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user