]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
ext4: add two trace points for moving extents
authorZhang Yi <yi.zhang@huawei.com>
Mon, 13 Oct 2025 01:51:28 +0000 (09:51 +0800)
committerTheodore Ts'o <tytso@mit.edu>
Thu, 6 Nov 2025 15:44:39 +0000 (10:44 -0500)
To facilitate tracking the length, type, and outcome of the move extent,
add a trace point at both the entry and exit of mext_move_extent().

Signed-off-by: Zhang Yi <yi.zhang@huawei.com>
Reviewed-by: Jan Kara <jack@suse.cz>
Message-ID: <20251013015128.499308-13-yi.zhang@huaweicloud.com>
Signed-off-by: Theodore Ts'o <tytso@mit.edu>
fs/ext4/move_extent.c
include/trace/events/ext4.h

index f04755c2165ac11915419736f8b3ceca56d34afe..0550fd30fd10f2f229f6a2698c927a1fd6911775 100644 (file)
@@ -13,6 +13,8 @@
 #include "ext4.h"
 #include "ext4_extents.h"
 
+#include <trace/events/ext4.h>
+
 struct mext_data {
        struct inode *orig_inode;       /* Origin file inode */
        struct inode *donor_inode;      /* Donor file inode */
@@ -311,10 +313,14 @@ static int mext_move_extent(struct mext_data *mext, u64 *m_len)
        int ret, ret2;
 
        *m_len = 0;
+       trace_ext4_move_extent_enter(orig_inode, orig_map, donor_inode,
+                                    mext->donor_lblk);
        credits = ext4_chunk_trans_extent(orig_inode, 0) * 2;
        handle = ext4_journal_start(orig_inode, EXT4_HT_MOVE_EXTENTS, credits);
-       if (IS_ERR(handle))
-               return PTR_ERR(handle);
+       if (IS_ERR(handle)) {
+               ret = PTR_ERR(handle);
+               goto out;
+       }
 
        ret = mext_move_begin(mext, folio, &move_type);
        if (ret)
@@ -379,6 +385,10 @@ unlock:
        mext_folio_double_unlock(folio);
 stop_handle:
        ext4_journal_stop(handle);
+out:
+       trace_ext4_move_extent_exit(orig_inode, orig_map->m_lblk, donor_inode,
+                                   mext->donor_lblk, orig_map->m_len, *m_len,
+                                   move_type, ret);
        return ret;
 
 repair_branches:
index 6a0754d38acfbd37f9403271669bdb8234952332..a05bdd48e16eaec9a39bfebbce2f94d2ce139a47 100644 (file)
@@ -3016,6 +3016,80 @@ TRACE_EVENT(ext4_update_sb,
                  __entry->fsblk, __entry->flags)
 );
 
+TRACE_EVENT(ext4_move_extent_enter,
+       TP_PROTO(struct inode *orig_inode, struct ext4_map_blocks *orig_map,
+                struct inode *donor_inode, ext4_lblk_t donor_lblk),
+
+       TP_ARGS(orig_inode, orig_map, donor_inode, donor_lblk),
+
+       TP_STRUCT__entry(
+               __field(dev_t, dev)
+               __field(ino_t, orig_ino)
+               __field(ext4_lblk_t, orig_lblk)
+               __field(unsigned int, orig_flags)
+               __field(ino_t, donor_ino)
+               __field(ext4_lblk_t, donor_lblk)
+               __field(unsigned int, len)
+       ),
+
+       TP_fast_assign(
+               __entry->dev            = orig_inode->i_sb->s_dev;
+               __entry->orig_ino       = orig_inode->i_ino;
+               __entry->orig_lblk      = orig_map->m_lblk;
+               __entry->orig_flags     = orig_map->m_flags;
+               __entry->donor_ino      = donor_inode->i_ino;
+               __entry->donor_lblk     = donor_lblk;
+               __entry->len            = orig_map->m_len;
+       ),
+
+       TP_printk("dev %d,%d origin ino %lu lblk %u flags %s donor ino %lu lblk %u len %u",
+                 MAJOR(__entry->dev), MINOR(__entry->dev),
+                 (unsigned long) __entry->orig_ino,  __entry->orig_lblk,
+                 show_mflags(__entry->orig_flags),
+                 (unsigned long) __entry->donor_ino,  __entry->donor_lblk,
+                 __entry->len)
+);
+
+TRACE_EVENT(ext4_move_extent_exit,
+       TP_PROTO(struct inode *orig_inode, ext4_lblk_t orig_lblk,
+                struct inode *donor_inode, ext4_lblk_t donor_lblk,
+                unsigned int m_len, u64 move_len, int move_type, int ret),
+
+       TP_ARGS(orig_inode, orig_lblk, donor_inode, donor_lblk, m_len,
+               move_len, move_type, ret),
+
+       TP_STRUCT__entry(
+               __field(dev_t, dev)
+               __field(ino_t, orig_ino)
+               __field(ext4_lblk_t, orig_lblk)
+               __field(ino_t, donor_ino)
+               __field(ext4_lblk_t, donor_lblk)
+               __field(unsigned int, m_len)
+               __field(u64, move_len)
+               __field(int, move_type)
+               __field(int, ret)
+       ),
+
+       TP_fast_assign(
+               __entry->dev            = orig_inode->i_sb->s_dev;
+               __entry->orig_ino       = orig_inode->i_ino;
+               __entry->orig_lblk      = orig_lblk;
+               __entry->donor_ino      = donor_inode->i_ino;
+               __entry->donor_lblk     = donor_lblk;
+               __entry->m_len          = m_len;
+               __entry->move_len       = move_len;
+               __entry->move_type      = move_type;
+               __entry->ret            = ret;
+       ),
+
+       TP_printk("dev %d,%d origin ino %lu lblk %u donor ino %lu lblk %u m_len %u, move_len %llu type %d ret %d",
+                 MAJOR(__entry->dev), MINOR(__entry->dev),
+                 (unsigned long) __entry->orig_ino,  __entry->orig_lblk,
+                 (unsigned long) __entry->donor_ino,  __entry->donor_lblk,
+                 __entry->m_len, __entry->move_len, __entry->move_type,
+                 __entry->ret)
+);
+
 #endif /* _TRACE_EXT4_H */
 
 /* This part must be outside protection */