Skip to content

Commit

Permalink
Btrfs: make send's file extent item search more efficient
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Filipe David Borba Manana authored and Chris Mason committed Jan 29, 2014
1 parent 95def2e commit 7fdd29d
Showing 1 changed file with 17 additions and 10 deletions.
27 changes: 17 additions & 10 deletions fs/btrfs/send.c
Original file line number Diff line number Diff line change
Expand Up @@ -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 ||
Expand All @@ -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:
Expand Down

0 comments on commit 7fdd29d

Please sign in to comment.