NFS: Record task, client ID, and XID in xdr_status trace points
When triggering an nfs_xdr_status trace point, record the task ID and XID of the failing RPC to better pinpoint the problem. This feels like a bit of a layering violation. Suggested-by: Trond Myklebust <trondmy@hammerspace.com> Signed-off-by: Chuck Lever <chuck.lever@oracle.com> Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
This commit is contained in:
parent
7d4006c161
commit
62a92ba97a
|
@ -151,7 +151,7 @@ static int decode_stat(struct xdr_stream *xdr, enum nfs_stat *status)
|
|||
return 0;
|
||||
out_status:
|
||||
*status = be32_to_cpup(p);
|
||||
trace_nfs_xdr_status((int)*status);
|
||||
trace_nfs_xdr_status(xdr, (int)*status);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -343,7 +343,7 @@ static int decode_nfsstat3(struct xdr_stream *xdr, enum nfs_stat *status)
|
|||
return 0;
|
||||
out_status:
|
||||
*status = be32_to_cpup(p);
|
||||
trace_nfs_xdr_status((int)*status);
|
||||
trace_nfs_xdr_status(xdr, (int)*status);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -564,24 +564,35 @@ TRACE_EVENT(nfs4_setup_sequence,
|
|||
|
||||
TRACE_EVENT(nfs4_xdr_status,
|
||||
TP_PROTO(
|
||||
const struct xdr_stream *xdr,
|
||||
u32 op,
|
||||
int error
|
||||
),
|
||||
|
||||
TP_ARGS(op, error),
|
||||
TP_ARGS(xdr, op, error),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
__field(unsigned int, task_id)
|
||||
__field(unsigned int, client_id)
|
||||
__field(u32, xid)
|
||||
__field(u32, op)
|
||||
__field(unsigned long, error)
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
const struct rpc_rqst *rqstp = xdr->rqst;
|
||||
const struct rpc_task *task = rqstp->rq_task;
|
||||
|
||||
__entry->task_id = task->tk_pid;
|
||||
__entry->client_id = task->tk_client->cl_clid;
|
||||
__entry->xid = be32_to_cpu(rqstp->rq_xid);
|
||||
__entry->op = op;
|
||||
__entry->error = error;
|
||||
),
|
||||
|
||||
TP_printk(
|
||||
"error=%ld (%s) operation %d:",
|
||||
"task:%u@%d xid=0x%08x error=%ld (%s) operation=%u",
|
||||
__entry->task_id, __entry->client_id, __entry->xid,
|
||||
-__entry->error, show_nfsv4_errors(__entry->error),
|
||||
__entry->op
|
||||
)
|
||||
|
|
|
@ -3187,7 +3187,7 @@ static bool __decode_op_hdr(struct xdr_stream *xdr, enum nfs_opnum4 expected,
|
|||
return true;
|
||||
out_status:
|
||||
nfserr = be32_to_cpup(p);
|
||||
trace_nfs4_xdr_status(opnum, nfserr);
|
||||
trace_nfs4_xdr_status(xdr, opnum, nfserr);
|
||||
*nfs_retval = nfs4_stat_to_errno(nfserr);
|
||||
return true;
|
||||
out_bad_operation:
|
||||
|
|
|
@ -1139,21 +1139,32 @@ TRACE_DEFINE_ENUM(NFSERR_JUKEBOX);
|
|||
|
||||
TRACE_EVENT(nfs_xdr_status,
|
||||
TP_PROTO(
|
||||
const struct xdr_stream *xdr,
|
||||
int error
|
||||
),
|
||||
|
||||
TP_ARGS(error),
|
||||
TP_ARGS(xdr, error),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
__field(unsigned int, task_id)
|
||||
__field(unsigned int, client_id)
|
||||
__field(u32, xid)
|
||||
__field(unsigned long, error)
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
const struct rpc_rqst *rqstp = xdr->rqst;
|
||||
const struct rpc_task *task = rqstp->rq_task;
|
||||
|
||||
__entry->task_id = task->tk_pid;
|
||||
__entry->client_id = task->tk_client->cl_clid;
|
||||
__entry->xid = be32_to_cpu(rqstp->rq_xid);
|
||||
__entry->error = error;
|
||||
),
|
||||
|
||||
TP_printk(
|
||||
"error=%ld (%s)",
|
||||
"task:%u@%d xid=0x%08x error=%ld (%s)",
|
||||
__entry->task_id, __entry->client_id, __entry->xid,
|
||||
-__entry->error, nfs_show_status(__entry->error)
|
||||
)
|
||||
);
|
||||
|
|
Loading…
Reference in New Issue