|
@@ -2579,6 +2579,21 @@ out:
|
|
|
spin_unlock(&fs_info->qgroup_lock);
|
|
|
}
|
|
|
|
|
|
+/*
|
|
|
+ * Check if the leaf is the last leaf. Which means all node pointers
|
|
|
+ * are at their last position.
|
|
|
+ */
|
|
|
+static bool is_last_leaf(struct btrfs_path *path)
|
|
|
+{
|
|
|
+ int i;
|
|
|
+
|
|
|
+ for (i = 1; i < BTRFS_MAX_LEVEL && path->nodes[i]; i++) {
|
|
|
+ if (path->slots[i] != btrfs_header_nritems(path->nodes[i]) - 1)
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ return true;
|
|
|
+}
|
|
|
+
|
|
|
/*
|
|
|
* returns < 0 on error, 0 when more leafs are to be scanned.
|
|
|
* returns 1 when done.
|
|
@@ -2591,6 +2606,7 @@ qgroup_rescan_leaf(struct btrfs_fs_info *fs_info, struct btrfs_path *path,
|
|
|
struct extent_buffer *scratch_leaf = NULL;
|
|
|
struct ulist *roots = NULL;
|
|
|
u64 num_bytes;
|
|
|
+ bool done;
|
|
|
int slot;
|
|
|
int ret;
|
|
|
|
|
@@ -2619,6 +2635,7 @@ qgroup_rescan_leaf(struct btrfs_fs_info *fs_info, struct btrfs_path *path,
|
|
|
mutex_unlock(&fs_info->qgroup_rescan_lock);
|
|
|
return ret;
|
|
|
}
|
|
|
+ done = is_last_leaf(path);
|
|
|
|
|
|
btrfs_item_key_to_cpu(path->nodes[0], &found,
|
|
|
btrfs_header_nritems(path->nodes[0]) - 1);
|
|
@@ -2663,6 +2680,8 @@ out:
|
|
|
free_extent_buffer(scratch_leaf);
|
|
|
}
|
|
|
|
|
|
+ if (done && !ret)
|
|
|
+ ret = 1;
|
|
|
return ret;
|
|
|
}
|
|
|
|