SUNRPC: Add encoders for list item discriminators
Clean up. These are taken from the client-side RPC/RDMA transport to a more global header file so they can be used elsewhere. Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
This commit is contained in:
parent
a406c563e8
commit
5c266df527
@ -315,6 +315,44 @@ static inline size_t xdr_pad_size(size_t n)
|
|||||||
return xdr_align_size(n) - n;
|
return xdr_align_size(n) - n;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* xdr_stream_encode_item_present - Encode a "present" list item
|
||||||
|
* @xdr: pointer to xdr_stream
|
||||||
|
*
|
||||||
|
* Return values:
|
||||||
|
* On success, returns length in bytes of XDR buffer consumed
|
||||||
|
* %-EMSGSIZE on XDR buffer overflow
|
||||||
|
*/
|
||||||
|
static inline ssize_t xdr_stream_encode_item_present(struct xdr_stream *xdr)
|
||||||
|
{
|
||||||
|
const size_t len = sizeof(__be32);
|
||||||
|
__be32 *p = xdr_reserve_space(xdr, len);
|
||||||
|
|
||||||
|
if (unlikely(!p))
|
||||||
|
return -EMSGSIZE;
|
||||||
|
*p = xdr_one;
|
||||||
|
return len;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* xdr_stream_encode_item_absent - Encode a "not present" list item
|
||||||
|
* @xdr: pointer to xdr_stream
|
||||||
|
*
|
||||||
|
* Return values:
|
||||||
|
* On success, returns length in bytes of XDR buffer consumed
|
||||||
|
* %-EMSGSIZE on XDR buffer overflow
|
||||||
|
*/
|
||||||
|
static inline int xdr_stream_encode_item_absent(struct xdr_stream *xdr)
|
||||||
|
{
|
||||||
|
const size_t len = sizeof(__be32);
|
||||||
|
__be32 *p = xdr_reserve_space(xdr, len);
|
||||||
|
|
||||||
|
if (unlikely(!p))
|
||||||
|
return -EMSGSIZE;
|
||||||
|
*p = xdr_zero;
|
||||||
|
return len;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* xdr_stream_encode_u32 - Encode a 32-bit integer
|
* xdr_stream_encode_u32 - Encode a 32-bit integer
|
||||||
* @xdr: pointer to xdr_stream
|
* @xdr: pointer to xdr_stream
|
||||||
|
@ -275,32 +275,6 @@ out:
|
|||||||
return n;
|
return n;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline int
|
|
||||||
encode_item_present(struct xdr_stream *xdr)
|
|
||||||
{
|
|
||||||
__be32 *p;
|
|
||||||
|
|
||||||
p = xdr_reserve_space(xdr, sizeof(*p));
|
|
||||||
if (unlikely(!p))
|
|
||||||
return -EMSGSIZE;
|
|
||||||
|
|
||||||
*p = xdr_one;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline int
|
|
||||||
encode_item_not_present(struct xdr_stream *xdr)
|
|
||||||
{
|
|
||||||
__be32 *p;
|
|
||||||
|
|
||||||
p = xdr_reserve_space(xdr, sizeof(*p));
|
|
||||||
if (unlikely(!p))
|
|
||||||
return -EMSGSIZE;
|
|
||||||
|
|
||||||
*p = xdr_zero;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
xdr_encode_rdma_segment(__be32 *iptr, struct rpcrdma_mr *mr)
|
xdr_encode_rdma_segment(__be32 *iptr, struct rpcrdma_mr *mr)
|
||||||
{
|
{
|
||||||
@ -414,7 +388,7 @@ static int rpcrdma_encode_read_list(struct rpcrdma_xprt *r_xprt,
|
|||||||
} while (nsegs);
|
} while (nsegs);
|
||||||
|
|
||||||
done:
|
done:
|
||||||
return encode_item_not_present(xdr);
|
return xdr_stream_encode_item_absent(xdr);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Register and XDR encode the Write list. Supports encoding a list
|
/* Register and XDR encode the Write list. Supports encoding a list
|
||||||
@ -453,7 +427,7 @@ static int rpcrdma_encode_write_list(struct rpcrdma_xprt *r_xprt,
|
|||||||
if (nsegs < 0)
|
if (nsegs < 0)
|
||||||
return nsegs;
|
return nsegs;
|
||||||
|
|
||||||
if (encode_item_present(xdr) < 0)
|
if (xdr_stream_encode_item_present(xdr) < 0)
|
||||||
return -EMSGSIZE;
|
return -EMSGSIZE;
|
||||||
segcount = xdr_reserve_space(xdr, sizeof(*segcount));
|
segcount = xdr_reserve_space(xdr, sizeof(*segcount));
|
||||||
if (unlikely(!segcount))
|
if (unlikely(!segcount))
|
||||||
@ -480,7 +454,7 @@ static int rpcrdma_encode_write_list(struct rpcrdma_xprt *r_xprt,
|
|||||||
*segcount = cpu_to_be32(nchunks);
|
*segcount = cpu_to_be32(nchunks);
|
||||||
|
|
||||||
done:
|
done:
|
||||||
return encode_item_not_present(xdr);
|
return xdr_stream_encode_item_absent(xdr);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Register and XDR encode the Reply chunk. Supports encoding an array
|
/* Register and XDR encode the Reply chunk. Supports encoding an array
|
||||||
@ -507,14 +481,14 @@ static int rpcrdma_encode_reply_chunk(struct rpcrdma_xprt *r_xprt,
|
|||||||
__be32 *segcount;
|
__be32 *segcount;
|
||||||
|
|
||||||
if (wtype != rpcrdma_replych)
|
if (wtype != rpcrdma_replych)
|
||||||
return encode_item_not_present(xdr);
|
return xdr_stream_encode_item_absent(xdr);
|
||||||
|
|
||||||
seg = req->rl_segments;
|
seg = req->rl_segments;
|
||||||
nsegs = rpcrdma_convert_iovs(r_xprt, &rqst->rq_rcv_buf, 0, wtype, seg);
|
nsegs = rpcrdma_convert_iovs(r_xprt, &rqst->rq_rcv_buf, 0, wtype, seg);
|
||||||
if (nsegs < 0)
|
if (nsegs < 0)
|
||||||
return nsegs;
|
return nsegs;
|
||||||
|
|
||||||
if (encode_item_present(xdr) < 0)
|
if (xdr_stream_encode_item_present(xdr) < 0)
|
||||||
return -EMSGSIZE;
|
return -EMSGSIZE;
|
||||||
segcount = xdr_reserve_space(xdr, sizeof(*segcount));
|
segcount = xdr_reserve_space(xdr, sizeof(*segcount));
|
||||||
if (unlikely(!segcount))
|
if (unlikely(!segcount))
|
||||||
|
Loading…
Reference in New Issue
Block a user