]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
SUNRPC: Add xdr_stream::rqst field
authorChuck Lever <chuck.lever@oracle.com>
Mon, 11 Feb 2019 16:24:05 +0000 (11:24 -0500)
committerAnna Schumaker <Anna.Schumaker@Netapp.com>
Wed, 13 Feb 2019 16:05:50 +0000 (11:05 -0500)
Having access to the controlling rpc_rqst means a trace point in the
XDR code can report:

 - the XID
 - the task ID and client ID
 - the p_name of RPC being processed

Subsequent patches will introduce such trace points.

Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
fs/nfs/callback_xdr.c
fs/nfs/flexfilelayout/flexfilelayout.c
include/linux/sunrpc/xdr.h
net/sunrpc/auth.c
net/sunrpc/auth_gss/auth_gss.c
net/sunrpc/xdr.c
net/sunrpc/xprtrdma/backchannel.c
net/sunrpc/xprtrdma/rpc_rdma.c

index a87a562734077c221884edaf7962086af6e7a643..bc7c1766a2be47c851276669e2090d90d284563f 100644 (file)
@@ -943,10 +943,11 @@ static __be32 nfs4_callback_compound(struct svc_rqst *rqstp)
        };
        unsigned int nops = 0;
 
-       xdr_init_decode(&xdr_in, &rqstp->rq_arg, rqstp->rq_arg.head[0].iov_base);
+       xdr_init_decode(&xdr_in, &rqstp->rq_arg,
+                       rqstp->rq_arg.head[0].iov_base, NULL);
 
        p = (__be32*)((char *)rqstp->rq_res.head[0].iov_base + rqstp->rq_res.head[0].iov_len);
-       xdr_init_encode(&xdr_out, &rqstp->rq_res, p);
+       xdr_init_encode(&xdr_out, &rqstp->rq_res, p, NULL);
 
        status = decode_compound_hdr_arg(&xdr_in, &hdr_arg);
        if (status == htonl(NFS4ERR_RESOURCE))
