mirror of
https://github.com/raspberrypi/linux.git
synced 2026-01-04 18:27:36 +00:00
Revert "btrfs: turn fs_info member buffer_radix into XArray"
This reverts commit 8ee922689d.
Revert the xarray conversion, there's a problem with potential
sleep-inside-spinlock [1] when calling xa_insert that triggers GFP_NOFS
allocation. The radix tree used the preloading mechanism to avoid
sleeping but this is not available in xarray.
Conversion from spin lock to mutex is possible but at time of rc6 is
riskier than a clean revert.
[1] https://lore.kernel.org/linux-btrfs/cover.1657097693.git.fdmanana@suse.com/
Reported-by: Filipe Manana <fdmanana@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
This commit is contained in:
@@ -150,8 +150,8 @@ struct btrfs_fs_info *btrfs_alloc_dummy_fs_info(u32 nodesize, u32 sectorsize)
|
||||
|
||||
void btrfs_free_dummy_fs_info(struct btrfs_fs_info *fs_info)
|
||||
{
|
||||
unsigned long index;
|
||||
struct extent_buffer *eb;
|
||||
struct radix_tree_iter iter;
|
||||
void **slot;
|
||||
struct btrfs_device *dev, *tmp;
|
||||
|
||||
if (!fs_info)
|
||||
@@ -163,9 +163,25 @@ void btrfs_free_dummy_fs_info(struct btrfs_fs_info *fs_info)
|
||||
|
||||
test_mnt->mnt_sb->s_fs_info = NULL;
|
||||
|
||||
xa_for_each(&fs_info->extent_buffers, index, eb) {
|
||||
spin_lock(&fs_info->buffer_lock);
|
||||
radix_tree_for_each_slot(slot, &fs_info->buffer_radix, &iter, 0) {
|
||||
struct extent_buffer *eb;
|
||||
|
||||
eb = radix_tree_deref_slot_protected(slot, &fs_info->buffer_lock);
|
||||
if (!eb)
|
||||
continue;
|
||||
/* Shouldn't happen but that kind of thinking creates CVE's */
|
||||
if (radix_tree_exception(eb)) {
|
||||
if (radix_tree_deref_retry(eb))
|
||||
slot = radix_tree_iter_retry(&iter);
|
||||
continue;
|
||||
}
|
||||
slot = radix_tree_iter_resume(slot, &iter);
|
||||
spin_unlock(&fs_info->buffer_lock);
|
||||
free_extent_buffer_stale(eb);
|
||||
spin_lock(&fs_info->buffer_lock);
|
||||
}
|
||||
spin_unlock(&fs_info->buffer_lock);
|
||||
|
||||
btrfs_mapping_tree_free(&fs_info->mapping_tree);
|
||||
list_for_each_entry_safe(dev, tmp, &fs_info->fs_devices->devices,
|
||||
|
||||
Reference in New Issue
Block a user