Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

NFS: Add trace events to report non-zero NFS status codes



These can help field troubleshooting without needing the overhead
of a full network capture (ie, tcpdump).

Signed-off-by: default avatarChuck Lever <chuck.lever@oracle.com>
Signed-off-by: default avatarAnna Schumaker <Anna.Schumaker@Netapp.com>
parent eb72f484
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
@@ -22,6 +22,7 @@
#include <linux/nfs.h>
#include <linux/nfs2.h>
#include <linux/nfs_fs.h>
#include "nfstrace.h"
#include "internal.h"

#define NFSDBG_FACILITY		NFSDBG_XDR
@@ -145,7 +146,13 @@ static int decode_stat(struct xdr_stream *xdr, enum nfs_stat *status)
	p = xdr_inline_decode(xdr, 4);
	if (unlikely(!p))
		return -EIO;
	if (unlikely(*p != cpu_to_be32(NFS_OK)))
		goto out_status;
	*status = 0;
	return 0;
out_status:
	*status = be32_to_cpup(p);
	trace_nfs_xdr_status((int)*status);
	return 0;
}

+7 −0
Original line number Diff line number Diff line
@@ -21,6 +21,7 @@
#include <linux/nfs3.h>
#include <linux/nfs_fs.h>
#include <linux/nfsacl.h>
#include "nfstrace.h"
#include "internal.h"

#define NFSDBG_FACILITY		NFSDBG_XDR
@@ -337,7 +338,13 @@ static int decode_nfsstat3(struct xdr_stream *xdr, enum nfs_stat *status)
	p = xdr_inline_decode(xdr, 4);
	if (unlikely(!p))
		return -EIO;
	if (unlikely(*p != cpu_to_be32(NFS3_OK)))
		goto out_status;
	*status = 0;
	return 0;
out_status:
	*status = be32_to_cpup(p);
	trace_nfs_xdr_status((int)*status);
	return 0;
}

+25 −0
Original line number Diff line number Diff line
@@ -524,6 +524,31 @@ TRACE_EVENT(nfs4_setup_sequence,
		)
);

TRACE_EVENT(nfs4_xdr_status,
		TP_PROTO(
			u32 op,
			int error
		),

		TP_ARGS(op, error),

		TP_STRUCT__entry(
			__field(u32, op)
			__field(int, error)
		),

		TP_fast_assign(
			__entry->op = op;
			__entry->error = -error;
		),

		TP_printk(
			"operation %d: nfs status %d (%s)",
			__entry->op,
			__entry->error, show_nfsv4_errors(__entry->error)
		)
);

DECLARE_EVENT_CLASS(nfs4_open_event,
		TP_PROTO(
			const struct nfs_open_context *ctx,
+8 −4
Original line number Diff line number Diff line
@@ -54,6 +54,7 @@
#include <linux/nfs_fs.h>

#include "nfs4_fs.h"
#include "nfs4trace.h"
#include "internal.h"
#include "nfs4idmap.h"
#include "nfs4session.h"
@@ -3188,10 +3189,13 @@ static bool __decode_op_hdr(struct xdr_stream *xdr, enum nfs_opnum4 expected,
	opnum = be32_to_cpup(p++);
	if (unlikely(opnum != expected))
		goto out_bad_operation;
	nfserr = be32_to_cpup(p);
	if (nfserr == NFS_OK)
	if (unlikely(*p != cpu_to_be32(NFS_OK)))
		goto out_status;
	*nfs_retval = 0;
	else
	return true;
out_status:
	nfserr = be32_to_cpup(p);
	trace_nfs4_xdr_status(opnum, nfserr);
	*nfs_retval = nfs4_stat_to_errno(nfserr);
	return true;
out_bad_operation:
+1 −0
Original line number Diff line number Diff line
@@ -11,3 +11,4 @@

EXPORT_TRACEPOINT_SYMBOL_GPL(nfs_fsync_enter);
EXPORT_TRACEPOINT_SYMBOL_GPL(nfs_fsync_exit);
EXPORT_TRACEPOINT_SYMBOL_GPL(nfs_xdr_status);
Loading