All file accesses from userland go through fcheck to map fd to struct file, making it a very good location for peeking at what files userland is accessing. Add a tracepoint there. This is part of tracepoint additions to improve visiblity into dirtying / writeback operations for io tracer and userland. Signed-off-by: Tejun Heo <tj@xxxxxxxxxx> Cc: Al Viro <viro@xxxxxxxxxxxxxxxxxx> --- fs/file.c | 3 +++ fs/super.c | 2 ++ include/trace/events/vfs.h | 42 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 47 insertions(+) --- a/fs/file.c +++ b/fs/file.c @@ -22,6 +22,7 @@ #include <linux/spinlock.h> #include <linux/rcupdate.h> #include <linux/workqueue.h> +#include <trace/events/vfs.h> struct fdtable_defer { spinlock_t lock; @@ -716,6 +717,8 @@ inline struct file *fcheck_files(struct if (fd < fdt->max_fds) file = rcu_dereference_check_fdtable(files, fdt->fd[fd]); + + trace_vfs_fcheck(files, fd, file, _THIS_IP_); return file; } EXPORT_SYMBOL(fcheck_files); --- a/fs/super.c +++ b/fs/super.c @@ -36,6 +36,8 @@ #include <linux/lockdep.h> #include "internal.h" +#define CREATE_TRACE_POINTS +#include <trace/events/vfs.h> LIST_HEAD(super_blocks); DEFINE_SPINLOCK(sb_lock); --- /dev/null +++ b/include/trace/events/vfs.h @@ -0,0 +1,42 @@ +#undef TRACE_SYSTEM +#define TRACE_SYSTEM vfs + +#if !defined(_TRACE_VFS_H) || defined(TRACE_HEADER_MULTI_READ) +#define _TRACE_VFS_H + +#include <linux/tracepoint.h> +#include <linux/fs.h> + +TRACE_EVENT(vfs_fcheck, + + TP_PROTO(struct files_struct *files, unsigned int fd, + struct file *file, unsigned long ip), + + TP_ARGS(files, fd, file, ip), + + TP_STRUCT__entry( + __field(unsigned int, fd) + __field(umode_t, mode) + __field(dev_t, dev) + __field(ino_t, ino) + __field(unsigned long, ip) + ), + + TP_fast_assign( + __entry->fd = fd; + __entry->mode = file ? file->f_path.dentry->d_inode->i_mode : 0; + __entry->dev = file ? file->f_path.dentry->d_inode->i_sb->s_dev : 0; + __entry->ino = file ? file->f_path.dentry->d_inode->i_ino : 0; + __entry->ip = ip; + ), + + TP_printk("fd %u mode 0x%x dev %d,%d ino %lu caller %pF", + __entry->fd, __entry->mode, + MAJOR(__entry->dev), MINOR(__entry->dev), + (unsigned long)__entry->ino, (void *)__entry->ip) +); + +#endif /* _TRACE_VFS_H */ + +/* This part must be outside protection */ +#include <trace/define_trace.h> -- To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html