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: 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>
This commit is contained in:
parent
c87f66c43c
commit
e2d4fc53e9
@ -61,6 +61,7 @@
|
|||||||
#include "nfs4session.h"
|
#include "nfs4session.h"
|
||||||
#include "pnfs.h"
|
#include "pnfs.h"
|
||||||
#include "netns.h"
|
#include "netns.h"
|
||||||
|
#include "nfs4trace.h"
|
||||||
|
|
||||||
#define NFSDBG_FACILITY NFSDBG_STATE
|
#define NFSDBG_FACILITY NFSDBG_STATE
|
||||||
|
|
||||||
@ -2525,6 +2526,7 @@ static void nfs4_state_manager(struct nfs_client *clp)
|
|||||||
|
|
||||||
/* Ensure exclusive access to NFSv4 state */
|
/* Ensure exclusive access to NFSv4 state */
|
||||||
do {
|
do {
|
||||||
|
trace_nfs4_state_mgr(clp);
|
||||||
clear_bit(NFS4CLNT_RUN_MANAGER, &clp->cl_state);
|
clear_bit(NFS4CLNT_RUN_MANAGER, &clp->cl_state);
|
||||||
if (test_bit(NFS4CLNT_PURGE_STATE, &clp->cl_state)) {
|
if (test_bit(NFS4CLNT_PURGE_STATE, &clp->cl_state)) {
|
||||||
section = "purge state";
|
section = "purge state";
|
||||||
@ -2641,6 +2643,7 @@ static void nfs4_state_manager(struct nfs_client *clp)
|
|||||||
out_error:
|
out_error:
|
||||||
if (strlen(section))
|
if (strlen(section))
|
||||||
section_sep = ": ";
|
section_sep = ": ";
|
||||||
|
trace_nfs4_state_mgr_failed(clp, section, status);
|
||||||
pr_warn_ratelimited("NFS: state manager%s%s failed on NFSv4 server %s"
|
pr_warn_ratelimited("NFS: state manager%s%s failed on NFSv4 server %s"
|
||||||
" with error %d\n", section_sep, section,
|
" with error %d\n", section_sep, section,
|
||||||
clp->cl_hostname, -status);
|
clp->cl_hostname, -status);
|
||||||
|
@ -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,
|
TRACE_EVENT(nfs4_xdr_status,
|
||||||
TP_PROTO(
|
TP_PROTO(
|
||||||
const struct xdr_stream *xdr,
|
const struct xdr_stream *xdr,
|
||||||
|
Loading…
Reference in New Issue
Block a user