diff options
author | Filipe David Borba Manana <fdmanana@gmail.com> | 2013-10-18 15:42:56 +0100 |
---|---|---|
committer | Chris Mason <chris.mason@fusionio.com> | 2013-11-11 22:03:53 -0500 |
commit | 55994887082d6e9b3d31b55fc5be158fd97eadbc (patch) | |
tree | f98021a7c4cb1bc6a9c12aa0f6d1754cabf1e6c2 /fs | |
parent | cab45e22da48b523665b3566f43527a2fead1d1e (diff) | |
download | op-kernel-dev-55994887082d6e9b3d31b55fc5be158fd97eadbc.zip op-kernel-dev-55994887082d6e9b3d31b55fc5be158fd97eadbc.tar.gz |
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>
Diffstat (limited to 'fs')
-rw-r--r-- | fs/btrfs/extent-tree.c | 27 |
1 files changed, 20 insertions, 7 deletions
diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c index a807acc..4595a65 100644 --- a/fs/btrfs/extent-tree.c +++ b/fs/btrfs/extent-tree.c @@ -2130,15 +2130,28 @@ again: } 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]; |