Loading fs/nfsd/nfsfh.c +10 −3 Original line number Diff line number Diff line Loading @@ -14,6 +14,7 @@ #include "nfsd.h" #include "vfs.h" #include "auth.h" #include "trace.h" #define NFSDDBG_FACILITY NFSDDBG_FH Loading Loading @@ -209,11 +210,14 @@ static __be32 nfsd_set_fh_dentry(struct svc_rqst *rqstp, struct svc_fh *fhp) } error = nfserr_stale; 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' Loading Loading @@ -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; Loading fs/nfsd/trace.h +30 −0 Original line number Diff line number Diff line Loading @@ -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, Loading Loading
fs/nfsd/nfsfh.c +10 −3 Original line number Diff line number Diff line Loading @@ -14,6 +14,7 @@ #include "nfsd.h" #include "vfs.h" #include "auth.h" #include "trace.h" #define NFSDDBG_FACILITY NFSDDBG_FH Loading Loading @@ -209,11 +210,14 @@ static __be32 nfsd_set_fh_dentry(struct svc_rqst *rqstp, struct svc_fh *fhp) } error = nfserr_stale; 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' Loading Loading @@ -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; Loading
fs/nfsd/trace.h +30 −0 Original line number Diff line number Diff line Loading @@ -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, Loading