Commit 62a92ba9 authored by Chuck Lever's avatar Chuck Lever Committed by Anna Schumaker
Browse files

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: default avatarTrond Myklebust <trondmy@hammerspace.com>
Signed-off-by: default avatarChuck Lever <chuck.lever@oracle.com>
Signed-off-by: default avatarAnna Schumaker <Anna.Schumaker@Netapp.com>
parent 7d4006c1
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -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;
}

+1 −1
Original line number Diff line number Diff line
@@ -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;
}

+13 −2
Original line number Diff line number Diff line
@@ -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
		)
+1 −1
Original line number Diff line number Diff line
@@ -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:
+13 −2
Original line number Diff line number Diff line
@@ -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)
		)
);