• Filipe Manana's avatar
    btrfs: add optimized btrfs_ino() version for 64 bits systems · cf2404a9
    Filipe Manana authored
    Currently btrfs_ino() tries to use first the objectid of the inode's
    location key. This is to avoid truncation of the inode number on 32 bits
    platforms because the i_ino field of struct inode has the unsigned long
    type, while the objectid is a 64 bits unsigned type (u64) on every system.
    This logic was added in commit 33345d01 ("Btrfs: Always use 64bit
    inode number").
    
    However if we are running on a 64 bits system, we can always directly
    return the i_ino value from struct inode, which eliminates the need for
    he special if statement that tests for a location key type of
    BTRFS_ROOT_ITEM_KEY - in which case i_ino may not have the same value as
    the objectid in the inode's location objectid, it may have a value of
    BTRFS_EMPTY_SUBVOL_DIR_OBJECTID, for the case of snapshots of trees with
    subvolumes/snapshots inside them.
    
    So add a special version for 64 bits system that directly returns i_ino
    of struct inode. This eliminates one branch and reduces the overall code
    size, since btrfs_ino() is an inline function that is extensively used.
    
    Before:
    
    $ size fs/btrfs/btrfs.ko
       text	   data	    bss	    dec	    hex	filename
    1617487	 189240	  29032	1835759	 1c02ef	fs/btrfs/btrfs.ko
    
    After:
    
    $ size fs/btrfs/btrfs.ko
       text	   data	    bss	    dec	    hex	filename
    1612028	 189180	  29032	1830240	 1bed60	fs/btrfs/btrfs.ko
    Signed-off-by: default avatarFilipe Manana <fdmanana@suse.com>
    Reviewed-by: default avatarDavid Sterba <dsterba@suse.com>
    Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
    cf2404a9
btrfs-tests.c 7.23 KB