From b5fc0b90144c37532f68839f36be08e05c0767bf Mon Sep 17 00:00:00 2001 From: Hugo Mills Date: Mon, 5 May 2014 18:07:49 +0100 Subject: [PATCH] btrfs-progs: check: Fix wrong level access There's no reason to assume that the bad key order is in a leaf block, so accessing level 0 of the path is going to be an error if it's actually a node block that's bad. Reported-by: Chris Mason Signed-off-by: Hugo Mills Signed-off-by: David Sterba --- cmds-check.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/cmds-check.c b/cmds-check.c index da94079..df4af9a 100644 --- a/cmds-check.c +++ b/cmds-check.c @@ -2418,6 +2418,7 @@ static int try_to_fix_bad_block(struct btrfs_trans_handle *trans, struct btrfs_path *path; struct btrfs_key k1, k2; int i; + int level; int ret; if (status != BTRFS_TREE_BLOCK_BAD_KEY_ORDER) @@ -2435,9 +2436,10 @@ static int try_to_fix_bad_block(struct btrfs_trans_handle *trans, if (!path) return -EIO; - path->lowest_level = btrfs_header_level(buf); + level = btrfs_header_level(buf); + path->lowest_level = level; path->skip_check_block = 1; - if (btrfs_header_level(buf)) + if (level) btrfs_node_key_to_cpu(buf, &k1, 0); else btrfs_item_key_to_cpu(buf, &k1, 0); @@ -2448,9 +2450,9 @@ static int try_to_fix_bad_block(struct btrfs_trans_handle *trans, return -EIO; } - buf = path->nodes[0]; + buf = path->nodes[level]; for (i = 0; i < btrfs_header_nritems(buf) - 1; i++) { - if (btrfs_header_level(buf)) { + if (level) { btrfs_node_key_to_cpu(buf, &k1, i); btrfs_node_key_to_cpu(buf, &k2, i + 1); } else { -- 2.7.4