Btrfs: fix btrfs_prev_leaf() previous key computation

If we decrement the key type, we must reset its offset to the largest
possible offset (u64)-1. If we decrement the key's objectid, then we
must reset the key's type and offset to their largest possible values,
(u8)-1 and (u64)-1 respectively. Not doing so can make us miss an
items in the tree.

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:
Filipe David Borba Manana 2013-10-15 00:12:27 +01:00 committed by Chris Mason
parent e93ae26fe1
commit e8b0d724d5
1 changed files with 8 additions and 4 deletions

View File

@ -4827,14 +4827,18 @@ static int btrfs_prev_leaf(struct btrfs_root *root, struct btrfs_path *path)
btrfs_item_key_to_cpu(path->nodes[0], &key, 0);
if (key.offset > 0)
if (key.offset > 0) {
key.offset--;
else if (key.type > 0)
} else if (key.type > 0) {
key.type--;
else if (key.objectid > 0)
key.offset = (u64)-1;
} else if (key.objectid > 0) {
key.objectid--;
else
key.type = (u8)-1;
key.offset = (u64)-1;
} else {
return 1;
}
btrfs_release_path(path);
ret = btrfs_search_slot(NULL, root, &key, path, 0, 0);