Btrfs: add file item tracepoints
authorLiu Bo <bo.li.liu@oracle.com>
Fri, 10 Mar 2017 19:09:48 +0000 (11:09 -0800)
committerDavid Sterba <dsterba@suse.com>
Tue, 18 Apr 2017 12:07:24 +0000 (14:07 +0200)
While debugging truncate problems, I found that these tracepoints could
help us quickly know what went wrong.

Two sets of tracepoints are created to track regular/prealloc file item
and inline file item respectively, I put inline as a separate one since
what inline file items cares about are way less than the regular one.

This adds four tracepoints:
- btrfs_get_extent_show_fi_regular
- btrfs_get_extent_show_fi_inline
- btrfs_truncate_show_fi_regular
- btrfs_truncate_show_fi_inline

Cc: David Sterba <dsterba@suse.cz>
Signed-off-by: Liu Bo <bo.li.liu@oracle.com>
Reviewed-by: David Sterba <dsterba@suse.com>
[ formatting adjustments ]
Signed-off-by: David Sterba <dsterba@suse.com>
fs/btrfs/inode.c
include/trace/events/btrfs.h

index 568b28114f0982eff2d95a0db14dc266384109b4..da71119b5b7c46b13646b7854111a5eb7f5e949b 100644 (file)
@@ -4401,9 +4401,17 @@ search_again:
                        if (extent_type != BTRFS_FILE_EXTENT_INLINE) {
                                item_end +=
                                    btrfs_file_extent_num_bytes(leaf, fi);
+
+                               trace_btrfs_truncate_show_fi_regular(
+                                       BTRFS_I(inode), leaf, fi,
+                                       found_key.offset);
                        } else if (extent_type == BTRFS_FILE_EXTENT_INLINE) {
                                item_end += btrfs_file_extent_inline_len(leaf,
                                                         path->slots[0], fi);
+
+                               trace_btrfs_truncate_show_fi_inline(
+                                       BTRFS_I(inode), leaf, fi, path->slots[0],
+                                       found_key.offset);
                        }
                        item_end--;
                }
@@ -6828,11 +6836,18 @@ again:
            found_type == BTRFS_FILE_EXTENT_PREALLOC) {
                extent_end = extent_start +
                       btrfs_file_extent_num_bytes(leaf, item);
+
+               trace_btrfs_get_extent_show_fi_regular(inode, leaf, item,
+                                                      extent_start);
        } else if (found_type == BTRFS_FILE_EXTENT_INLINE) {
                size_t size;
                size = btrfs_file_extent_inline_len(leaf, path->slots[0], item);
                extent_end = ALIGN(extent_start + size,
                                   fs_info->sectorsize);
+
+               trace_btrfs_get_extent_show_fi_inline(inode, leaf, item,
+                                                     path->slots[0],
+                                                     extent_start);
        }
 next:
        if (start >= extent_end) {
index 8f206263fee7aae7fab344d95eaed29bf8411f18..cef39e2baf2161c34be1b41afbaadf24601018d4 100644 (file)
@@ -12,6 +12,7 @@ struct btrfs_root;
 struct btrfs_fs_info;
 struct btrfs_inode;
 struct extent_map;
+struct btrfs_file_extent_item;
 struct btrfs_ordered_extent;
 struct btrfs_delayed_ref_node;
 struct btrfs_delayed_tree_ref;
@@ -54,6 +55,12 @@ struct btrfs_qgroup_extent_record;
              (obj >= BTRFS_ROOT_TREE_OBJECTID &&                       \
               obj <= BTRFS_QUOTA_TREE_OBJECTID)) ? __show_root_type(obj) : "-"
 
+#define show_fi_type(type)                                             \
+       __print_symbolic(type,                                          \
+                { BTRFS_FILE_EXTENT_INLINE,    "INLINE" },             \
+                { BTRFS_FILE_EXTENT_REG,       "REG"    },             \
+                { BTRFS_FILE_EXTENT_PREALLOC,  "PREALLOC"})
+
 #define BTRFS_GROUP_FLAGS      \
        { BTRFS_BLOCK_GROUP_DATA,       "DATA"},        \
        { BTRFS_BLOCK_GROUP_SYSTEM,     "SYSTEM"},      \
@@ -232,6 +239,138 @@ TRACE_EVENT_CONDITION(btrfs_get_extent,
                  __entry->refs, __entry->compress_type)
 );
 
