Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e8b0d724 authored by Filipe David Borba Manana's avatar Filipe David Borba Manana Committed by Chris Mason
Browse files

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: default avatarFilipe David Borba Manana <fdmanana@gmail.com>
Signed-off-by: default avatarJosef Bacik <jbacik@fusionio.com>
Signed-off-by: default avatarChris Mason <chris.mason@fusionio.com>
parent e93ae26f
Loading
Loading
Loading
Loading
+8 −4
Original line number Diff line number Diff line
@@ -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);