On Wed, Mar 27, 2024 at 11:27:37PM +0800, Chen Hanxiao wrote: > Add a tracepoint for obtaining root filehandle event > > Signed-off-by: Chen Hanxiao <chenhx.fnst@xxxxxxxxxxx> > --- > fs/nfsd/export.c | 4 +--- > fs/nfsd/trace.h | 39 +++++++++++++++++++++++++++++++++++++++ > 2 files changed, 40 insertions(+), 3 deletions(-) > > diff --git a/fs/nfsd/export.c b/fs/nfsd/export.c > index 7b641095a665..690721ba42f3 100644 > --- a/fs/nfsd/export.c > +++ b/fs/nfsd/export.c > @@ -1027,15 +1027,13 @@ exp_rootfh(struct net *net, struct auth_domain *clp, char *name, > } > inode = d_inode(path.dentry); > > - dprintk("nfsd: exp_rootfh(%s [%p] %s:%s/%ld)\n", > - name, path.dentry, clp->name, > - inode->i_sb->s_id, inode->i_ino); > exp = exp_parent(cd, clp, &path); > if (IS_ERR(exp)) { > err = PTR_ERR(exp); > goto out; > } > > + trace_nfsd_exp_rootfh(name, path.dentry, clp->name, inode, exp); Converting the above dprintk to a tracepoint seems sensible. I'd like to hear comments from others about whether the new tracepoint records a useful set of information. We don't need to record the memory address of the dentry, for example. Recording the net namespace might be useful, though. > /* > * fh must be initialized before calling fh_compose > */ > diff --git a/fs/nfsd/trace.h b/fs/nfsd/trace.h > index 1cd2076210b1..a11b348f5d6d 100644 > --- a/fs/nfsd/trace.h > +++ b/fs/nfsd/trace.h > @@ -396,6 +396,45 @@ TRACE_EVENT(nfsd_export_update, > ) > ); > > +TRACE_EVENT(nfsd_exp_rootfh, > + TP_PROTO( > + const char *name, > + const struct dentry *dentry, > + const char *clp_name, > + const struct inode *inode, > + struct svc_export *exp > + ), > + TP_ARGS(name, dentry, clp_name, inode, exp), > + TP_STRUCT__entry( > + __string(name, name) > + __field(const void *, dentry) > + __string(clp_name, clp_name) > + __string(s_id, inode->i_sb->s_id) > + __field(unsigned long, i_ino) > + __array(unsigned char, uuid, 16) > + __field(const void *, ex_uuid) > + ), > + TP_fast_assign( > + __assign_str(name, name); > + __entry->dentry = dentry; > + __assign_str(clp_name, clp_name); > + __assign_str(s_id, inode->i_sb->s_id); > + __entry->i_ino = inode->i_ino; > + __entry->ex_uuid = exp->ex_uuid; > + if (exp->ex_uuid) > + memcpy(__entry->uuid, exp->ex_uuid, 16); > + ), > + TP_printk( > + "path=%s dentry=%p domain=%s sid=%s/inode=%ld uuid=%s", > + __get_str(name), > + __entry->dentry, > + __get_str(clp_name), > + __get_str(s_id), > + __entry->i_ino, > + __entry->ex_uuid ? __print_hex_str(__entry->uuid, 16) : "NULL" > + ) > +); > + > DECLARE_EVENT_CLASS(nfsd_io_class, > TP_PROTO(struct svc_rqst *rqstp, > struct svc_fh *fhp, > -- > 2.39.1 > -- Chuck Lever