Btrfs: fix btrfs_prev_leaf() previous key computation
authorFilipe David Borba Manana <fdmanana@gmail.com>
Mon, 14 Oct 2013 23:12:27 +0000 (00:12 +0100)
committerChris Mason <chris.mason@fusionio.com>
Tue, 12 Nov 2013 03:02:26 +0000 (22:02 -0500)
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>
fs/btrfs/ctree.c

index 8f3d6f893585cca6c4212468f104d7f3ff68b998..a749121203df2b93381d49ddd42e8380fef59671 100644 (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);