mirror of
https://github.com/kdave/btrfs-progs
synced 2024-12-30 18:22:14 +00:00
btrfs-progs: extent-tree: Introduce functions to free dev extents in a chunk
Introduce two functions, free_dev_extent_item and free_chunk_dev_extent_items, to free dev extent items in a chunk. Signed-off-by: Qu Wenruo <quwenruo@cn.fujitsu.com> Signed-off-by: David Sterba <dsterba@suse.com>
This commit is contained in:
parent
9d25a273b0
commit
5bdee4862d
@ -3483,6 +3483,79 @@ out:
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int free_dev_extent_item(struct btrfs_trans_handle *trans,
|
||||||
|
struct btrfs_fs_info *fs_info,
|
||||||
|
u64 devid, u64 dev_offset)
|
||||||
|
{
|
||||||
|
struct btrfs_root *root = fs_info->dev_root;
|
||||||
|
struct btrfs_path *path;
|
||||||
|
struct btrfs_key key;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
path = btrfs_alloc_path();
|
||||||
|
if (!path)
|
||||||
|
return -ENOMEM;
|
||||||
|
|
||||||
|
key.objectid = devid;
|
||||||
|
key.type = BTRFS_DEV_EXTENT_KEY;
|
||||||
|
key.offset = dev_offset;
|
||||||
|
|
||||||
|
ret = btrfs_search_slot(trans, root, &key, path, -1, 1);
|
||||||
|
if (ret < 0)
|
||||||
|
goto out;
|
||||||
|
if (ret > 0) {
|
||||||
|
ret = -ENOENT;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = btrfs_del_item(trans, root, path);
|
||||||
|
out:
|
||||||
|
btrfs_free_path(path);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int free_chunk_dev_extent_items(struct btrfs_trans_handle *trans,
|
||||||
|
struct btrfs_fs_info *fs_info,
|
||||||
|
u64 chunk_offset)
|
||||||
|
{
|
||||||
|
struct btrfs_chunk *chunk = NULL;
|
||||||
|
struct btrfs_root *root= fs_info->chunk_root;
|
||||||
|
struct btrfs_path *path;
|
||||||
|
struct btrfs_key key;
|
||||||
|
u16 num_stripes;
|
||||||
|
int i;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
path = btrfs_alloc_path();
|
||||||
|
if (!path)
|
||||||
|
return -ENOMEM;
|
||||||
|
|
||||||
|
key.objectid = BTRFS_FIRST_CHUNK_TREE_OBJECTID;
|
||||||
|
key.type = BTRFS_CHUNK_ITEM_KEY;
|
||||||
|
key.offset = chunk_offset;
|
||||||
|
|
||||||
|
ret = btrfs_search_slot(trans, root, &key, path, 0, 0);
|
||||||
|
if (ret < 0)
|
||||||
|
goto out;
|
||||||
|
if (ret > 0) {
|
||||||
|
ret = -ENOENT;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
chunk = btrfs_item_ptr(path->nodes[0], path->slots[0],
|
||||||
|
struct btrfs_chunk);
|
||||||
|
num_stripes = btrfs_chunk_num_stripes(path->nodes[0], chunk);
|
||||||
|
for (i = 0; i < num_stripes; i++) {
|
||||||
|
ret = free_dev_extent_item(trans, fs_info,
|
||||||
|
btrfs_stripe_devid_nr(path->nodes[0], chunk, i),
|
||||||
|
btrfs_stripe_offset_nr(path->nodes[0], chunk, i));
|
||||||
|
if (ret < 0)
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
out:
|
||||||
|
btrfs_free_path(path);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Fixup block accounting. The initial block accounting created by
|
* Fixup block accounting. The initial block accounting created by
|
||||||
* make_block_groups isn't accuracy in this case.
|
* make_block_groups isn't accuracy in this case.
|
||||||
|
Loading…
Reference in New Issue
Block a user