NFS4: Add a trace event to record invalid CB sequence IDs
authorChuck Lever <chuck.lever@oracle.com>
Wed, 19 Jun 2019 14:33:47 +0000 (10:33 -0400)
committerAnna Schumaker <Anna.Schumaker@Netapp.com>
Tue, 9 Jul 2019 14:30:25 +0000 (10:30 -0400)
Help debug NFSv4 callback failures.

Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
fs/nfs/callback_proc.c
fs/nfs/nfs4trace.h

index 3159673549540f063124d62a6cc7098f86ec6ae8..f39924ba050b1a69680b031a0dbe4997cf4350ea 100644 (file)
@@ -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;
 }
 
 /*
index cd1a5c08da9ad85f3298919389296349d409a0a8..6beb1f29134b0d709ef85d04538cf51acb43db40 100644 (file)
@@ -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,