• Michal Rostecki's avatar
    btrfs: let callers of btrfs_get_io_geometry pass the em · 42034313
    Michal Rostecki authored
    Before this change, the btrfs_get_io_geometry() function was calling
    btrfs_get_chunk_map() to get the extent mapping, necessary for
    calculating the I/O geometry. It was using that extent mapping only
    internally and freeing the pointer after its execution.
    
    That resulted in calling btrfs_get_chunk_map() de facto twice by the
    __btrfs_map_block() function. It was calling btrfs_get_io_geometry()
    first and then calling btrfs_get_chunk_map() directly to get the extent
    mapping, used by the rest of the function.
    
    Change that to passing the extent mapping to the btrfs_get_io_geometry()
    function as an argument.
    
    This could improve performance in some cases.  For very large
    filesystems, i.e. several thousands of allocated chunks, not only this
    avoids searching two times the rbtree, saving time, it may also help
    reducing contention on the lock that protects the tree - thinking of
    writeback starting for multiple inodes, other tasks allocating or
    removing chunks, and anything else that requires access to the rbtree.
    Reviewed-by: default avatarFilipe Manana <fdmanana@suse.com>
    Signed-off-by: default avatarMichal Rostecki <mrostecki@suse.com>
    Reviewed-by: default avatarDavid Sterba <dsterba@suse.com>
    [ add Filipe's analysis ]
    Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
    42034313
inode.c 289 KB