Message ID | 20200601181227.28585-1-fdmanana@kernel.org (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | None | expand |
On 1.06.20 г. 21:12 ч., fdmanana@kernel.org wrote: > From: Filipe Manana <fdmanana@suse.com> > > Initially when the 'removed' flag was added to a block group to avoid > races between block group removal and fitrim, by commit 04216820fe83d5 > ("Btrfs: fix race between fs trimming and block group remove/allocation"), > we had to lock the chunks mutex because we could be moving the block > group from its current list, the pending chunks list, into the pinned > chunks list, or we could just be adding it to the pinned chunks if it was > not in the pending chunks list. Both lists were protected by the chunk > mutex. > > However we no longer have those lists since commit 1c11b63eff2a67 > ("btrfs: replace pending/pinned chunks lists with io tree"), and locking > the chunk mutex is no longer necessary because of that. The same happens > at btrfs_unfreeze_block_group(), we lock the chunk mutex because the block > group's extent map could be part of the pinned chunks list and the call > to remove_extent_mapping() could be deleting it from that list, which > used to be protected by that mutex. > > So just remove those lock and unlock calls as they are not needed anymore. > > Signed-off-by: Filipe Manana <fdmanana@suse.com> The critical section really involves checking btrfs_block_group::frozen and btrfs_block_group::removed atomically which is ensured by holding btrfs_block_group::lock. And in the unfreeze function we only modify the mapping tree under the tree's write lock, so: Reviewed-by: Nikolay Borisov <nborisov@suse.com>
On Mon, Jun 01, 2020 at 07:12:27PM +0100, fdmanana@kernel.org wrote: > From: Filipe Manana <fdmanana@suse.com> > > Initially when the 'removed' flag was added to a block group to avoid > races between block group removal and fitrim, by commit 04216820fe83d5 > ("Btrfs: fix race between fs trimming and block group remove/allocation"), > we had to lock the chunks mutex because we could be moving the block > group from its current list, the pending chunks list, into the pinned > chunks list, or we could just be adding it to the pinned chunks if it was > not in the pending chunks list. Both lists were protected by the chunk > mutex. > > However we no longer have those lists since commit 1c11b63eff2a67 > ("btrfs: replace pending/pinned chunks lists with io tree"), and locking > the chunk mutex is no longer necessary because of that. The same happens > at btrfs_unfreeze_block_group(), we lock the chunk mutex because the block > group's extent map could be part of the pinned chunks list and the call > to remove_extent_mapping() could be deleting it from that list, which > used to be protected by that mutex. > > So just remove those lock and unlock calls as they are not needed anymore. > > Signed-off-by: Filipe Manana <fdmanana@suse.com> > --- > > V2: Rebased on 5.8 changes, since the previous patch had to be rebased too. 2 and 3 in misc next, thanks.
diff --git a/fs/btrfs/block-group.c b/fs/btrfs/block-group.c index be73055ee3a6..a10834b837a5 100644 --- a/fs/btrfs/block-group.c +++ b/fs/btrfs/block-group.c @@ -1111,7 +1111,6 @@ int btrfs_remove_block_group(struct btrfs_trans_handle *trans, if (ret < 0) goto out; - mutex_lock(&fs_info->chunk_mutex); spin_lock(&block_group->lock); block_group->removed = 1; /* @@ -1143,8 +1142,6 @@ int btrfs_remove_block_group(struct btrfs_trans_handle *trans, remove_em = (atomic_read(&block_group->frozen) == 0); spin_unlock(&block_group->lock); - mutex_unlock(&fs_info->chunk_mutex); - if (remove_em) { struct extent_map_tree *em_tree; @@ -3447,7 +3444,6 @@ void btrfs_unfreeze_block_group(struct btrfs_block_group *block_group) spin_unlock(&block_group->lock); if (cleanup) { - mutex_lock(&fs_info->chunk_mutex); em_tree = &fs_info->mapping_tree; write_lock(&em_tree->lock); em = lookup_extent_mapping(em_tree, block_group->start, @@ -3455,7 +3451,6 @@ void btrfs_unfreeze_block_group(struct btrfs_block_group *block_group) BUG_ON(!em); /* logic error, can't happen */ remove_extent_mapping(em_tree, em); write_unlock(&em_tree->lock); - mutex_unlock(&fs_info->chunk_mutex); /* once for us and once for the tree */ free_extent_map(em);