mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-08-26 02:39:48 +00:00
Btrfs: optimize extent item search in run_delayed_extent_op
Instead of doing another extent tree search if the first search failed to find a metadata item, check if the previous item in the leaf is an extent item and use it if it is, otherwise do the second tree search for an extent item. Signed-off-by: Filipe David Borba Manana <fdmanana@gmail.com> Signed-off-by: Josef Bacik <jbacik@fusionio.com> Signed-off-by: Chris Mason <chris.mason@fusionio.com>
This commit is contained in:
parent
cab45e22da
commit
5599488708
1 changed files with 20 additions and 7 deletions
|
@ -2130,15 +2130,28 @@ static int run_delayed_extent_op(struct btrfs_trans_handle *trans,
|
|||
}
|
||||
if (ret > 0) {
|
||||
if (metadata) {
|
||||
btrfs_release_path(path);
|
||||
metadata = 0;
|
||||
if (path->slots[0] > 0) {
|
||||
path->slots[0]--;
|
||||
btrfs_item_key_to_cpu(path->nodes[0], &key,
|
||||
path->slots[0]);
|
||||
if (key.objectid == node->bytenr &&
|
||||
key.type == BTRFS_EXTENT_ITEM_KEY &&
|
||||
key.offset == node->num_bytes)
|
||||
ret = 0;
|
||||
}
|
||||
if (ret > 0) {
|
||||
btrfs_release_path(path);
|
||||
metadata = 0;
|
||||
|
||||
key.offset = node->num_bytes;
|
||||
key.type = BTRFS_EXTENT_ITEM_KEY;
|
||||
goto again;
|
||||
key.objectid = node->bytenr;
|
||||
key.offset = node->num_bytes;
|
||||
key.type = BTRFS_EXTENT_ITEM_KEY;
|
||||
goto again;
|
||||
}
|
||||
} else {
|
||||
err = -EIO;
|
||||
goto out;
|
||||
}
|
||||
err = -EIO;
|
||||
goto out;
|
||||
}
|
||||
|
||||
leaf = path->nodes[0];
|
||||
|
|
Loading…
Reference in a new issue