Skip to content

Commit eac901d

Browse files
fdmananakdave
authored andcommitted
btrfs: add and use helper to determine if using bitmaps in free space tree
When adding and removing free space to the free space tree, we need to lookup the respective block group's free info item in the free space tree, check its flags for the BTRFS_FREE_SPACE_USING_BITMAPS bit and then release the path. Move these steps into a helper function and use it in both sites. This will also help avoiding duplicate code in a subsequent change. Reviewed-by: Boris Burkov <boris@bur.io> Signed-off-by: Filipe Manana <fdmanana@suse.com> Reviewed-by: David Sterba <dsterba@suse.com> Signed-off-by: David Sterba <dsterba@suse.com>
1 parent 3c74920 commit eac901d

File tree

1 file changed

+26
-24
lines changed

1 file changed

+26
-24
lines changed

fs/btrfs/free-space-tree.c

Lines changed: 26 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -791,32 +791,40 @@ static int remove_free_space_extent(struct btrfs_trans_handle *trans,
791791
return update_free_space_extent_count(trans, block_group, path, new_extents);
792792
}
793793

794+
static int using_bitmaps(struct btrfs_block_group *bg, struct btrfs_path *path)
795+
{
796+
struct btrfs_free_space_info *info;
797+
u32 flags;
798+
799+
info = btrfs_search_free_space_info(NULL, bg, path, 0);
800+
if (IS_ERR(info))
801+
return PTR_ERR(info);
802+
flags = btrfs_free_space_flags(path->nodes[0], info);
803+
btrfs_release_path(path);
804+
805+
return (flags & BTRFS_FREE_SPACE_USING_BITMAPS) ? 1 : 0;
806+
}
807+
794808
EXPORT_FOR_TESTS
795809
int __btrfs_remove_from_free_space_tree(struct btrfs_trans_handle *trans,
796810
struct btrfs_block_group *block_group,
797811
struct btrfs_path *path, u64 start, u64 size)
798812
{
799-
struct btrfs_free_space_info *info;
800-
u32 flags;
801813
int ret;
802814

803815
ret = __add_block_group_free_space(trans, block_group, path);
804816
if (ret)
805817
return ret;
806818

807-
info = btrfs_search_free_space_info(NULL, block_group, path, 0);
808-
if (IS_ERR(info))
809-
return PTR_ERR(info);
810-
flags = btrfs_free_space_flags(path->nodes[0], info);
811-
btrfs_release_path(path);
819+
ret = using_bitmaps(block_group, path);
820+
if (ret < 0)
821+
return ret;
812822

813-
if (flags & BTRFS_FREE_SPACE_USING_BITMAPS) {
823+
if (ret)
814824
return modify_free_space_bitmap(trans, block_group, path,
815825
start, size, true);
816-
} else {
817-
return remove_free_space_extent(trans, block_group, path,
818-
start, size);
819-
}
826+
827+
return remove_free_space_extent(trans, block_group, path, start, size);
820828
}
821829

822830
int btrfs_remove_from_free_space_tree(struct btrfs_trans_handle *trans,
@@ -984,27 +992,21 @@ int __btrfs_add_to_free_space_tree(struct btrfs_trans_handle *trans,
984992
struct btrfs_block_group *block_group,
985993
struct btrfs_path *path, u64 start, u64 size)
986994
{
987-
struct btrfs_free_space_info *info;
988-
u32 flags;
989995
int ret;
990996

991997
ret = __add_block_group_free_space(trans, block_group, path);
992998
if (ret)
993999
return ret;
9941000

995-
info = btrfs_search_free_space_info(NULL, block_group, path, 0);
996-
if (IS_ERR(info))
997-
return PTR_ERR(info);
998-
flags = btrfs_free_space_flags(path->nodes[0], info);
999-
btrfs_release_path(path);
1001+
ret = using_bitmaps(block_group, path);
1002+
if (ret < 0)
1003+
return ret;
10001004

1001-
if (flags & BTRFS_FREE_SPACE_USING_BITMAPS) {
1005+
if (ret)
10021006
return modify_free_space_bitmap(trans, block_group, path,
10031007
start, size, false);
1004-
} else {
1005-
return add_free_space_extent(trans, block_group, path, start,
1006-
size);
1007-
}
1008+
1009+
return add_free_space_extent(trans, block_group, path, start, size);
10081010
}
10091011

10101012
int btrfs_add_to_free_space_tree(struct btrfs_trans_handle *trans,

0 commit comments

Comments
 (0)