mirror of https://gitee.com/openkylin/linux.git
Btrfs: optimize btrfs_lookup_extent_info()
If we're looking for a metadata item in the tree and the search fails with return value of 1, and the slot doesn't point to the first item in the leaf, check if the previous item in the leaf corresponds to an extent item for the same object id - if it does, then don't do another tree search to get it. This optimization is already done by btrfs-progs. V2: updated commit message. 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
d790155457
commit
74be951087
|
@ -771,11 +771,24 @@ int btrfs_lookup_extent_info(struct btrfs_trans_handle *trans,
|
||||||
goto out_free;
|
goto out_free;
|
||||||
|
|
||||||
if (ret > 0 && metadata && key.type == BTRFS_METADATA_ITEM_KEY) {
|
if (ret > 0 && metadata && key.type == BTRFS_METADATA_ITEM_KEY) {
|
||||||
|
metadata = 0;
|
||||||
|
if (path->slots[0]) {
|
||||||
|
path->slots[0]--;
|
||||||
|
btrfs_item_key_to_cpu(path->nodes[0], &key,
|
||||||
|
path->slots[0]);
|
||||||
|
if (key.objectid == bytenr &&
|
||||||
|
key.type == BTRFS_EXTENT_ITEM_KEY &&
|
||||||
|
key.offset == root->leafsize)
|
||||||
|
ret = 0;
|
||||||
|
}
|
||||||
|
if (ret) {
|
||||||
|
key.objectid = bytenr;
|
||||||
key.type = BTRFS_EXTENT_ITEM_KEY;
|
key.type = BTRFS_EXTENT_ITEM_KEY;
|
||||||
key.offset = root->leafsize;
|
key.offset = root->leafsize;
|
||||||
btrfs_release_path(path);
|
btrfs_release_path(path);
|
||||||
goto again;
|
goto again;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (ret == 0) {
|
if (ret == 0) {
|
||||||
leaf = path->nodes[0];
|
leaf = path->nodes[0];
|
||||||
|
|
Loading…
Reference in New Issue