Al pointed out that the test for whether a mapping refers to a blockdev inode in these tracepoints is garbage, as the superblock is always non-NULL. Add a new mapping_to_dev helper function that determines this the correct way, and change the tracepoints to use it. Also, fix up the indentation in this file. Reported-by: Al Viro <viro@xxxxxxxxxxxxxxxxxx> Signed-off-by: Jeff Layton <jlayton@xxxxxxxxxx> --- include/linux/fs.h | 16 ++++++ include/trace/events/filemap.h | 99 +++++++++++++++------------------- 2 files changed, 60 insertions(+), 55 deletions(-) Al, sorry. I had based the original on an older tree. This one should merge more cleanly, and also just adds a single, non-conditionally compiled helper. diff --git a/include/linux/fs.h b/include/linux/fs.h index 40be2ccb87f3..264ac7d602a6 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -2616,6 +2616,22 @@ static inline bool sb_is_blkdev_sb(struct super_block *sb) return false; } #endif + +/* + * Return the device associated with this mapping. + * + * For normal inodes, return the sb of the backing filesystem, for blockdev + * inodes, return the block device number associated with the inode. + */ +static inline dev_t mapping_to_dev(struct address_space *mapping) +{ + struct inode *inode = mapping->host; + + if (sb_is_blkdev_sb(inode->i_sb)) + return inode->i_rdev; + return inode->i_sb->s_dev; +} + extern int sync_filesystem(struct super_block *); extern const struct file_operations def_blk_fops; extern const struct file_operations def_chr_fops; diff --git a/include/trace/events/filemap.h b/include/trace/events/filemap.h index 796053e162d2..bddcc7d0bdfd 100644 --- a/include/trace/events/filemap.h +++ b/include/trace/events/filemap.h @@ -30,10 +30,7 @@ DECLARE_EVENT_CLASS(mm_filemap_op_page_cache, __entry->pfn = page_to_pfn(page); __entry->i_ino = page->mapping->host->i_ino; __entry->index = page->index; - if (page->mapping->host->i_sb) - __entry->s_dev = page->mapping->host->i_sb->s_dev; - else - __entry->s_dev = page->mapping->host->i_rdev; + __entry->s_dev = mapping_to_dev(page->mapping); ), TP_printk("dev %d:%d ino %lx page=%p pfn=%lu ofs=%lu", @@ -55,60 +52,52 @@ DEFINE_EVENT(mm_filemap_op_page_cache, mm_filemap_add_to_page_cache, ); TRACE_EVENT(filemap_set_wb_err, - TP_PROTO(struct address_space *mapping, errseq_t eseq), - - TP_ARGS(mapping, eseq), - - TP_STRUCT__entry( - __field(unsigned long, i_ino) - __field(dev_t, s_dev) - __field(errseq_t, errseq) - ), - - TP_fast_assign( - __entry->i_ino = mapping->host->i_ino; - __entry->errseq = eseq; - if (mapping->host->i_sb) - __entry->s_dev = mapping->host->i_sb->s_dev; - else - __entry->s_dev = mapping->host->i_rdev; - ), - - TP_printk("dev=%d:%d ino=0x%lx errseq=0x%x", - MAJOR(__entry->s_dev), MINOR(__entry->s_dev), - __entry->i_ino, __entry->errseq) + TP_PROTO(struct address_space *mapping, errseq_t eseq), + + TP_ARGS(mapping, eseq), + + TP_STRUCT__entry( + __field(unsigned long, i_ino) + __field(dev_t, s_dev) + __field(errseq_t, errseq) + ), + + TP_fast_assign( + __entry->i_ino = mapping->host->i_ino; + __entry->errseq = eseq; + __entry->s_dev = mapping_to_dev(mapping); + ), + + TP_printk("dev=%d:%d ino=0x%lx errseq=0x%x", + MAJOR(__entry->s_dev), MINOR(__entry->s_dev), + __entry->i_ino, __entry->errseq) ); TRACE_EVENT(file_check_and_advance_wb_err, - TP_PROTO(struct file *file, errseq_t old), - - TP_ARGS(file, old), - - TP_STRUCT__entry( - __field(struct file *, file) - __field(unsigned long, i_ino) - __field(dev_t, s_dev) - __field(errseq_t, old) - __field(errseq_t, new) - ), - - TP_fast_assign( - __entry->file = file; - __entry->i_ino = file->f_mapping->host->i_ino; - if (file->f_mapping->host->i_sb) - __entry->s_dev = - file->f_mapping->host->i_sb->s_dev; - else - __entry->s_dev = - file->f_mapping->host->i_rdev; - __entry->old = old; - __entry->new = file->f_wb_err; - ), - - TP_printk("file=%p dev=%d:%d ino=0x%lx old=0x%x new=0x%x", - __entry->file, MAJOR(__entry->s_dev), - MINOR(__entry->s_dev), __entry->i_ino, __entry->old, - __entry->new) + TP_PROTO(struct file *file, errseq_t old), + + TP_ARGS(file, old), + + TP_STRUCT__entry( + __field(struct file *, file) + __field(unsigned long, i_ino) + __field(dev_t, s_dev) + __field(errseq_t, old) + __field(errseq_t, new) + ), + + TP_fast_assign( + __entry->file = file; + __entry->i_ino = file->f_mapping->host->i_ino; + __entry->s_dev = mapping_to_dev(file->f_mapping); + __entry->old = old; + __entry->new = file->f_wb_err; + ), + + TP_printk("file=%p dev=%d:%d ino=0x%lx old=0x%x new=0x%x", + __entry->file, MAJOR(__entry->s_dev), + MINOR(__entry->s_dev), __entry->i_ino, __entry->old, + __entry->new) ); #endif /* _TRACE_FILEMAP_H */ -- 2.24.1