]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
btrfs: print-tree: print information about inode extref items
authorFilipe Manana <fdmanana@suse.com>
Fri, 12 Sep 2025 16:25:12 +0000 (17:25 +0100)
committerDavid Sterba <dsterba@suse.com>
Tue, 23 Sep 2025 06:49:22 +0000 (08:49 +0200)
Currently we ignore inode extref items, we just print their key, item
offset in the leaf and their size, no information about their content
like the index number, parent inode, name length and name.

Improve on this by printing the index, parent and name length in the same
format as btrfs-progs. Note that we don't print the name, as that would
require some processing and escaping like we do in btrfs-progs, and that
could expose sensitive information for some users in case they share their
dmesg/syslog and it contains a leaf dump. So for now leave names out.

Reviewed-by: Qu Wenruo <wqu@suse.com>
Reviewed-by: Johannes Thumshirn <johannes.thumshirn@wdc.com>
Signed-off-by: Filipe Manana <fdmanana@suse.com>
Reviewed-by: David Sterba <dsterba@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
fs/btrfs/print-tree.c

index 7a7156257d593066f4e26874f21867c18cd67d0f..0a2a6e82a3bfc71ff8c473258ce816cb6d49781d 100644 (file)
@@ -297,6 +297,26 @@ static void print_inode_ref_item(const struct extent_buffer *eb, int i)
        }
 }
 
+static void print_inode_extref_item(const struct extent_buffer *eb, int i)
+{
+       const u32 size = btrfs_item_size(eb, i);
+       struct btrfs_inode_extref *extref;
+       u32 cur = 0;
+
+       extref = btrfs_item_ptr(eb, i, struct btrfs_inode_extref);
+       while (cur < size) {
+               const u64 index = btrfs_inode_extref_index(eb, extref);
+               const u32 name_len = btrfs_inode_extref_name_len(eb, extref);
+               const u64 parent = btrfs_inode_extref_parent(eb, extref);
+               const u32 len = sizeof(*extref) + name_len;
+
+               pr_info("\t\tindex %llu parent %llu name_len %u\n",
+                       index, parent, name_len);
+               extref = (struct btrfs_inode_extref *)((char *)extref + len);
+               cur += len;
+       }
+}
+
 void btrfs_print_leaf(const struct extent_buffer *l)
 {
        struct btrfs_fs_info *fs_info;
@@ -334,6 +354,9 @@ void btrfs_print_leaf(const struct extent_buffer *l)
                case BTRFS_INODE_REF_KEY:
                        print_inode_ref_item(l, i);
                        break;
+               case BTRFS_INODE_EXTREF_KEY:
+                       print_inode_extref_item(l, i);
+                       break;
                case BTRFS_DIR_ITEM_KEY:
                case BTRFS_DIR_INDEX_KEY:
                case BTRFS_XATTR_ITEM_KEY: