From b7e23e0583541f96cd795f67a132397b44451d8f Mon Sep 17 00:00:00 2001 From: Zhang Yi Date: Fri, 9 Oct 2026 18:30:29 +0800 Subject: [PATCH] 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 Tested-by: syzbot@syzkaller.appspotmail.com Link: https://patch.msgid.link/20261009103033.2920530-29-yi.zhang@huaweicloud.com Signed-off-by: Theodore Ts'o --- fs/ext4/inode.c | 15 ++++++++++++--- include/trace/events/ext4.h | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 45 insertions(+), 3 deletions(-) diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c index 7820e6d8126f..cb2b089d4419 100644 --- a/fs/ext4/inode.c +++ b/fs/ext4/inode.c @@ -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); diff --git a/include/trace/events/ext4.h b/include/trace/events/ext4.h index bcf80f518e61..d33456d06b00 100644 --- a/include/trace/events/ext4.h +++ b/include/trace/events/ext4.h @@ -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 */