Skip to content

Commit 21f86d2

Browse files
chuckleverTrond Myklebust
authored andcommitted
NFS4: Trace lock reclaims
One of the most frustrating messages our sustaining team sees is the "Lock reclaim failed!" message. Add some observability in the client's lock reclaim logic so we can capture better data the first time a problem occurs. Signed-off-by: Chuck Lever <[email protected]> Signed-off-by: Trond Myklebust <[email protected]>
1 parent 511ba52 commit 21f86d2

File tree

3 files changed

+83
-2
lines changed

3 files changed

+83
-2
lines changed

fs/nfs/nfs4_fs.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -166,11 +166,9 @@ enum {
166166
NFS_STATE_RECOVERY_FAILED, /* OPEN stateid state recovery failed */
167167
NFS_STATE_MAY_NOTIFY_LOCK, /* server may CB_NOTIFY_LOCK */
168168
NFS_STATE_CHANGE_WAIT, /* A state changing operation is outstanding */
169-
#ifdef CONFIG_NFS_V4_2
170169
NFS_CLNT_DST_SSC_COPY_STATE, /* dst server open state on client*/
171170
NFS_CLNT_SRC_SSC_COPY_STATE, /* src server open state on client*/
172171
NFS_SRV_SSC_COPY_STATE, /* ssc state on the dst server */
173-
#endif /* CONFIG_NFS_V4_2 */
174172
};
175173

