mirror of
https://github.com/torvalds/linux.git
synced 2026-11-07 06:17:02 +01:00
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:
parent
e766cff471
commit
b7e23e0583
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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 */
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user