@@ -438,13 +438,14 @@ static struct reada_extent *reada_find_extent(struct btrfs_fs_info *fs_info,
continue;
}
prev_dev = dev;
- ret = radix_tree_insert(&dev->reada_extents, index, re);
+ ret = xa_insert(&dev->reada_extents, index, re,
+ GFP_NOFS & ~__GFP_DIRECT_RECLAIM);
if (ret) {
while (--nzones >= 0) {
dev = re->zones[nzones]->device;
BUG_ON(dev == NULL);
/* ignore whether the entry was inserted */
- radix_tree_delete(&dev->reada_extents, index);
+ xa_erase(&dev->reada_extents, index);
}
radix_tree_delete(&fs_info->reada_tree, index);
spin_unlock(&fs_info->reada_lock);
@@ -504,7 +505,7 @@ static void reada_extent_put(struct btrfs_fs_info *fs_info,
for (i = 0; i < re->nzones; ++i) {
struct reada_zone *zone = re->zones[i];
- radix_tree_delete(&zone->device->reada_extents, index);
+ xa_erase(&zone->device->reada_extents, index);
}
spin_unlock(&fs_info->reada_lock);
@@ -644,6 +645,7 @@ static int reada_start_machine_dev(struct btrfs_device *dev)
int mirror_num = 0;
struct extent_buffer *eb = NULL;
u64 logical;
+ unsigned long index;
int ret;
int i;
@@ -660,19 +662,19 @@ static int reada_start_machine_dev(struct btrfs_device *dev)
* a contiguous block of extents, we could also coagulate them or use
* plugging to speed things up
*/
- ret = radix_tree_gang_lookup(&dev->reada_extents, (void **)&re,
- dev->reada_next >> PAGE_SHIFT, 1);
- if (ret == 0 || re->logical > dev->reada_curr_zone->end) {
+ index = dev->reada_next >> PAGE_SHIFT;
+ re = xa_find(&dev->reada_extents, &index, ULONG_MAX, XA_PRESENT);
+ if (!re || re->logical > dev->reada_curr_zone->end) {
ret = reada_pick_zone(dev);
if (!ret) {
spin_unlock(&fs_info->reada_lock);
return 0;
}
- re = NULL;
- ret = radix_tree_gang_lookup(&dev->reada_extents, (void **)&re,
- dev->reada_next >> PAGE_SHIFT, 1);
+ index = dev->reada_next >> PAGE_SHIFT;
+ re = xa_find(&dev->reada_extents, &index, ULONG_MAX,
+ XA_PRESENT);
}
- if (ret == 0) {
+ if (!re) {
spin_unlock(&fs_info->reada_lock);
return 0;
}
@@ -828,11 +830,11 @@ static void dump_devs(struct btrfs_fs_info *fs_info, int all)
cnt = 0;
index = 0;
while (all) {
- struct reada_extent *re = NULL;
+ struct reada_extent *re;
- ret = radix_tree_gang_lookup(&device->reada_extents,
- (void **)&re, index, 1);
- if (ret == 0)
+ re = xa_find(&device->reada_extents, &index, ULONG_MAX,
+ XA_PRESENT);
+ if (!re)
break;
pr_debug(" re: logical %llu size %u empty %d scheduled %d",
re->logical, fs_info->nodesize,
@@ -848,7 +850,7 @@ static void dump_devs(struct btrfs_fs_info *fs_info, int all)
}
}
pr_cont("\n");
- index = (re->logical >> PAGE_SHIFT) + 1;
+ index++;
if (++cnt > 15)
break;
}
@@ -248,7 +248,7 @@ static struct btrfs_device *__alloc_device(void)
atomic_set(&dev->dev_stats_ccnt, 0);
btrfs_device_data_ordered_init(dev);
xa_init(&dev->reada_zones);
- INIT_RADIX_TREE(&dev->reada_extents, GFP_NOFS & ~__GFP_DIRECT_RECLAIM);
+ xa_init(&dev->reada_extents);
return dev;
}
@@ -140,7 +140,7 @@ struct btrfs_device {
u64 reada_next;
struct reada_zone *reada_curr_zone;
struct xarray reada_zones;
- struct radix_tree_root reada_extents;
+ struct xarray reada_extents;
/* disk I/O failure stats. For detailed description refer to
* enum btrfs_dev_stat_values in ioctl.h */