diff --git a/kmod/src/dir.c b/kmod/src/dir.c index 7cbc9bb6..e79d3245 100644 --- a/kmod/src/dir.c +++ b/kmod/src/dir.c @@ -269,9 +269,10 @@ static int scoutfs_d_revalidate(struct dentry *dentry, unsigned int flags) { struct super_block *sb = dentry->d_sb; struct dentry_info *di = dentry->d_fsdata; + struct dentry *parent = dget_parent(dentry); struct scoutfs_lock *lock = NULL; struct scoutfs_dirent dent; - struct dentry *parent = NULL; + bool is_covered = false; struct inode *dir; u64 dentry_ino; int ret; @@ -300,13 +301,13 @@ static int scoutfs_d_revalidate(struct dentry *dentry, unsigned int flags) goto out; } - if (scoutfs_lock_is_covered(sb, &di->lock_cov)) { + is_covered = scoutfs_lock_is_covered(sb, &di->lock_cov); + if (is_covered) { scoutfs_inc_counter(sb, dentry_revalidate_locked); ret = 1; goto out; } - parent = dget_parent(dentry); if (!parent || !parent->d_inode) { scoutfs_inc_counter(sb, dentry_revalidate_orphan); ret = 0; @@ -338,6 +339,8 @@ static int scoutfs_d_revalidate(struct dentry *dentry, unsigned int flags) } out: + trace_scoutfs_d_revalidate(sb, dentry, flags, parent, is_covered, ret); + dput(parent); scoutfs_unlock(sb, lock, DLM_LOCK_PR); diff --git a/kmod/src/scoutfs_trace.h b/kmod/src/scoutfs_trace.h index 58293a52..7a07b7cb 100644 --- a/kmod/src/scoutfs_trace.h +++ b/kmod/src/scoutfs_trace.h @@ -36,6 +36,7 @@ #include "count.h" #include "bio.h" #include "export.h" +#include "dir.h" struct lock_info; @@ -1887,6 +1888,45 @@ TRACE_EVENT(scoutfs_rename, __entry->new_inode_ino) ); +TRACE_EVENT(scoutfs_d_revalidate, + TP_PROTO(struct super_block *sb, + struct dentry *dentry, int flags, struct dentry *parent, + bool is_covered, int ret), + + TP_ARGS(sb, dentry, flags, parent, is_covered, ret), + + TP_STRUCT__entry( + __field(__u64, fsid) + __string(name, dentry->d_name.name) + __field(__u64, ino) + __field(__u64, parent_ino) + __field(int, flags) + __field(int, is_root) + __field(int, is_covered) + __field(int, ret) + ), + + TP_fast_assign( + __entry->fsid = FSID_ARG(sb); + __assign_str(name, dentry->d_name.name) + __entry->ino = dentry->d_inode ? + scoutfs_ino(dentry->d_inode) : 0; + __entry->parent_ino = parent->d_inode ? + scoutfs_ino(parent->d_inode) : 0; + __entry->flags = flags; + __entry->is_root = IS_ROOT(dentry); + __entry->is_covered = is_covered; + __entry->ret = ret; + ), + + TP_printk("fsid "FSID_FMT" name %s ino %llu parent_ino %llu flags 0x%x s_root %u is_covered %u ret %d", + __entry->fsid, __get_str(name), __entry->ino, + __entry->parent_ino, __entry->flags, + __entry->is_root, + __entry->is_covered, + __entry->ret) +); + DECLARE_EVENT_CLASS(scoutfs_super_lifecycle_class, TP_PROTO(struct super_block *sb), TP_ARGS(sb),