]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
btrfs: tracepoints: add trace event for btrfs_log_all_parents()
authorFilipe Manana <fdmanana@suse.com>
Thu, 30 Apr 2026 16:10:01 +0000 (17:10 +0100)
committerDavid Sterba <dsterba@suse.com>
Mon, 8 Jun 2026 13:53:34 +0000 (15:53 +0200)
btrfs_log_all_parents() is an important step called during a fsync, as
well as during rename and link operations on inodes that were previously
logged. Add trace events for when entering and exiting that function.

Reviewed-by: Johannes Thumshirn <johannes.thumshirn@wdc.com>
Signed-off-by: Filipe Manana <fdmanana@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
fs/btrfs/tree-log.c
include/trace/events/btrfs.h

index 22066635f75f3863b463d69bacda4b4f20f89ad1..90f5d1c830e4a30cbd0fe12eab72a6f4fb8cb816 100644 (file)
@@ -7240,9 +7240,13 @@ static int btrfs_log_all_parents(struct btrfs_trans_handle *trans,
        struct btrfs_root *root = inode->root;
        const u64 ino = btrfs_ino(inode);
 
+       trace_btrfs_log_all_parents_enter(trans, inode);
+
        path = btrfs_alloc_path();
-       if (!path)
-               return -ENOMEM;
+       if (!path) {
+               ret = -ENOMEM;
+               goto out;
+       }
        path->skip_locking = true;
        path->search_commit_root = true;
 
@@ -7251,7 +7255,7 @@ static int btrfs_log_all_parents(struct btrfs_trans_handle *trans,
        key.offset = 0;
        ret = btrfs_search_slot(NULL, root, &key, path, 0, 0);
        if (ret < 0)
-               return ret;
+               goto out;
 
        while (true) {
                struct extent_buffer *leaf = path->nodes[0];
@@ -7263,9 +7267,11 @@ static int btrfs_log_all_parents(struct btrfs_trans_handle *trans,
                if (slot >= btrfs_header_nritems(leaf)) {
                        ret = btrfs_next_leaf(root, path);
                        if (ret < 0)
-                               return ret;
-                       if (ret > 0)
+                               goto out;
+                       if (ret > 0) {
+                               ret = 0;
                                break;
+                       }
                        continue;
                }
 
@@ -7318,8 +7324,10 @@ static int btrfs_log_all_parents(struct btrfs_trans_handle *trans,
                         * at both parents and the old parent B would still
                         * exist.
                         */
-                       if (IS_ERR(dir_inode))
-                               return PTR_ERR(dir_inode);
+                       if (IS_ERR(dir_inode)) {
+                               ret = PTR_ERR(dir_inode);
+                               goto out;
+                       }
 
                        if (!need_log_inode(trans, dir_inode)) {
                                btrfs_add_delayed_iput(dir_inode);
@@ -7332,11 +7340,14 @@ static int btrfs_log_all_parents(struct btrfs_trans_handle *trans,
                                ret = log_new_dir_dentries(trans, dir_inode, ctx);
                        btrfs_add_delayed_iput(dir_inode);
                        if (ret)
-                               return ret;
+                               goto out;
                }
                path->slots[0]++;
        }
-       return 0;
+out:
+       trace_btrfs_log_all_parents_exit(trans, inode, ret);
+
+       return ret;
 }
 
 static int log_new_ancestors(struct btrfs_trans_handle *trans,
index 9f195d0d5378a5a382e106ddb24a8c853e625e0b..2c145240d80979f128954f01b10102af82727637 100644 (file)
@@ -1067,6 +1067,59 @@ TRACE_EVENT(btrfs_log_inode_exit,
                        __entry->last_log_commit, __entry->ret)
 );
 
+TRACE_EVENT(btrfs_log_all_parents_enter,
+
+       TP_PROTO(const struct btrfs_trans_handle *trans,
+                const struct btrfs_inode *inode),
+
+       TP_ARGS(trans, inode),
+
+       TP_STRUCT__entry_btrfs(
+               __field(        u64,            root_objectid           )
+               __field(        u64,            ino                     )
+               __field(        u64,            transid                 )
+       ),
+
+       TP_fast_assign(
+               TP_fast_assign_fsid(inode->root->fs_info);
+               __entry->root_objectid          = btrfs_root_id(inode->root);
+               __entry->ino                    = btrfs_ino(inode);
+               __entry->transid                = trans->transid;
+       ),
+
+       TP_printk_btrfs("root=%llu(%s) ino=%llu transid=%llu",
+                       show_root_type(__entry->root_objectid), __entry->ino,
+                       __entry->transid)
+);
+
+TRACE_EVENT(btrfs_log_all_parents_exit,
+
+       TP_PROTO(const struct btrfs_trans_handle *trans,
+                const struct btrfs_inode *inode,
+                int ret),
+
+       TP_ARGS(trans, inode, ret),
+
+       TP_STRUCT__entry_btrfs(
+               __field(        u64,            root_objectid           )
+               __field(        u64,            ino                     )
+               __field(        u64,            transid                 )
+               __field(        int,            ret                     )
+       ),
+
+       TP_fast_assign(
+               TP_fast_assign_fsid(inode->root->fs_info);
+               __entry->root_objectid          = btrfs_root_id(inode->root);
+               __entry->ino                    = btrfs_ino(inode);
+               __entry->transid                = trans->transid;
+               __entry->ret                    = ret;
+       ),
+
+       TP_printk_btrfs("root=%llu(%s) ino=%llu transid=%llu ret=%d",
+                       show_root_type(__entry->root_objectid), __entry->ino,
+                       __entry->transid, __entry->ret)
+);
+
 TRACE_EVENT(btrfs_sync_fs,
 
        TP_PROTO(const struct btrfs_fs_info *fs_info, int wait),