• Filipe Manana's avatar
    btrfs: remove objectid from struct btrfs_inode on 64 bits platforms · 7a7bc214
    Filipe Manana authored
    On 64 bits platforms we don't really need to have a dedicated member (the
    objectid field) for the inode's number since we store in the VFS inode's
    i_ino member, which is an unsigned long and this type is 64 bits wide on
    64 bits platforms. We only need that field in case we are on a 32 bits
    platform because the unsigned long type is 32 bits wide on such platforms
    See commit 33345d01 ("Btrfs: Always use 64bit inode number") regarding
    this 64/32 bits detail.
    
    The objectid field of struct btrfs_inode is also used to store the ID of
    a root for directories that are stubs for unreferenced roots. In such
    cases the inode is a directory and has the BTRFS_INODE_ROOT_STUB runtime
    flag set.
    
    So in order to reduce the size of btrfs_inode structure on 64 bits
    platforms we can remove the objectid member and use the VFS inode's i_ino
    member instead whenever we need to get the inode number. In case the inode
    is a root stub (BTRFS_INODE_ROOT_STUB set) we can use the member
    last_reflink_trans to store the ID of the unreferenced root, since such
    inode is a directory and reflinks can't be done against directories.
    
    So remove the objectid fields for 64 bits platforms and alias the
    last_reflink_trans field with a name of ref_root_id in a union.
    On a release kernel config, this reduces the size of struct btrfs_inode
    from 1040 bytes down to 1032 bytes.
    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>
    7a7bc214
export.c 7.69 KB