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 <[email protected]> Signed-off-by: Hugo Mills <[email protected]> --- cmds-check.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/cmds-check.c b/cmds-check.c index d195e7a..fc84ad8 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 { -- 1.9.2 -- To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
