]> xenbits.xensource.com Git - people/aperard/linux.git/commitdiff
NFS4: Trace state recovery operation
authorChuck Lever <chuck.lever@oracle.com>
Tue, 5 Nov 2019 16:04:07 +0000 (11:04 -0500)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 10 Oct 2023 19:46:44 +0000 (21:46 +0200)
[ 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: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
Stable-dep-of: ed1cc05aa1f7 ("NFSv4: Fix a nfs4_state_manager() race")
Signed-off-by: Sasha Levin <sashal@kernel.org>
fs/nfs/nfs4state.c
fs/nfs/nfs4trace.h

index 01b1856705941b8b7c157e770b302edea80dd747..04aa8e34d11297471870e8c2482c2665eab7f7cd 100644 (file)
@@ -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);
index 2295a934a154e6c539c3de84924159b6b7d03b87..010ee5e6fa326f6d61a84592f7fb972e0522e2ce 100644 (file)
@@ -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,