index 63abe705f4cabe133d28e94236039e7a0c69887d..32701b6a95660f417c931d37304802bf254c2181 100644 (file)
@@ -2036,7 +2036,7 @@ ff_layout_encode_layoutreturn(struct xdr_stream *xdr,
 
        dprintk("%s: Begin\n", __func__);
 
-       xdr_init_encode(&tmp_xdr, &tmp_buf, NULL);
+       xdr_init_encode(&tmp_xdr, &tmp_buf, NULL, NULL);
 
        ff_layout_encode_ioerr(&tmp_xdr, args, ff_args);
        ff_layout_encode_iostats_array(&tmp_xdr, args, ff_args);
index 2ec1280602390efe6e5c71413a7a731f6e98f398..787939d13643ca296798c74a8d5e795c0a7b409a 100644 (file)
@@ -217,6 +217,8 @@ struct xdr_stream {
        struct kvec scratch;    /* Scratch buffer */
        struct page **page_ptr; /* pointer to the current page */
        unsigned int nwords;    /* Remaining decode buffer length */
+
+       struct rpc_rqst *rqst;  /* For debugging */
 };
 
 /*
@@ -227,7 +229,8 @@ typedef void        (*kxdreproc_t)(struct rpc_rqst *rqstp, struct xdr_stream *xdr,
 typedef int    (*kxdrdproc_t)(struct rpc_rqst *rqstp, struct xdr_stream *xdr,
                void *obj);
 
-extern void xdr_init_encode(struct xdr_stream *xdr, struct xdr_buf *buf, __be32 *p);
+extern void xdr_init_encode(struct xdr_stream *xdr, struct xdr_buf *buf,
+                           __be32 *p, struct rpc_rqst *rqst);
 extern __be32 *xdr_reserve_space(struct xdr_stream *xdr, size_t nbytes);
 extern void xdr_commit_encode(struct xdr_stream *xdr);
 extern void xdr_truncate_encode(struct xdr_stream *xdr, size_t len);
@@ -235,7 +238,8 @@ extern int xdr_restrict_buflen(struct xdr_stream *xdr, int newbuflen);
 extern void xdr_write_pages(struct xdr_stream *xdr, struct page **pages,
                unsigned int base, unsigned int len);
 extern unsigned int xdr_stream_pos(const struct xdr_stream *xdr);
-extern void xdr_init_decode(struct xdr_stream *xdr, struct xdr_buf *buf, __be32 *p);
+extern void xdr_init_decode(struct xdr_stream *xdr, struct xdr_buf *buf,
+                           __be32 *p, struct rpc_rqst *rqst);
 extern void xdr_init_decode_pages(struct xdr_stream *xdr, struct xdr_buf *buf,
                struct page **pages, unsigned int len);
 extern void xdr_set_scratch_buffer(struct xdr_stream *xdr, void *buf, size_t buflen);
index f3023bbc0b7fcc292793fda4469e0c914b6ece93..8dfab6119e6af2a144edfca8f983a93e7ad3f048 100644 (file)
@@ -798,7 +798,7 @@ static void rpcauth_wrap_req_encode(kxdreproc_t encode, struct rpc_rqst *rqstp,
 {
        struct xdr_stream xdr;
 
-       xdr_init_encode(&xdr, &rqstp->rq_snd_buf, data);
+       xdr_init_encode(&xdr, &rqstp->rq_snd_buf, data, rqstp);
        encode(rqstp, &xdr, obj);
 }
 
@@ -823,7 +823,7 @@ rpcauth_unwrap_req_decode(kxdrdproc_t decode, struct rpc_rqst *rqstp,
 {
        struct xdr_stream xdr;
 
-       xdr_init_decode(&xdr, &rqstp->rq_rcv_buf, data);
+       xdr_init_decode(&xdr, &rqstp->rq_rcv_buf, data, rqstp);
        return decode(rqstp, &xdr, obj);
 }
 
index 1531b0219344d9e47a8dc33509355fefa9e05f5c..a42672e81792ed911bc6bf1fbc7e71d7512d0996 100644 (file)
@@ -1722,7 +1722,7 @@ static void gss_wrap_req_encode(kxdreproc_t encode, struct rpc_rqst *rqstp,
 {
        struct xdr_stream xdr;
 
-       xdr_init_encode(&xdr, &rqstp->rq_snd_buf, p);
+       xdr_init_encode(&xdr, &rqstp->rq_snd_buf, p, rqstp);
        encode(rqstp, &xdr, obj);
 }
 
@@ -1998,7 +1998,7 @@ gss_unwrap_req_decode(kxdrdproc_t decode, struct rpc_rqst *rqstp,
 {
        struct xdr_stream xdr;
 
-       xdr_init_decode(&xdr, &rqstp->rq_rcv_buf, p);
+       xdr_init_decode(&xdr, &rqstp->rq_rcv_buf, p, rqstp);
        return decode(rqstp, &xdr, obj);
 }
 
index f302c6eb8779063a71b9a590325a96b8026ab3e6..345f08b634eeb605c93a7aae39349ee3cd9ad913 100644 (file)
@@ -483,6 +483,7 @@ EXPORT_SYMBOL_GPL(xdr_stream_pos);
  * @xdr: pointer to xdr_stream struct
  * @buf: pointer to XDR buffer in which to encode data
  * @p: current pointer inside XDR buffer
+ * @rqst: pointer to controlling rpc_rqst, for debugging
  *
  * Note: at the moment the RPC client only passes the length of our
  *      scratch buffer in the xdr_buf's header kvec. Previously this
@@ -491,7 +492,8 @@ EXPORT_SYMBOL_GPL(xdr_stream_pos);
  *      of the buffer length, and takes care of adjusting the kvec
  *      length for us.
  */
-void xdr_init_encode(struct xdr_stream *xdr, struct xdr_buf *buf, __be32 *p)
+void xdr_init_encode(struct xdr_stream *xdr, struct xdr_buf *buf, __be32 *p,
+                    struct rpc_rqst *rqst)
 {
        struct kvec *iov = buf->head;
        int scratch_len = buf->buflen - buf->page_len - buf->tail[0].iov_len;
@@ -513,6 +515,7 @@ void xdr_init_encode(struct xdr_stream *xdr, struct xdr_buf *buf, __be32 *p)
                buf->len += len;
                iov->iov_len += len;
        }
+       xdr->rqst = rqst;
 }
 EXPORT_SYMBOL_GPL(xdr_init_encode);
 
