ext4: add block mapping tracepoints for iomap buffered I/O path

Add tracepoints for iomap buffered read, write, partial block zeroing,
and writeback operations to help debug the iomap buffered I/O path.

Signed-off-by: Zhang Yi <yi.zhang@huawei.com>
Reviewed-by: Ojaswin Mujoo <ojaswin@linux.ibm.com>
Reviewed-by: Jan Kara <jack@suse.cz>
Tested-by: syzbot@syzkaller.appspotmail.com
Link: https://patch.msgid.link/20261009103033.2920530-20-yi.zhang@huaweicloud.com
Signed-off-by: Theodore Ts'o <tytso@mit.edu>
This commit is contained in:
Zhang Yi 2026-10-09 18:30:20 +08:00 committed by Theodore Ts'o
parent 3c612a5720
commit 008f019ab5
2 changed files with 53 additions and 0 deletions

View File

@ -4019,6 +4019,8 @@ static int ext4_iomap_buffered_read_begin(struct inode *inode, loff_t offset,
if (ret < 0)
return ret;
trace_ext4_iomap_buffered_read_begin(inode, &map, offset, length,
flags);
ext4_set_iomap(inode, iomap, &map, offset, length, flags);
return 0;
}
@ -4052,6 +4054,8 @@ static int ext4_iomap_buffered_do_write_begin(struct inode *inode,
if (ret < 0)
return ret;
trace_ext4_iomap_buffered_write_begin(inode, &map, offset, length,
flags);
ext4_set_iomap(inode, iomap, &map, offset, length, flags);
return 0;
}
@ -4168,6 +4172,7 @@ static int ext4_iomap_zero_begin(struct inode *inode,
goto again;
}
trace_ext4_iomap_zero_begin(inode, &map, offset, length, flags);
ext4_set_iomap(inode, iomap, &map, offset, length, flags);
iomap->flags |= iomap_flags;
@ -4279,6 +4284,7 @@ static int ext4_iomap_map_writeback_range(struct iomap_writepage_ctx *wpc,
return ret;
}
trace_ext4_iomap_map_writeback_range(inode, &map, offset, dirty_len, 0);
ext4_set_iomap(inode, &wpc->iomap, &map, offset, dirty_len, 0);
return 0;
}

View File

@ -3157,6 +3157,53 @@ TRACE_EVENT(ext4_move_extent_exit,
__entry->ret)
);
DECLARE_EVENT_CLASS(ext4_set_iomap_class,
TP_PROTO(struct inode *inode, struct ext4_map_blocks *map,
loff_t offset, loff_t length, unsigned int flags),
TP_ARGS(inode, map, offset, length, flags),
TP_STRUCT__entry(
__field(dev_t, dev)
__field(u64, ino)
__field(ext4_lblk_t, m_lblk)
__field(ext4_fsblk_t, pblk)
__field(unsigned int, m_len)
__field(unsigned int, m_flags)
__field(u64, m_seq)
__field(loff_t, offset)
__field(loff_t, length)
__field(unsigned int, iomap_flags)
),
TP_fast_assign(
__entry->dev = inode->i_sb->s_dev;
__entry->ino = inode->i_ino;
__entry->m_lblk = map->m_lblk;
__entry->pblk = map->m_pblk;
__entry->m_len = map->m_len;
__entry->m_flags = map->m_flags;
__entry->m_seq = map->m_seq;
__entry->offset = offset;
__entry->length = length;
__entry->iomap_flags = flags;
),
TP_printk("dev %d:%d ino %llu m_lblk %u pblk %llu m_len %u m_flags %s m_seq %llu orig_off 0x%llx orig_len 0x%llx iomap_flags 0x%x",
MAJOR(__entry->dev), MINOR(__entry->dev),
__entry->ino, __entry->m_lblk, __entry->pblk, __entry->m_len,
show_mflags(__entry->m_flags), __entry->m_seq,
__entry->offset, __entry->length, __entry->iomap_flags)
)
#define DEFINE_SET_IOMAP_EVENT(name) \
DEFINE_EVENT(ext4_set_iomap_class, name, \
TP_PROTO(struct inode *inode, struct ext4_map_blocks *map, \
loff_t offset, loff_t length, unsigned int flags), \
TP_ARGS(inode, map, offset, length, flags))
DEFINE_SET_IOMAP_EVENT(ext4_iomap_buffered_read_begin);
DEFINE_SET_IOMAP_EVENT(ext4_iomap_buffered_write_begin);
DEFINE_SET_IOMAP_EVENT(ext4_iomap_map_writeback_range);
DEFINE_SET_IOMAP_EVENT(ext4_iomap_zero_begin);
#endif /* _TRACE_EXT4_H */
/* This part must be outside protection */