NFS4: Add a trace event to record invalid CB sequence IDs
Help debug NFSv4 callback failures. Signed-off-by: Chuck Lever <chuck.lever@oracle.com> Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
This commit is contained in:
parent
675dd90ad0
commit
c5833f0dc4
@ -414,27 +414,39 @@ static __be32
|
||||
validate_seqid(const struct nfs4_slot_table *tbl, const struct nfs4_slot *slot,
|
||||
const struct cb_sequenceargs * args)
|
||||
{
|
||||
__be32 ret;
|
||||
|
||||
ret = cpu_to_be32(NFS4ERR_BADSLOT);
|
||||
if (args->csa_slotid > tbl->server_highest_slotid)
|
||||
return htonl(NFS4ERR_BADSLOT);
|
||||
goto out_err;
|
||||
|
||||
/* Replay */
|
||||
if (args->csa_sequenceid == slot->seq_nr) {
|
||||
ret = cpu_to_be32(NFS4ERR_DELAY);
|
||||
if (nfs4_test_locked_slot(tbl, slot->slot_nr))
|
||||
return htonl(NFS4ERR_DELAY);
|
||||
goto out_err;
|
||||
|
||||
/* Signal process_op to set this error on next op */
|
||||
ret = cpu_to_be32(NFS4ERR_RETRY_UNCACHED_REP);
|
||||
if (args->csa_cachethis == 0)
|
||||
return htonl(NFS4ERR_RETRY_UNCACHED_REP);
|
||||
goto out_err;
|
||||
|
||||
/* Liar! We never allowed you to set csa_cachethis != 0 */
|
||||
return htonl(NFS4ERR_SEQ_FALSE_RETRY);
|
||||
ret = cpu_to_be32(NFS4ERR_SEQ_FALSE_RETRY);
|
||||
goto out_err;
|
||||
}
|
||||
|
||||
/* Note: wraparound relies on seq_nr being of type u32 */
|
||||
if (likely(args->csa_sequenceid == slot->seq_nr + 1))
|
||||
return htonl(NFS4_OK);
|
||||
|
||||
/* Misordered request */
|
||||
return htonl(NFS4ERR_SEQ_MISORDERED);
|
||||
ret = cpu_to_be32(NFS4ERR_SEQ_MISORDERED);
|
||||
if (args->csa_sequenceid != slot->seq_nr + 1)
|
||||
goto out_err;
|
||||
|
||||
return cpu_to_be32(NFS4_OK);
|
||||
|
||||
out_err:
|
||||
trace_nfs4_cb_seqid_err(args, ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -490,6 +490,44 @@ TRACE_EVENT(nfs4_cb_sequence,
|
||||
__entry->highest_slotid
|
||||
)
|
||||
);
|
||||
|
||||
TRACE_EVENT(nfs4_cb_seqid_err,
|
||||
TP_PROTO(
|
||||
const struct cb_sequenceargs *args,
|
||||
__be32 status
|
||||
),
|
||||
TP_ARGS(args, status),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
__field(unsigned int, session)
|
||||
__field(unsigned int, slot_nr)
|
||||
__field(unsigned int, seq_nr)
|
||||
__field(unsigned int, highest_slotid)
|
||||
__field(unsigned int, cachethis)
|
||||
__field(int, error)
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
__entry->session = nfs_session_id_hash(&args->csa_sessionid);
|
||||
__entry->slot_nr = args->csa_slotid;
|
||||
__entry->seq_nr = args->csa_sequenceid;
|
||||
__entry->highest_slotid = args->csa_highestslotid;
|
||||
__entry->cachethis = args->csa_cachethis;
|
||||
__entry->error = -be32_to_cpu(status);
|
||||
),
|
||||
|
||||
TP_printk(
|
||||
"error=%d (%s) session=0x%08x slot_nr=%u seq_nr=%u "
|
||||
"highest_slotid=%u",
|
||||
__entry->error,
|
||||
show_nfsv4_errors(__entry->error),
|
||||
__entry->session,
|
||||
__entry->slot_nr,
|
||||
__entry->seq_nr,
|
||||
__entry->highest_slotid
|
||||
)
|
||||
);
|
||||
|
||||
#endif /* CONFIG_NFS_V4_1 */
|
||||
|
||||
TRACE_EVENT(nfs4_setup_sequence,
|
||||
|
Loading…
Reference in New Issue
Block a user