nfsd: Add tracing to nfsd_set_fh_dentry()
authorTrond Myklebust <trondmy@gmail.com>
Sun, 1 Mar 2020 23:21:39 +0000 (18:21 -0500)
committerChuck Lever <chuck.lever@oracle.com>
Mon, 16 Mar 2020 16:04:33 +0000 (12:04 -0400)
Add tracing to allow us to figure out where any stale filehandle issues
may be originating from.

Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
fs/nfsd/nfsfh.c
fs/nfsd/trace.h

index b319080288c36c8f77dee284ea37db1b84aa3866..37bc8f5f4514286faed2941df3788e65dfc640e9 100644 (file)
@@ -14,6 +14,7 @@
 #include "nfsd.h"
 #include "vfs.h"
 #include "auth.h"
+#include "trace.h"
 
 #define NFSDDBG_FACILITY               NFSDDBG_FH
 
@@ -209,11 +210,14 @@ static __be32 nfsd_set_fh_dentry(struct svc_rqst *rqstp, struct svc_fh *fhp)
        }
 
        error = nfserr_stale;
-       if (PTR_ERR(exp) == -ENOENT)
-               return error;
+       if (IS_ERR(exp)) {
+               trace_nfsd_set_fh_dentry_badexport(rqstp, fhp, PTR_ERR(exp));
+
+               if (PTR_ERR(exp) == -ENOENT)
+                       return error;
 
-       if (IS_ERR(exp))
                return nfserrno(PTR_ERR(exp));
+       }
 
        if (exp->ex_flags & NFSEXP_NOSUBTREECHECK) {
                /* Elevate privileges so that the lack of 'r' or 'x'
@@ -267,6 +271,9 @@ static __be32 nfsd_set_fh_dentry(struct svc_rqst *rqstp, struct svc_fh *fhp)
                dentry = exportfs_decode_fh(exp->ex_path.mnt, fid,
                                data_left, fileid_type,
                                nfsd_acceptable, exp);
+               if (IS_ERR_OR_NULL(dentry))
+                       trace_nfsd_set_fh_dentry_badhandle(rqstp, fhp,
+                                       dentry ?  PTR_ERR(dentry) : -ESTALE);
        }
        if (dentry == NULL)
                goto out;
index 06dd0d33704922c9dac70615cd7b301f0278f487..9abd1591a841cba1fb36b68b2ae48a1d203acabb 100644 (file)
@@ -50,6 +50,36 @@ TRACE_EVENT(nfsd_compound_status,
                __get_str(name), __entry->status)
 )
 
+DECLARE_EVENT_CLASS(nfsd_fh_err_class,
+       TP_PROTO(struct svc_rqst *rqstp,
+                struct svc_fh  *fhp,
+                int            status),
+       TP_ARGS(rqstp, fhp, status),
+       TP_STRUCT__entry(
+               __field(u32, xid)
+               __field(u32, fh_hash)
+               __field(int, status)
+       ),
+       TP_fast_assign(
+               __entry->xid = be32_to_cpu(rqstp->rq_xid);
+               __entry->fh_hash = knfsd_fh_hash(&fhp->fh_handle);
+               __entry->status = status;
+       ),
+       TP_printk("xid=0x%08x fh_hash=0x%08x status=%d",
+                 __entry->xid, __entry->fh_hash,
+                 __entry->status)
+)
+
+#define DEFINE_NFSD_FH_ERR_EVENT(name)         \
+DEFINE_EVENT(nfsd_fh_err_class, nfsd_##name,   \
+       TP_PROTO(struct svc_rqst *rqstp,        \
+                struct svc_fh  *fhp,           \
+                int            status),        \
+       TP_ARGS(rqstp, fhp, status))
+
+DEFINE_NFSD_FH_ERR_EVENT(set_fh_dentry_badexport);
+DEFINE_NFSD_FH_ERR_EVENT(set_fh_dentry_badhandle);
+
 DECLARE_EVENT_CLASS(nfsd_io_class,
        TP_PROTO(struct svc_rqst *rqstp,
                 struct svc_fh  *fhp,