@@ -819,8 +822,10 @@ static bool xdr_set_next_buffer(struct xdr_stream *xdr)
  * @xdr: pointer to xdr_stream struct
  * @buf: pointer to XDR buffer from which to decode data
  * @p: current pointer inside XDR buffer
+ * @rqst: pointer to controlling rpc_rqst, for debugging
  */
-void xdr_init_decode(struct xdr_stream *xdr, struct xdr_buf *buf, __be32 *p)
+void xdr_init_decode(struct xdr_stream *xdr, struct xdr_buf *buf, __be32 *p,
+                    struct rpc_rqst *rqst)
 {
        xdr->buf = buf;
        xdr->scratch.iov_base = NULL;
@@ -836,6 +841,7 @@ void xdr_init_decode(struct xdr_stream *xdr, struct xdr_buf *buf, __be32 *p)
                xdr->nwords -= p - xdr->p;
                xdr->p = p;
        }
+       xdr->rqst = rqst;
 }
 EXPORT_SYMBOL_GPL(xdr_init_decode);
 
@@ -854,7 +860,7 @@ void xdr_init_decode_pages(struct xdr_stream *xdr, struct xdr_buf *buf,
        buf->page_len =  len;
        buf->buflen =  len;
        buf->len = len;
-       xdr_init_decode(xdr, buf, NULL);
+       xdr_init_decode(xdr, buf, NULL, NULL);
 }
 EXPORT_SYMBOL_GPL(xdr_init_decode_pages);
 
index 0de9b3e63770f21b0827e035349d5819fb1ab964..98c1e43eb7b16df2b6a9759904c36b76c75cd079 100644 (file)
@@ -123,7 +123,7 @@ static int rpcrdma_bc_marshal_reply(struct rpc_rqst *rqst)
 
        rpcrdma_set_xdrlen(&req->rl_hdrbuf, 0);
        xdr_init_encode(&req->rl_stream, &req->rl_hdrbuf,
-                       req->rl_rdmabuf->rg_base);
+                       req->rl_rdmabuf->rg_base, rqst);
 
        p = xdr_reserve_space(&req->rl_stream, 28);
        if (unlikely(!p))
index 7774aee7c01387d7df74c91faa27543ffc8a337c..6c1fb270f12763f2b67bab6548c8410bd8e4cee2 100644 (file)
@@ -748,7 +748,7 @@ rpcrdma_marshal_req(struct rpcrdma_xprt *r_xprt, struct rpc_rqst *rqst)
 
        rpcrdma_set_xdrlen(&req->rl_hdrbuf, 0);
        xdr_init_encode(xdr, &req->rl_hdrbuf,
-                       req->rl_rdmabuf->rg_base);
+                       req->rl_rdmabuf->rg_base, rqst);
 
        /* Fixed header fields */
        ret = -EMSGSIZE;
@@ -1329,7 +1329,7 @@ void rpcrdma_reply_handler(struct rpcrdma_rep *rep)
 
        /* Fixed transport header fields */
        xdr_init_decode(&rep->rr_stream, &rep->rr_hdrbuf,
-                       rep->rr_hdrbuf.head[0].iov_base);
+                       rep->rr_hdrbuf.head[0].iov_base, NULL);
        p = xdr_inline_decode(&rep->rr_stream, 4 * sizeof(*p));
        if (unlikely(!p))
                goto out_shortreply;