|
@@ -10480,11 +10480,15 @@ void btrfs_delete_unused_bgs(struct btrfs_fs_info *fs_info)
|
|
|
* until transaction commit to do the actual discard.
|
|
|
*/
|
|
|
if (trimming) {
|
|
|
- WARN_ON(!list_empty(&block_group->bg_list));
|
|
|
- spin_lock(&trans->transaction->deleted_bgs_lock);
|
|
|
+ spin_lock(&fs_info->unused_bgs_lock);
|
|
|
+ /*
|
|
|
+ * A concurrent scrub might have added us to the list
|
|
|
+ * fs_info->unused_bgs, so use a list_move operation
|
|
|
+ * to add the block group to the deleted_bgs list.
|
|
|
+ */
|
|
|
list_move(&block_group->bg_list,
|
|
|
&trans->transaction->deleted_bgs);
|
|
|
- spin_unlock(&trans->transaction->deleted_bgs_lock);
|
|
|
+ spin_unlock(&fs_info->unused_bgs_lock);
|
|
|
btrfs_get_block_group(block_group);
|
|
|
}
|
|
|
end_trans:
|