Skip to content

Commit

Permalink
Btrfs: fix btrfs_prev_leaf() previous key computation
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Filipe David Borba Manana authored and Chris Mason committed Nov 12, 2013
1 parent e93ae26 commit e8b0d72
Showing 1 changed file with 8 additions and 4 deletions.
12 changes: 8 additions & 4 deletions fs/btrfs/ctree.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down

0 comments on commit e8b0d72

Please sign in to comment.