From 6f508a01f58d4e349af7dcf1da3dce6bfa3acbb9 Mon Sep 17 00:00:00 2001 From: Qu Wenruo Date: Thu, 19 May 2016 10:54:39 +0800 Subject: [PATCH] btrfs-progs: Return earlier for previous item Follow kernel code to return earlier for btrfs_previous_item() function. Before this patch, btrfs_previous_item() doesn't use its min_objectid to exit, this makes caller to check key to exit, and if caller doesn't check, it will iterate all previous item. This patch will check min_objectid and type, to early return and save some time. Signed-off-by: Qu Wenruo Signed-off-by: David Sterba --- ctree.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/ctree.c b/ctree.c index 933833b..6875bb4 100644 --- a/ctree.c +++ b/ctree.c @@ -2880,6 +2880,7 @@ int btrfs_previous_item(struct btrfs_root *root, { struct btrfs_key found_key; struct extent_buffer *leaf; + u32 nritems; int ret; while(1) { @@ -2891,9 +2892,20 @@ int btrfs_previous_item(struct btrfs_root *root, path->slots[0]--; } leaf = path->nodes[0]; + nritems = btrfs_header_nritems(leaf); + if (nritems == 0) + return 1; + if (path->slots[0] == nritems) + path->slots[0]--; + btrfs_item_key_to_cpu(leaf, &found_key, path->slots[0]); + if (found_key.objectid < min_objectid) + break; if (found_key.type == type) return 0; + if (found_key.objectid == min_objectid && + found_key.type < type) + break; } return 1; } -- 2.7.4