btrfs-progs: extent-tree: Introduce free_block_group_item function

This function is used to free a block group item.  It must be called
with all the space in the block group pinned.  Or there is a possibility
that tree blocks be allocated into the range.

The function is used for later block group/chunk free function.

Signed-off-by: Qu Wenruo <quwenruo@cn.fujitsu.com>
Signed-off-by: David Sterba <dsterba@suse.com>
master
Qu Wenruo 2015-07-07 16:15:23 +08:00 committed by David Sterba
parent de70c9aed8
commit 9d25a273b0
1 changed files with 36 additions and 0 deletions

View File

@ -3447,6 +3447,42 @@ int btrfs_update_block_group(struct btrfs_trans_handle *trans,
alloc, mark_free);
}
/*
* Just remove a block group item in extent tree
* Caller should ensure the block group is empty and all space is pinned.
* Or new tree block/data may be allocated into it.
*/
static int free_block_group_item(struct btrfs_trans_handle *trans,
struct btrfs_fs_info *fs_info,
u64 bytenr, u64 len)
{
struct btrfs_path *path;
struct btrfs_key key;
struct btrfs_root *root = fs_info->extent_root;
int ret = 0;
key.objectid = bytenr;
key.offset = len;
key.type = BTRFS_BLOCK_GROUP_ITEM_KEY;
path = btrfs_alloc_path();
if (!path)
return -ENOMEM;
ret = btrfs_search_slot(trans, root, &key, path, -1, 1);
if (ret > 0) {
ret = -ENOENT;
goto out;
}
if (ret < 0)
goto out;
ret = btrfs_del_item(trans, root, path);
out:
btrfs_free_path(path);
return ret;
}
/*
* Fixup block accounting. The initial block accounting created by
* make_block_groups isn't accuracy in this case.