Commit d4b4087c authored by Josef Bacik's avatar Josef Bacik Committed by Chris Mason

Btrfs: do a full search everytime in btrfs_search_old_slot

While running some snashot aware defrag tests I noticed I was panicing every
once and a while in key_search.  This is because of the optimization that says
if we find a key at slot 0 it will be at slot 0 all the way down the rest of the
tree.  This isn't the case for btrfs_search_old_slot since it will likely replay
changes to a buffer if something has changed since we took our sequence number.
So short circuit this optimization by setting prev_cmp to -1 every time we call
key_search so we will do our normal binary search.  With this patch I am no
longer seeing the panics I was seeing before.  Thanks,
Signed-off-by: default avatarJosef Bacik <jbacik@fusionio.com>
Signed-off-by: default avatarChris Mason <chris.mason@fusionio.com>
parent 06ea65a3
...@@ -2758,7 +2758,7 @@ int btrfs_search_old_slot(struct btrfs_root *root, struct btrfs_key *key, ...@@ -2758,7 +2758,7 @@ int btrfs_search_old_slot(struct btrfs_root *root, struct btrfs_key *key,
int level; int level;
int lowest_unlock = 1; int lowest_unlock = 1;
u8 lowest_level = 0; u8 lowest_level = 0;
int prev_cmp; int prev_cmp = -1;
lowest_level = p->lowest_level; lowest_level = p->lowest_level;
WARN_ON(p->nodes[0] != NULL); WARN_ON(p->nodes[0] != NULL);
...@@ -2769,7 +2769,6 @@ int btrfs_search_old_slot(struct btrfs_root *root, struct btrfs_key *key, ...@@ -2769,7 +2769,6 @@ int btrfs_search_old_slot(struct btrfs_root *root, struct btrfs_key *key,
} }
again: again:
prev_cmp = -1;
b = get_old_root(root, time_seq); b = get_old_root(root, time_seq);
level = btrfs_header_level(b); level = btrfs_header_level(b);
p->locks[level] = BTRFS_READ_LOCK; p->locks[level] = BTRFS_READ_LOCK;
...@@ -2787,6 +2786,11 @@ int btrfs_search_old_slot(struct btrfs_root *root, struct btrfs_key *key, ...@@ -2787,6 +2786,11 @@ int btrfs_search_old_slot(struct btrfs_root *root, struct btrfs_key *key,
*/ */
btrfs_unlock_up_safe(p, level + 1); btrfs_unlock_up_safe(p, level + 1);
/*
* Since we can unwind eb's we want to do a real search every
* time.
*/
prev_cmp = -1;
ret = key_search(b, key, level, &prev_cmp, &slot); ret = key_search(b, key, level, &prev_cmp, &slot);
if (level != 0) { if (level != 0) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment