mirror of
https://github.com/torvalds/linux.git
synced 2024-11-11 06:31:49 +00:00
Btrfs: make send's file extent item search more efficient
Instead of looking for a file extent item, process it, release the path and do a btree search for the next file extent item, just process all file extent items in a leaf without intermediate btree searches. This way we save cpu and we're not blocking other tasks or affecting concurrency on the btree, because send's paths use the commit root and skip btree node/leaf locking. Signed-off-by: Filipe David Borba Manana <fdmanana@gmail.com> Signed-off-by: Josef Bacik <jbacik@fb.com> Signed-off-by: Chris Mason <clm@fb.com>
This commit is contained in:
parent
95def2ede1
commit
7fdd29d02e
@ -4573,17 +4573,25 @@ static int process_all_extents(struct send_ctx *sctx)
|
||||
key.objectid = sctx->cmp_key->objectid;
|
||||
key.type = BTRFS_EXTENT_DATA_KEY;
|
||||
key.offset = 0;
|
||||
while (1) {
|
||||
ret = btrfs_search_slot_for_read(root, &key, path, 1, 0);
|
||||
if (ret < 0)
|
||||
goto out;
|
||||
if (ret) {
|
||||
ret = 0;
|
||||
goto out;
|
||||
}
|
||||
ret = btrfs_search_slot(NULL, root, &key, path, 0, 0);
|
||||
if (ret < 0)
|
||||
goto out;
|
||||
|
||||
while (1) {
|
||||
eb = path->nodes[0];
|
||||
slot = path->slots[0];
|
||||
|
||||
if (slot >= btrfs_header_nritems(eb)) {
|
||||
ret = btrfs_next_leaf(root, path);
|
||||
if (ret < 0) {
|
||||
goto out;
|
||||
} else if (ret > 0) {
|
||||
ret = 0;
|
||||
break;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
btrfs_item_key_to_cpu(eb, &found_key, slot);
|
||||
|
||||
if (found_key.objectid != key.objectid ||
|
||||
@ -4596,8 +4604,7 @@ static int process_all_extents(struct send_ctx *sctx)
|
||||
if (ret < 0)
|
||||
goto out;
|
||||
|
||||
btrfs_release_path(path);
|
||||
key.offset = found_key.offset + 1;
|
||||
path->slots[0]++;
|
||||
}
|
||||
|
||||
out:
|
||||
|
Loading…
Reference in New Issue
Block a user