176174
struct nfs4_state {

fs/nfs/nfs4state.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1611,6 +1611,7 @@ static int __nfs4_reclaim_open_state(struct nfs4_state_owner *sp, struct nfs4_st
16111611
if (!test_bit(NFS_DELEGATED_STATE, &state->flags)) {
16121612
spin_lock(&state->state_lock);
16131613
list_for_each_entry(lock, &state->lock_states, ls_locks) {
1614+
trace_nfs4_state_lock_reclaim(state, lock);
16141615
if (!test_bit(NFS_LOCK_INITIALIZED, &lock->ls_flags))
16151616
pr_warn_ratelimited("NFS: %s: Lock reclaim failed!\n", __func__);
16161617
}

fs/nfs/nfs4trace.h

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1022,6 +1022,88 @@ TRACE_EVENT(nfs4_set_lock,
10221022
)
10231023
);
10241024

1025+
TRACE_DEFINE_ENUM(LK_STATE_IN_USE);
1026+
TRACE_DEFINE_ENUM(NFS_DELEGATED_STATE);
1027+
TRACE_DEFINE_ENUM(NFS_OPEN_STATE);
1028+
TRACE_DEFINE_ENUM(NFS_O_RDONLY_STATE);
1029+
TRACE_DEFINE_ENUM(NFS_O_WRONLY_STATE);
1030+
TRACE_DEFINE_ENUM(NFS_O_RDWR_STATE);
1031+
TRACE_DEFINE_ENUM(NFS_STATE_RECLAIM_REBOOT);
1032+
TRACE_DEFINE_ENUM(NFS_STATE_RECLAIM_NOGRACE);
1033+
TRACE_DEFINE_ENUM(NFS_STATE_POSIX_LOCKS);
1034+
TRACE_DEFINE_ENUM(NFS_STATE_RECOVERY_FAILED);
1035+
TRACE_DEFINE_ENUM(NFS_STATE_MAY_NOTIFY_LOCK);
1036+
TRACE_DEFINE_ENUM(NFS_STATE_CHANGE_WAIT);
1037+
TRACE_DEFINE_ENUM(NFS_CLNT_DST_SSC_COPY_STATE);
1038+
TRACE_DEFINE_ENUM(NFS_CLNT_SRC_SSC_COPY_STATE);
1039+
TRACE_DEFINE_ENUM(NFS_SRV_SSC_COPY_STATE);
1040+
1041+
#define show_nfs4_state_flags(flags) \
1042+
__print_flags(flags, "|", \
1043+
{ LK_STATE_IN_USE, "IN_USE" }, \
1044+
{ NFS_DELEGATED_STATE, "DELEGATED" }, \
1045+
{ NFS_OPEN_STATE, "OPEN" }, \
1046+
{ NFS_O_RDONLY_STATE, "O_RDONLY" }, \
1047+
{ NFS_O_WRONLY_STATE, "O_WRONLY" }, \
1048+
{ NFS_O_RDWR_STATE, "O_RDWR" }, \
1049+
{ NFS_STATE_RECLAIM_REBOOT, "RECLAIM_REBOOT" }, \
1050+
{ NFS_STATE_RECLAIM_NOGRACE, "RECLAIM_NOGRACE" }, \
1051+
{ NFS_STATE_POSIX_LOCKS, "POSIX_LOCKS" }, \
1052+
{ NFS_STATE_RECOVERY_FAILED, "RECOVERY_FAILED" }, \
1053+
{ NFS_STATE_MAY_NOTIFY_LOCK, "MAY_NOTIFY_LOCK" }, \
1054+
{ NFS_STATE_CHANGE_WAIT, "CHANGE_WAIT" }, \
1055+
{ NFS_CLNT_DST_SSC_COPY_STATE, "CLNT_DST_SSC_COPY" }, \
1056+
{ NFS_CLNT_SRC_SSC_COPY_STATE, "CLNT_SRC_SSC_COPY" }, \
1057+
{ NFS_SRV_SSC_COPY_STATE, "SRV_SSC_COPY" })
1058+
1059+
#define show_nfs4_lock_flags(flags) \
1060+
__print_flags(flags, "|", \
1061+
{ BIT(NFS_LOCK_INITIALIZED), "INITIALIZED" }, \
1062+
{ BIT(NFS_LOCK_LOST), "LOST" })
1063+
1064+
TRACE_EVENT(nfs4_state_lock_reclaim,
1065+
TP_PROTO(
1066+
const struct nfs4_state *state,
1067+
const struct nfs4_lock_state *lock
1068+
),
1069+
1070+
TP_ARGS(state, lock),
1071+
1072+
TP_STRUCT__entry(
1073+
__field(dev_t, dev)
1074+
__field(u32, fhandle)
1075+
__field(u64, fileid)
1076+
__field(unsigned long, state_flags)
1077+
__field(unsigned long, lock_flags)
1078+
__field(int, stateid_seq)
1079+
__field(u32, stateid_hash)
1080+
),
1081+
1082+
TP_fast_assign(
1083+
const struct inode *inode = state->inode;
1084+
1085+
__entry->dev = inode->i_sb->s_dev;
1086+
__entry->fileid = NFS_FILEID(inode);
1087+
__entry->fhandle = nfs_fhandle_hash(NFS_FH(inode));
1088+
__entry->state_flags = state->flags;
1089+
__entry->lock_flags = lock->ls_flags;
1090+
__entry->stateid_seq =
1091+
be32_to_cpu(state->stateid.seqid);
1092+
__entry->stateid_hash =
1093+
nfs_stateid_hash(&state->stateid);
1094+
),
1095+
1096+
TP_printk(
1097+
"fileid=%02x:%02x:%llu fhandle=0x%08x "
1098+
"stateid=%d:0x%08x state_flags=%s lock_flags=%s",
1099+
MAJOR(__entry->dev), MINOR(__entry->dev),
1100+
(unsigned long long)__entry->fileid, __entry->fhandle,
1101+
__entry->stateid_seq, __entry->stateid_hash,
1102+
show_nfs4_state_flags(__entry->state_flags),
1103+
show_nfs4_lock_flags(__entry->lock_flags)
1104+
)
1105+
)
1106+
10251107
DECLARE_EVENT_CLASS(nfs4_set_delegation_event,
10261108
TP_PROTO(
10271109
const struct inode *inode,

0 commit comments

Comments
 (0)