+/* file extent item */
+DECLARE_EVENT_CLASS(btrfs__file_extent_item_regular,
+
+       TP_PROTO(struct btrfs_inode *bi, struct extent_buffer *l,
+                struct btrfs_file_extent_item *fi, u64 start),
+
+       TP_ARGS(bi, l, fi, start),
+
+       TP_STRUCT__entry_btrfs(
+               __field(        u64,    root_obj        )
+               __field(        u64,    ino             )
+               __field(        loff_t, isize           )
+               __field(        u64,    disk_isize      )
+               __field(        u64,    num_bytes       )
+               __field(        u64,    ram_bytes       )
+               __field(        u64,    disk_bytenr     )
+               __field(        u64,    disk_num_bytes  )
+               __field(        u64,    extent_offset   )
+               __field(        u8,     extent_type     )
+               __field(        u8,     compression     )
+               __field(        u64,    extent_start    )
+               __field(        u64,    extent_end      )
+       ),
+
+       TP_fast_assign_btrfs(bi->root->fs_info,
+               __entry->root_obj       = bi->root->objectid;
+               __entry->ino            = btrfs_ino(bi);
+               __entry->isize          = bi->vfs_inode.i_size;
+               __entry->disk_isize     = bi->disk_i_size;
+               __entry->num_bytes      = btrfs_file_extent_num_bytes(l, fi);
+               __entry->ram_bytes      = btrfs_file_extent_ram_bytes(l, fi);
+               __entry->disk_bytenr    = btrfs_file_extent_disk_bytenr(l, fi);
+               __entry->disk_num_bytes = btrfs_file_extent_disk_num_bytes(l, fi);
+               __entry->extent_offset  = btrfs_file_extent_offset(l, fi);
+               __entry->extent_type    = btrfs_file_extent_type(l, fi);
+               __entry->compression    = btrfs_file_extent_compression(l, fi);
+               __entry->extent_start   = start;
+               __entry->extent_end     = (start + __entry->num_bytes);
+       ),
+
+       TP_printk_btrfs(
+               "root=%llu(%s) inode=%llu size=%llu disk_isize=%llu "
+               "file extent range=[%llu %llu] "
+               "(num_bytes=%llu ram_bytes=%llu disk_bytenr=%llu "
+               "disk_num_bytes=%llu extent_offset=%llu type=%s "
+               "compression=%u",
+               show_root_type(__entry->root_obj), __entry->ino,
+               __entry->isize,
+               __entry->disk_isize, __entry->extent_start,
+               __entry->extent_end, __entry->num_bytes, __entry->ram_bytes,
+               __entry->disk_bytenr, __entry->disk_num_bytes,
+               __entry->extent_offset, show_fi_type(__entry->extent_type),
+               __entry->compression)
+);
+
+DECLARE_EVENT_CLASS(
+       btrfs__file_extent_item_inline,
+
+       TP_PROTO(struct btrfs_inode *bi, struct extent_buffer *l,
+                struct btrfs_file_extent_item *fi, int slot, u64 start),
+
+       TP_ARGS(bi, l, fi, slot,  start),
+
+       TP_STRUCT__entry_btrfs(
+               __field(        u64,    root_obj        )
+               __field(        u64,    ino             )
+               __field(        loff_t, isize           )
+               __field(        u64,    disk_isize      )
+               __field(        u8,     extent_type     )
+               __field(        u8,     compression     )
+               __field(        u64,    extent_start    )
+               __field(        u64,    extent_end      )
+       ),
+
+       TP_fast_assign_btrfs(
+               bi->root->fs_info,
+               __entry->root_obj       = bi->root->objectid;
+               __entry->ino            = btrfs_ino(bi);
+               __entry->isize          = bi->vfs_inode.i_size;
+               __entry->disk_isize     = bi->disk_i_size;
+               __entry->extent_type    = btrfs_file_extent_type(l, fi);
+               __entry->compression    = btrfs_file_extent_compression(l, fi);
+               __entry->extent_start   = start;
+               __entry->extent_end     = (start + btrfs_file_extent_inline_len(l, slot, fi));
+       ),
+
+       TP_printk_btrfs(
+               "root=%llu(%s) inode=%llu size=%llu disk_isize=%llu "
+               "file extent range=[%llu %llu] "
+               "extent_type=%s compression=%u",
+               show_root_type(__entry->root_obj), __entry->ino, __entry->isize,
+               __entry->disk_isize, __entry->extent_start,
+               __entry->extent_end, show_fi_type(__entry->extent_type),
+               __entry->compression)
+);
+
+DEFINE_EVENT(
+       btrfs__file_extent_item_regular, btrfs_get_extent_show_fi_regular,
+
+       TP_PROTO(struct btrfs_inode *bi, struct extent_buffer *l,
+                struct btrfs_file_extent_item *fi, u64 start),
+
+       TP_ARGS(bi, l, fi, start)
+);
+
+DEFINE_EVENT(
+       btrfs__file_extent_item_regular, btrfs_truncate_show_fi_regular,
+
+       TP_PROTO(struct btrfs_inode *bi, struct extent_buffer *l,
+                struct btrfs_file_extent_item *fi, u64 start),
+
+       TP_ARGS(bi, l, fi, start)
+);
+
+DEFINE_EVENT(
+       btrfs__file_extent_item_inline, btrfs_get_extent_show_fi_inline,
+
+       TP_PROTO(struct btrfs_inode *bi, struct extent_buffer *l,
+                struct btrfs_file_extent_item *fi, int slot, u64 start),
+
+       TP_ARGS(bi, l, fi, slot, start)
+);
+
+DEFINE_EVENT(
+       btrfs__file_extent_item_inline, btrfs_truncate_show_fi_inline,
+
+       TP_PROTO(struct btrfs_inode *bi, struct extent_buffer *l,
+                struct btrfs_file_extent_item *fi, int slot, u64 start),
+
+       TP_ARGS(bi, l, fi, slot, start)
+);
+
 #define show_ordered_flags(flags)                                         \
        __print_flags(flags, "|",                                          \
                { (1 << BTRFS_ORDERED_IO_DONE),         "IO_DONE"       }, \