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

Commit e2d4fc53 authored by Chuck Lever's avatar Chuck Lever Committed by Greg Kroah-Hartman
Browse files

NFS4: Trace state recovery operation



[ Upstream commit 511ba52e4c01fd1878140774e6215e0de6c2f36f ]

Add a trace point in the main state manager loop to observe state
recovery operation. Help track down state recovery bugs.

Signed-off-by: default avatarChuck Lever <chuck.lever@oracle.com>
Signed-off-by: default avatarTrond Myklebust <trond.myklebust@hammerspace.com>
Stable-dep-of: ed1cc05aa1f7 ("NFSv4: Fix a nfs4_state_manager() race")
Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
parent c87f66c4
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -61,6 +61,7 @@
#include "nfs4session.h"
#include "pnfs.h"
#include "netns.h"
#include "nfs4trace.h"

#define NFSDBG_FACILITY		NFSDBG_STATE

@@ -2525,6 +2526,7 @@ static void nfs4_state_manager(struct nfs_client *clp)

	/* Ensure exclusive access to NFSv4 state */
	do {
		trace_nfs4_state_mgr(clp);
		clear_bit(NFS4CLNT_RUN_MANAGER, &clp->cl_state);
		if (test_bit(NFS4CLNT_PURGE_STATE, &clp->cl_state)) {
			section = "purge state";
@@ -2641,6 +2643,7 @@ static void nfs4_state_manager(struct nfs_client *clp)
out_error:
	if (strlen(section))
		section_sep = ": ";
	trace_nfs4_state_mgr_failed(clp, section, status);
	pr_warn_ratelimited("NFS: state manager%s%s failed on NFSv4 server %s"
			" with error %d\n", section_sep, section,
			clp->cl_hostname, -status);
+93 −0
Original line number Diff line number Diff line
@@ -563,6 +563,99 @@ TRACE_EVENT(nfs4_setup_sequence,
		)
);

TRACE_DEFINE_ENUM(NFS4CLNT_MANAGER_RUNNING);
TRACE_DEFINE_ENUM(NFS4CLNT_CHECK_LEASE);
TRACE_DEFINE_ENUM(NFS4CLNT_LEASE_EXPIRED);
TRACE_DEFINE_ENUM(NFS4CLNT_RECLAIM_REBOOT);
TRACE_DEFINE_ENUM(NFS4CLNT_RECLAIM_NOGRACE);
TRACE_DEFINE_ENUM(NFS4CLNT_DELEGRETURN);
TRACE_DEFINE_ENUM(NFS4CLNT_SESSION_RESET);
TRACE_DEFINE_ENUM(NFS4CLNT_LEASE_CONFIRM);
TRACE_DEFINE_ENUM(NFS4CLNT_SERVER_SCOPE_MISMATCH);
TRACE_DEFINE_ENUM(NFS4CLNT_PURGE_STATE);
TRACE_DEFINE_ENUM(NFS4CLNT_BIND_CONN_TO_SESSION);
TRACE_DEFINE_ENUM(NFS4CLNT_MOVED);
TRACE_DEFINE_ENUM(NFS4CLNT_LEASE_MOVED);
TRACE_DEFINE_ENUM(NFS4CLNT_DELEGATION_EXPIRED);
TRACE_DEFINE_ENUM(NFS4CLNT_RUN_MANAGER);
TRACE_DEFINE_ENUM(NFS4CLNT_DELEGRETURN_RUNNING);

#define show_nfs4_clp_state(state) \
	__print_flags(state, "|", \
		{ NFS4CLNT_MANAGER_RUNNING,	"MANAGER_RUNNING" }, \
		{ NFS4CLNT_CHECK_LEASE,		"CHECK_LEASE" }, \
		{ NFS4CLNT_LEASE_EXPIRED,	"LEASE_EXPIRED" }, \
		{ NFS4CLNT_RECLAIM_REBOOT,	"RECLAIM_REBOOT" }, \
		{ NFS4CLNT_RECLAIM_NOGRACE,	"RECLAIM_NOGRACE" }, \
		{ NFS4CLNT_DELEGRETURN,		"DELEGRETURN" }, \
		{ NFS4CLNT_SESSION_RESET,	"SESSION_RESET" }, \
		{ NFS4CLNT_LEASE_CONFIRM,	"LEASE_CONFIRM" }, \
		{ NFS4CLNT_SERVER_SCOPE_MISMATCH, \
						"SERVER_SCOPE_MISMATCH" }, \
		{ NFS4CLNT_PURGE_STATE,		"PURGE_STATE" }, \
		{ NFS4CLNT_BIND_CONN_TO_SESSION, \
						"BIND_CONN_TO_SESSION" }, \
		{ NFS4CLNT_MOVED,		"MOVED" }, \
		{ NFS4CLNT_LEASE_MOVED,		"LEASE_MOVED" }, \
		{ NFS4CLNT_DELEGATION_EXPIRED,	"DELEGATION_EXPIRED" }, \
		{ NFS4CLNT_RUN_MANAGER,		"RUN_MANAGER" }, \
		{ NFS4CLNT_DELEGRETURN_RUNNING,	"DELEGRETURN_RUNNING" })

TRACE_EVENT(nfs4_state_mgr,
		TP_PROTO(
			const struct nfs_client *clp
		),

		TP_ARGS(clp),

		TP_STRUCT__entry(
			__field(unsigned long, state)
			__string(hostname, clp->cl_hostname)
		),

		TP_fast_assign(
			__entry->state = clp->cl_state;
			__assign_str(hostname, clp->cl_hostname)
		),

		TP_printk(
			"hostname=%s clp state=%s", __get_str(hostname),
			show_nfs4_clp_state(__entry->state)
		)
)

TRACE_EVENT(nfs4_state_mgr_failed,
		TP_PROTO(
			const struct nfs_client *clp,
			const char *section,
			int status
		),

		TP_ARGS(clp, section, status),

		TP_STRUCT__entry(
			__field(unsigned long, error)
			__field(unsigned long, state)
			__string(hostname, clp->cl_hostname)
			__string(section, section)
		),

		TP_fast_assign(
			__entry->error = status;
			__entry->state = clp->cl_state;
			__assign_str(hostname, clp->cl_hostname);
			__assign_str(section, section);
		),

		TP_printk(
			"hostname=%s clp state=%s error=%ld (%s) section=%s",
			__get_str(hostname),
			show_nfs4_clp_state(__entry->state), -__entry->error,
			show_nfsv4_errors(__entry->error), __get_str(section)

		)
)

TRACE_EVENT(nfs4_xdr_status,
		TP_PROTO(
			const struct xdr_stream *xdr,