Revert "btrfs: let btrfs_delete_unused_bgs() to clean relocated bgs"
This reverts commit 5d8eb6fe51
.
When we remove devices, we free the device structures. Delaying
btfs_remove_chunk() ends up hitting a use-after-free on them.
Signed-off-by: Chris Mason <clm@fb.com>
This commit is contained in:
parent
196e02490c
commit
19c4d2f994
2 changed files with 16 additions and 12 deletions
|
@ -10849,7 +10849,7 @@ void btrfs_delete_unused_bgs(struct btrfs_fs_info *fs_info)
|
|||
spin_lock(&block_group->lock);
|
||||
if (block_group->reserved ||
|
||||
btrfs_block_group_used(&block_group->item) ||
|
||||
(block_group->ro && !block_group->removed) ||
|
||||
block_group->ro ||
|
||||
list_is_singular(&block_group->list)) {
|
||||
/*
|
||||
* We want to bail if we made new allocations or have
|
||||
|
|
|
@ -2906,8 +2906,8 @@ int btrfs_remove_chunk(struct btrfs_trans_handle *trans,
|
|||
static int btrfs_relocate_chunk(struct btrfs_root *root, u64 chunk_offset)
|
||||
{
|
||||
struct btrfs_root *extent_root;
|
||||
struct btrfs_trans_handle *trans;
|
||||
int ret;
|
||||
struct btrfs_block_group_cache *block_group;
|
||||
|
||||
root = root->fs_info->chunk_root;
|
||||
extent_root = root->fs_info->extent_root;
|
||||
|
@ -2937,17 +2937,21 @@ static int btrfs_relocate_chunk(struct btrfs_root *root, u64 chunk_offset)
|
|||
if (ret)
|
||||
return ret;
|
||||
|
||||
/*
|
||||
* step two, flag the chunk as removed and let
|
||||
* btrfs_delete_unused_bgs() remove it.
|
||||
*/
|
||||
block_group = btrfs_lookup_block_group(root->fs_info, chunk_offset);
|
||||
spin_lock(&block_group->lock);
|
||||
block_group->removed = 1;
|
||||
spin_unlock(&block_group->lock);
|
||||
btrfs_put_block_group(block_group);
|
||||
trans = btrfs_start_trans_remove_block_group(root->fs_info,
|
||||
chunk_offset);
|
||||
if (IS_ERR(trans)) {
|
||||
ret = PTR_ERR(trans);
|
||||
btrfs_handle_fs_error(root->fs_info, ret, NULL);
|
||||
return ret;
|
||||
}
|
||||
|
||||
return 0;
|
||||
/*
|
||||
* step two, delete the device extents and the
|
||||
* chunk tree entries
|
||||
*/
|
||||
ret = btrfs_remove_chunk(trans, root, chunk_offset);
|
||||
btrfs_end_transaction(trans, extent_root);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int btrfs_relocate_sys_chunks(struct btrfs_root *root)
|
||||
|
|
Loading…
Add table
Reference in a new issue