]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
btrfs: tracepoints: add trace event for btrfs_log_inode_parent()
authorFilipe Manana <fdmanana@suse.com>
Tue, 28 Apr 2026 15:52:09 +0000 (16:52 +0100)
committerDavid Sterba <dsterba@suse.com>
Mon, 8 Jun 2026 13:53:34 +0000 (15:53 +0200)
btrfs_log_inode_parent() is one of the most important steps called during
a fsync operation 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 9123adafa0d198700cb8a62e8f3cf8bdaef4a9bd..f03bc658821059c9117bf410662e19f33ff17742 100644 (file)
@@ -7541,27 +7541,37 @@ static int btrfs_log_inode_parent(struct btrfs_trans_handle *trans,
        int ret = 0;
        bool log_dentries;
 
-       if (btrfs_test_opt(fs_info, NOTREELOG))
-               return BTRFS_LOG_FORCE_COMMIT;
+       trace_btrfs_log_inode_parent_enter(trans, inode);
 
-       if (btrfs_root_refs(&root->root_item) == 0)
-               return BTRFS_LOG_FORCE_COMMIT;
+       if (btrfs_test_opt(fs_info, NOTREELOG)) {
+               ret = BTRFS_LOG_FORCE_COMMIT;
+               goto out;
+       }
+
+       if (btrfs_root_refs(&root->root_item) == 0) {
+               ret = BTRFS_LOG_FORCE_COMMIT;
+               goto out;
+       }
 
        /*
         * If we're logging an inode from a subvolume created in the current
         * transaction we must force a commit since the root is not persisted.
         */
-       if (btrfs_root_generation(&root->root_item) == trans->transid)
-               return BTRFS_LOG_FORCE_COMMIT;
+       if (btrfs_root_generation(&root->root_item) == trans->transid) {
+               ret = BTRFS_LOG_FORCE_COMMIT;
+               goto out;
+       }
 
        /* Skip already logged inodes and without new extents. */
        if (btrfs_inode_in_log(inode, trans->transid) &&
-           list_empty(&ctx->ordered_extents))
-               return BTRFS_NO_LOG_SYNC;
+           list_empty(&ctx->ordered_extents)) {
+               ret = BTRFS_NO_LOG_SYNC;
+               goto out;
+       }
 
        ret = start_log_trans(trans, root, ctx);
        if (ret)
-               return ret;
+               goto out;
 
        ret = btrfs_log_inode(trans, inode, inode_only, ctx);
        if (ret)
@@ -7649,6 +7659,9 @@ end_trans:
                btrfs_remove_log_ctx(root, ctx);
        btrfs_end_log_trans(root);
 
+out:
+       trace_btrfs_log_inode_parent_exit(trans, inode, ret);
+
        return ret;
 }
 
index 1b19364eabff7f703638ccb459a3da0a09c2421a..cd127c79a535268eec4cd15217c2397f6b3785df 100644 (file)
@@ -34,6 +34,16 @@ struct find_free_extent_ctl;
 struct btrfs_trans_handle;
 struct btrfs_transaction;
 
+#define show_inode_type(mode)                                  \
+       __print_symbolic((mode) & S_IFMT,                       \
+                { S_IFDIR,  "DIR" },                           \
+                { S_IFREG,  "REG" },                           \
+                { S_IFLNK,  "LNK" },                           \
+                { S_IFIFO,  "FIFO" },                          \
+                { S_IFCHR,  "CHR" },                           \
+                { S_IFBLK,  "BLK" },                           \
+                { S_IFSOCK, "SOCK" })
+
 #define show_ref_type(type)                                            \
        __print_symbolic(type,                                          \
                { BTRFS_TREE_BLOCK_REF_KEY,     "TREE_BLOCK_REF" },     \
@@ -866,6 +876,81 @@ TRACE_EVENT(btrfs_sync_file_exit,
                        __entry->ino, __entry->ret)
 );
 
+TRACE_EVENT(btrfs_log_inode_parent_enter,
+
+       TP_PROTO(const struct btrfs_trans_handle *trans, struct btrfs_inode *inode),
+
+       TP_ARGS(trans, inode),
+
+       TP_STRUCT__entry_btrfs(
+               __field(        u64,            root_objectid           )
+               __field(        u64,            ino                     )
+               __field(        umode_t,        mode                    )
+               __field(        u64,            transid                 )
+               __field(        u64,            generation              )
+               __field(        u64,            logged_trans            )
+               __field(        u64,            last_unlink_trans       )
+               __field(        int,            last_sub_trans          )
+               __field(        int,            inode_last_log_commit   )
+               __field(        int,            root_last_log_commit    )
+       ),
+
+       TP_fast_assign(
+               struct btrfs_root *root = inode->root;
+
+               TP_fast_assign_fsid(root->fs_info);
+               __entry->root_objectid          = btrfs_root_id(root);
+               __entry->ino                    = btrfs_ino(inode);
+               __entry->mode                   = inode->vfs_inode.i_mode;
+               __entry->transid                = trans->transid;
+               __entry->generation             = inode->generation;
+               spin_lock(&inode->lock);
+               __entry->logged_trans           = inode->logged_trans;
+               __entry->last_unlink_trans      = inode->last_unlink_trans;
+               __entry->last_sub_trans         = inode->last_sub_trans;
+               __entry->inode_last_log_commit  = inode->last_log_commit;
+               spin_unlock(&inode->lock);
+               __entry->root_last_log_commit   = btrfs_get_root_last_log_commit(root);
+       ),
+
+       TP_printk_btrfs("root=%llu(%s) ino=%llu type=%s transid=%llu gen=%llu"
+                       " logged_trans=%llu last_unlink_trans=%llu last_sub_trans=%d"
+                       " inode_last_log_commit=%d root_last_log_commit=%d",
+                       show_root_type(__entry->root_objectid), __entry->ino,
+                       show_inode_type(__entry->mode), __entry->transid,
+                       __entry->generation, __entry->logged_trans,
+                       __entry->last_unlink_trans, __entry->last_sub_trans,
+                       __entry->inode_last_log_commit, __entry->root_last_log_commit)
+);
+
+TRACE_EVENT(btrfs_log_inode_parent_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),