Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

SUNRPC: Refactor rpc_xdr_buf_init()

Clean up: there is some XDR initialization logic that is common
to the forward channel and backchannel. Move it to an XDR header
so it can be shared.

rpc_rqst::rq_buffer points to a buffer containing big-endian data.
Update its annotation as part of the clean up.

Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>

authored by

Chuck Lever and committed by
Anna Schumaker
b9c5bc03 eb342e9a

+21 -37
+12
include/linux/sunrpc/xdr.h
··· 67 67 len; /* Length of XDR encoded message */ 68 68 }; 69 69 70 + static inline void 71 + xdr_buf_init(struct xdr_buf *buf, void *start, size_t len) 72 + { 73 + buf->head[0].iov_base = start; 74 + buf->head[0].iov_len = len; 75 + buf->tail[0].iov_len = 0; 76 + buf->page_len = 0; 77 + buf->flags = 0; 78 + buf->len = 0; 79 + buf->buflen = len; 80 + } 81 + 70 82 /* 71 83 * pre-xdr'ed macros. 72 84 */
+1 -1
include/linux/sunrpc/xprt.h
··· 83 83 void (*rq_release_snd_buf)(struct rpc_rqst *); /* release rq_enc_pages */ 84 84 struct list_head rq_list; 85 85 86 - __u32 * rq_buffer; /* XDR encode buffer */ 86 + void *rq_buffer; /* Call XDR encode buffer */ 87 87 size_t rq_callsize, 88 88 rq_rcvsize; 89 89 size_t rq_xmit_bytes_sent; /* total bytes sent */
+1 -7
net/sunrpc/backchannel_rqst.c
··· 76 76 page = alloc_page(gfp_flags); 77 77 if (page == NULL) 78 78 return -ENOMEM; 79 - buf->head[0].iov_base = page_address(page); 80 - buf->head[0].iov_len = PAGE_SIZE; 81 - buf->tail[0].iov_base = NULL; 82 - buf->tail[0].iov_len = 0; 83 - buf->page_len = 0; 84 - buf->len = 0; 85 - buf->buflen = PAGE_SIZE; 79 + xdr_buf_init(buf, page_address(page), PAGE_SIZE); 86 80 return 0; 87 81 } 88 82
+6 -18
net/sunrpc/clnt.c
··· 1746 1746 task->tk_rqstp->rq_bytes_sent = 0; 1747 1747 } 1748 1748 1749 - static inline void 1750 - rpc_xdr_buf_init(struct xdr_buf *buf, void *start, size_t len) 1751 - { 1752 - buf->head[0].iov_base = start; 1753 - buf->head[0].iov_len = len; 1754 - buf->tail[0].iov_len = 0; 1755 - buf->page_len = 0; 1756 - buf->flags = 0; 1757 - buf->len = 0; 1758 - buf->buflen = len; 1759 - } 1760 - 1761 1749 /* 1762 1750 * 3. Encode arguments of an RPC call 1763 1751 */ ··· 1758 1770 1759 1771 dprint_status(task); 1760 1772 1761 - rpc_xdr_buf_init(&req->rq_snd_buf, 1762 - req->rq_buffer, 1763 - req->rq_callsize); 1764 - rpc_xdr_buf_init(&req->rq_rcv_buf, 1765 - (char *)req->rq_buffer + req->rq_callsize, 1766 - req->rq_rcvsize); 1773 + xdr_buf_init(&req->rq_snd_buf, 1774 + req->rq_buffer, 1775 + req->rq_callsize); 1776 + xdr_buf_init(&req->rq_rcv_buf, 1777 + (char *)req->rq_buffer + req->rq_callsize, 1778 + req->rq_rcvsize); 1767 1779 1768 1780 p = rpc_encode_header(task); 1769 1781 if (p == NULL) {
+1 -11
net/sunrpc/xprtrdma/backchannel.c
··· 38 38 struct rpcrdma_ia *ia = &r_xprt->rx_ia; 39 39 struct rpcrdma_regbuf *rb; 40 40 struct rpcrdma_req *req; 41 - struct xdr_buf *buf; 42 41 size_t size; 43 42 44 43 req = rpcrdma_create_req(r_xprt); ··· 59 60 req->rl_sendbuf = rb; 60 61 /* so that rpcr_to_rdmar works when receiving a request */ 61 62 rqst->rq_buffer = (void *)req->rl_sendbuf->rg_base; 62 - 63 - buf = &rqst->rq_snd_buf; 64 - buf->head[0].iov_base = rqst->rq_buffer; 65 - buf->head[0].iov_len = 0; 66 - buf->tail[0].iov_base = NULL; 67 - buf->tail[0].iov_len = 0; 68 - buf->page_len = 0; 69 - buf->len = 0; 70 - buf->buflen = size; 71 - 63 + xdr_buf_init(&rqst->rq_snd_buf, rqst->rq_buffer, size); 72 64 return 0; 73 65 74 66 out_fail: