Btrfs: ensure deletion from pinned_chunks list is protected
The call to remove_extent_mapping() actually deletes the extent map from the list it's included in - fs_info->pinned_chunks - and that list is protected by the chunk mutex. Therefore make that call while holding the chunk mutex and remove the redundant list delete call because it's a noop. This fixes an overlook of the patch titled "Btrfs: fix race between fs trimming and block group remove/allocation" following the same obvervation from the patch titled "Btrfs: fix unprotected deletion from pending_chunks list". Signed-off-by: Filipe Manana <fdmanana@suse.com> Signed-off-by: Chris Mason <clm@fb.com>
This commit is contained in:
parent
9627aeee3e
commit
a1e7e16ed3
@ -3185,16 +3185,18 @@ out:
|
|||||||
|
|
||||||
spin_unlock(&block_group->lock);
|
spin_unlock(&block_group->lock);
|
||||||
|
|
||||||
|
lock_chunks(block_group->fs_info->chunk_root);
|
||||||
em_tree = &block_group->fs_info->mapping_tree.map_tree;
|
em_tree = &block_group->fs_info->mapping_tree.map_tree;
|
||||||
write_lock(&em_tree->lock);
|
write_lock(&em_tree->lock);
|
||||||
em = lookup_extent_mapping(em_tree, block_group->key.objectid,
|
em = lookup_extent_mapping(em_tree, block_group->key.objectid,
|
||||||
1);
|
1);
|
||||||
BUG_ON(!em); /* logic error, can't happen */
|
BUG_ON(!em); /* logic error, can't happen */
|
||||||
|
/*
|
||||||
|
* remove_extent_mapping() will delete us from the pinned_chunks
|
||||||
|
* list, which is protected by the chunk mutex.
|
||||||
|
*/
|
||||||
remove_extent_mapping(em_tree, em);
|
remove_extent_mapping(em_tree, em);
|
||||||
write_unlock(&em_tree->lock);
|
write_unlock(&em_tree->lock);
|
||||||
|
|
||||||
lock_chunks(block_group->fs_info->chunk_root);
|
|
||||||
list_del_init(&em->list);
|
|
||||||
unlock_chunks(block_group->fs_info->chunk_root);
|
unlock_chunks(block_group->fs_info->chunk_root);
|
||||||
|
|
||||||
/* once for us and once for the tree */
|
/* once for us and once for the tree */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user