ext4: add tracepoints for DISKSIZE_GROW_PENDING set, clear, and wait

Add trace events ext4_iomap_mark_disksize_pending(),
ext4_iomap_clear_disksize_pending(), and
ext4_iomap_wait_disksize_pending() to track disksize-grow-pending
state changes and waiting.

Signed-off-by: Zhang Yi <yi.zhang@huawei.com>
Tested-by: syzbot@syzkaller.appspotmail.com
Link: https://patch.msgid.link/20261009103033.2920530-29-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:29 +08:00 committed by Theodore Ts'o
parent e766cff471
commit b7e23e0583
2 changed files with 45 additions and 3 deletions

View File

@ -133,9 +133,12 @@ void ext4_inode_csum_set(struct inode *inode, struct ext4_inode *raw,
*/
void ext4_iomap_clear_disksize_pending(struct inode *inode)
{
clear_and_wake_up_bit(
if (!test_and_clear_wake_up_bit(
ext4_inode_state_wait_bit(EXT4_STATE_DISKSIZE_GROW_PENDING),
ext4_inode_state_wait_word(inode));
ext4_inode_state_wait_word(inode)))
return;
trace_ext4_iomap_clear_disksize_pending(inode);
}
/*
@ -144,6 +147,10 @@ void ext4_iomap_clear_disksize_pending(struct inode *inode)
*/
void ext4_iomap_wait_disksize_pending(struct inode *inode)
{
/* Only emit the trace when the bit is actually set */
if (ext4_test_inode_state(inode, EXT4_STATE_DISKSIZE_GROW_PENDING))
trace_ext4_iomap_wait_disksize_pending(inode);
wait_on_bit(ext4_inode_state_wait_word(inode),
ext4_inode_state_wait_bit(EXT4_STATE_DISKSIZE_GROW_PENDING),
TASK_UNINTERRUPTIBLE);
@ -4922,8 +4929,10 @@ static int ext4_iomap_mark_disksize_pending(struct inode *inode, loff_t from)
*/
if (likely(folio_test_dirty(folio) &&
!ext4_test_inode_state(inode,
EXT4_STATE_DISKSIZE_GROW_PENDING)))
EXT4_STATE_DISKSIZE_GROW_PENDING))) {
trace_ext4_iomap_mark_disksize_pending(inode);
ext4_set_inode_state(inode, EXT4_STATE_DISKSIZE_GROW_PENDING);
}
out:
folio_unlock(folio);
folio_put(folio);

View File

@ -3204,6 +3204,39 @@ 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);
DECLARE_EVENT_CLASS(ext4_iomap_disksize_pending,
TP_PROTO(struct inode *inode),
TP_ARGS(inode),
TP_STRUCT__entry(
__field(dev_t, dev)
__field(u64, ino)
__field(loff_t, i_disksize)
),
TP_fast_assign(
__entry->dev = inode->i_sb->s_dev;
__entry->ino = inode->i_ino;
__entry->i_disksize = READ_ONCE(EXT4_I(inode)->i_disksize);
),
TP_printk("dev %d:%d ino %llu i_disksize %lld",
MAJOR(__entry->dev), MINOR(__entry->dev),
__entry->ino, __entry->i_disksize)
);
DEFINE_EVENT(ext4_iomap_disksize_pending, ext4_iomap_mark_disksize_pending,
TP_PROTO(struct inode *inode),
TP_ARGS(inode)
);
DEFINE_EVENT(ext4_iomap_disksize_pending, ext4_iomap_clear_disksize_pending,
TP_PROTO(struct inode *inode),
TP_ARGS(inode)
);
DEFINE_EVENT(ext4_iomap_disksize_pending, ext4_iomap_wait_disksize_pending,
TP_PROTO(struct inode *inode),
TP_ARGS(inode)
);
#endif /* _TRACE_EXT4_H */
/* This part must be outside protection */