@@ -1863,29 +1863,32 @@ void btrfs_kill_delayed_inode_items(struct btrfs_inode *inode)
void btrfs_kill_all_delayed_nodes(struct btrfs_root *root)
{
- u64 inode_id = 0;
+ unsigned long index;
+ struct btrfs_delayed_node *delayed_node;
struct btrfs_delayed_node *delayed_nodes[8];
int i, n;
while (1) {
spin_lock(&root->inode_lock);
- n = radix_tree_gang_lookup(&root->delayed_nodes_xarray,
- (void **)delayed_nodes, inode_id,
- ARRAY_SIZE(delayed_nodes));
- if (!n) {
+ if (xa_empty(&root->delayed_nodes_xarray)) {
spin_unlock(&root->inode_lock);
break;
}
- inode_id = delayed_nodes[n - 1]->inode_id + 1;
- for (i = 0; i < n; i++) {
+ n = 0;
+ xa_for_each_start(&root->delayed_nodes_xarray, index,
+ delayed_node, index) {
/*
* Don't increase refs in case the node is dead and
* about to be removed from the tree in the loop below
*/
- if (!refcount_inc_not_zero(&delayed_nodes[i]->refs))
- delayed_nodes[i] = NULL;
+ if (!refcount_inc_not_zero(&delayed_node->refs))
+ delayed_nodes[n] = NULL;
+ n++;
+ if (n >= ARRAY_SIZE(delayed_nodes))
+ break;
}
+ index++;
spin_unlock(&root->inode_lock);
for (i = 0; i < n; i++) {
Signed-off-by: Gabriel Niebler <gniebler@suse.com> --- fs/btrfs/delayed-inode.c | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-)