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:
parent
e93ae26fe1
commit
e8b0d724d5
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue