SUNRPC: Add xdr_pad_size() helper
Introduce a helper function to compute the XDR pad size of a variable-length XDR object. Clean up: Replace open-coded calculation of XDR pad sizes. I'm sure I haven't found every instance of this calculation. Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
This commit is contained in:
parent
758a3bf945
commit
96f194b715
@ -300,6 +300,21 @@ xdr_align_size(size_t n)
|
|||||||
return (n + mask) & ~mask;
|
return (n + mask) & ~mask;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* xdr_pad_size - Calculate size of an object's pad
|
||||||
|
* @n: Size of an object being XDR encoded (in bytes)
|
||||||
|
*
|
||||||
|
* This implementation avoids the need for conditional
|
||||||
|
* branches or modulo division.
|
||||||
|
*
|
||||||
|
* Return value:
|
||||||
|
* Size (in bytes) of the needed XDR pad
|
||||||
|
*/
|
||||||
|
static inline size_t xdr_pad_size(size_t n)
|
||||||
|
{
|
||||||
|
return xdr_align_size(n) - n;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 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
|
||||||
|
@ -1877,7 +1877,7 @@ static int gss_wrap_req_priv(struct rpc_cred *cred, struct gss_cl_ctx *ctx,
|
|||||||
else
|
else
|
||||||
iov = snd_buf->head;
|
iov = snd_buf->head;
|
||||||
p = iov->iov_base + iov->iov_len;
|
p = iov->iov_base + iov->iov_len;
|
||||||
pad = 3 - ((snd_buf->len - offset - 1) & 3);
|
pad = xdr_pad_size(snd_buf->len - offset);
|
||||||
memset(p, 0, pad);
|
memset(p, 0, pad);
|
||||||
iov->iov_len += pad;
|
iov->iov_len += pad;
|
||||||
snd_buf->len += pad;
|
snd_buf->len += pad;
|
||||||
|
@ -961,7 +961,7 @@ unwrap_priv_data(struct svc_rqst *rqstp, struct xdr_buf *buf, u32 seq, struct gs
|
|||||||
/* XXX: This is very inefficient. It would be better to either do
|
/* XXX: This is very inefficient. It would be better to either do
|
||||||
* this while we encrypt, or maybe in the receive code, if we can peak
|
* this while we encrypt, or maybe in the receive code, if we can peak
|
||||||
* ahead and work out the service and mechanism there. */
|
* ahead and work out the service and mechanism there. */
|
||||||
offset = buf->head[0].iov_len % 4;
|
offset = xdr_pad_size(buf->head[0].iov_len);
|
||||||
if (offset) {
|
if (offset) {
|
||||||
buf->buflen = RPCSVC_MAXPAYLOAD;
|
buf->buflen = RPCSVC_MAXPAYLOAD;
|
||||||
xdr_shift_buf(buf, offset);
|
xdr_shift_buf(buf, offset);
|
||||||
@ -1680,7 +1680,8 @@ svcauth_gss_wrap_resp_integ(struct svc_rqst *rqstp)
|
|||||||
goto out;
|
goto out;
|
||||||
integ_offset = (u8 *)(p + 1) - (u8 *)resbuf->head[0].iov_base;
|
integ_offset = (u8 *)(p + 1) - (u8 *)resbuf->head[0].iov_base;
|
||||||
integ_len = resbuf->len - integ_offset;
|
integ_len = resbuf->len - integ_offset;
|
||||||
BUG_ON(integ_len % 4);
|
if (integ_len & 3)
|
||||||
|
goto out;
|
||||||
*p++ = htonl(integ_len);
|
*p++ = htonl(integ_len);
|
||||||
*p++ = htonl(gc->gc_seq);
|
*p++ = htonl(gc->gc_seq);
|
||||||
if (xdr_buf_subsegment(resbuf, &integ_buf, integ_offset, integ_len)) {
|
if (xdr_buf_subsegment(resbuf, &integ_buf, integ_offset, integ_len)) {
|
||||||
|
@ -322,11 +322,6 @@ int svc_rdma_send(struct svcxprt_rdma *rdma, struct ib_send_wr *wr)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static u32 xdr_padsize(u32 len)
|
|
||||||
{
|
|
||||||
return (len & 3) ? (4 - (len & 3)) : 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Returns length of transport header, in bytes.
|
/* Returns length of transport header, in bytes.
|
||||||
*/
|
*/
|
||||||
static unsigned int svc_rdma_reply_hdr_len(__be32 *rdma_resp)
|
static unsigned int svc_rdma_reply_hdr_len(__be32 *rdma_resp)
|
||||||
@ -595,7 +590,7 @@ static int svc_rdma_pull_up_reply_msg(struct svcxprt_rdma *rdma,
|
|||||||
if (wr_lst) {
|
if (wr_lst) {
|
||||||
u32 xdrpad;
|
u32 xdrpad;
|
||||||
|
|
||||||
xdrpad = xdr_padsize(xdr->page_len);
|
xdrpad = xdr_pad_size(xdr->page_len);
|
||||||
if (taillen && xdrpad) {
|
if (taillen && xdrpad) {
|
||||||
tailbase += xdrpad;
|
tailbase += xdrpad;
|
||||||
taillen -= xdrpad;
|
taillen -= xdrpad;
|
||||||
@ -670,7 +665,7 @@ int svc_rdma_map_reply_msg(struct svcxprt_rdma *rdma,
|
|||||||
if (wr_lst) {
|
if (wr_lst) {
|
||||||
base = xdr->tail[0].iov_base;
|
base = xdr->tail[0].iov_base;
|
||||||
len = xdr->tail[0].iov_len;
|
len = xdr->tail[0].iov_len;
|
||||||
xdr_pad = xdr_padsize(xdr->page_len);
|
xdr_pad = xdr_pad_size(xdr->page_len);
|
||||||
|
|
||||||
if (len && xdr_pad) {
|
if (len && xdr_pad) {
|
||||||
base += xdr_pad;
|
base += xdr_pad;
|
||||||
|
Loading…
Reference in New Issue
Block a user