btrfs: set the objectid of the btree inode's location key
authorFilipe Manana <fdmanana@suse.com>
Mon, 11 Jul 2022 14:22:49 +0000 (15:22 +0100)
committerDavid Sterba <dsterba@suse.com>
Mon, 25 Jul 2022 15:45:41 +0000 (17:45 +0200)
We currently don't use the location key of the btree inode, its content
is set to zeroes, as it's a special inode that is not persisted (it has
no inode item stored in any btree).

At btrfs_ino(), an inline function used extensively in btrfs, we have
this special check if the given inode's location objectid is 0, and if it
is, we return the value stored in the VFS' inode i_ino field instead
(which is BTRFS_BTREE_INODE_OBJECTID for the btree inode).

To reduce the code at btrfs_ino(), we can simply set the objectid of the
btree inode to the value BTRFS_BTREE_INODE_OBJECTID. This eliminates the
need to check for the special case of the objectid being zero, with the
side effect of reducing the overall code size and having less code to
execute, as btrfs_ino() is an inline function.

Before:

$ size fs/btrfs/btrfs.ko
   text    data     bss     dec     hex filename
1620502  189240   29032 1838774  1c0eb6 fs/btrfs/btrfs.ko

After:

$ size fs/btrfs/btrfs.ko
   text    data     bss     dec     hex filename
1617487  189240   29032 1835759  1c02ef fs/btrfs/btrfs.ko

Reviewed-by: Nikolay Borisov <nborisov@suse.com>
Signed-off-by: Filipe Manana <fdmanana@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
fs/btrfs/btrfs_inode.h
fs/btrfs/disk-io.c

index b467264bd1bbd4b7282674bc51ee3bd48548e79b..a18f90ff16f12c5f5f34bdfb4c9905700393be2f 100644 (file)
@@ -283,11 +283,8 @@ static inline u64 btrfs_ino(const struct btrfs_inode *inode)
 {
        u64 ino = inode->location.objectid;
 
-       /*
-        * !ino: btree_inode
-        * type == BTRFS_ROOT_ITEM_KEY: subvol dir
-        */
-       if (!ino || inode->location.type == BTRFS_ROOT_ITEM_KEY)
+       /* type == BTRFS_ROOT_ITEM_KEY: subvol dir */
+       if (inode->location.type == BTRFS_ROOT_ITEM_KEY)
                ino = inode->vfs_inode.i_ino;
        return ino;
 }
index bcb6807ce19e86443c9f4abf3d47d24214a24758..494e55ed3709919401044b17cebe55047a078dfb 100644 (file)
@@ -2327,7 +2327,9 @@ static void btrfs_init_btree_inode(struct btrfs_fs_info *fs_info)
        extent_map_tree_init(&BTRFS_I(inode)->extent_tree);
 
        BTRFS_I(inode)->root = btrfs_grab_root(fs_info->tree_root);
-       memset(&BTRFS_I(inode)->location, 0, sizeof(struct btrfs_key));
+       BTRFS_I(inode)->location.objectid = BTRFS_BTREE_INODE_OBJECTID;
+       BTRFS_I(inode)->location.type = 0;
+       BTRFS_I(inode)->location.offset = 0;
        set_bit(BTRFS_INODE_DUMMY, &BTRFS_I(inode)->runtime_flags);
        btrfs_insert_inode_hash(inode);
 }