Received: by 2002:ad5:474a:0:0:0:0:0 with SMTP id i10csp8122260imu; Tue, 4 Dec 2018 03:23:10 -0800 (PST) X-Google-Smtp-Source: AFSGD/Vi0Flgv6MO/PqkFv9dUoX3Ij0YQyJDJAPTV2o8kBZbrkMpZYSi9q80OOorvOcAKivdx5gT X-Received: by 2002:a62:4e83:: with SMTP id c125mr19850069pfb.101.1543922590218; Tue, 04 Dec 2018 03:23:10 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1543922590; cv=none; d=google.com; s=arc-20160816; b=em1hmSIFB47TSgufLt4MpPXCSDNA485X3sG1riDYfYnJJi2o5fYm2Dlm40ViiJ9w5P 5DxnHV5OFjkdfrVkhVTp+iz7DrdXgnq4MzJkn5nED6wMjC4RCKokuhZwUq2E8A1F5JRe ePKQgvkxA2nEXr86gNaR9oNZt1E9ZfpqQo8Uw9pguyTAlWKXIfjUU72D+YR2p9PVfxHk BX3Fr2oFTjurYMtRURH1e/ee/i3ACXoyVGNSdDEMKNOKTDU55Oik5Z6uveGaIha8uE38 r7VAl5I1p5hY9zCXkSYA1CTA39wXXeWJG2fI2o5EAmZTKQplYEtBKWZLUN1rYJbwvFJi fmoQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=EYniD1NueVtiefwLRNgC50+ayA59886shHlpcLveX10=; b=CREaGv/qdd1f2cdXlGQfVRhEKH0I2EbNCHTNHkRsj2pr6Mq/nXKyykWIDLwmyel2Pm AdwO/3lrgcYG8RztsmiXdYB5ZmjA1t0G+efTJ5rR7uoAfwEa9VbEqfpMy42RNVXFUOMJ cTsJ+gFMmk3Uh5U3LT733pWeO48jClbacz+Ek/JBknV5keHxN7EZLeyvcbtXlKGmZFJI LH9yRP/x+u4CNvgmWGYCmITZdN9oNA0ZTQgE2eE4MOwdv6Y/+lLXhsw7/tzDcCLnnzFl P1tFahXuEYbgX/EljVo1lnI+K7fNOL1ls/8RNTlyrxtSvD/PhpwqrmsYB0CbXLDlSPX1 cDXg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=E9pDvAhB; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id 2si17646624pla.156.2018.12.04.03.22.55; Tue, 04 Dec 2018 03:23:10 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=E9pDvAhB; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727622AbeLDLCY (ORCPT + 99 others); Tue, 4 Dec 2018 06:02:24 -0500 Received: from mail.kernel.org ([198.145.29.99]:48306 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727063AbeLDLCU (ORCPT ); Tue, 4 Dec 2018 06:02:20 -0500 Received: from localhost (5356596B.cm-6-7b.dynamic.ziggo.nl [83.86.89.107]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 78D1E214E0; Tue, 4 Dec 2018 11:02:19 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1543921340; bh=OACRTtEG7kXbrTL16o1902E9nXQtCWxlyjzHLwZyQjs=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=E9pDvAhBadENZzjDHuO3N/bMMU5JMTw8Gki8B1i0LgbMPvytVcoa7h9K2pLaIRPN+ 66aMii0NwTom9EnEAopeoTeVz1u3iBhN+5zfSiN/dInvUiANpUImbx1yDoiY9mSZSO QcvsdWIitXTvOvCag3PuvLR7ZtRlEpDSBBvHDVDg= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Qu Wenruo , David Sterba , Ben Hutchings , Sasha Levin Subject: [PATCH 4.14 034/146] btrfs: tree-checker: Enhance btrfs_check_node output Date: Tue, 4 Dec 2018 11:48:40 +0100 Message-Id: <20181204103728.238824768@linuxfoundation.org> X-Mailer: git-send-email 2.19.2 In-Reply-To: <20181204103726.750894136@linuxfoundation.org> References: <20181204103726.750894136@linuxfoundation.org> User-Agent: quilt/0.65 X-stable: review X-Patchwork-Hint: ignore MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 4.14-stable review patch. If anyone has any objections, please let me know. ------------------ commit bba4f29896c986c4cec17bc0f19f2ce644fceae1 upstream. Use inline function to replace macro since we don't need stringification. (Macro still exists until all callers get updated) And add more info about the error, and replace EIO with EUCLEAN. For nr_items error, report if it's too large or too small, and output the valid value range. For node block pointer, added a new alignment checker. For key order, also output the next key to make the problem more obvious. Signed-off-by: Qu Wenruo [ wording adjustments, unindented long strings ] Signed-off-by: David Sterba Signed-off-by: Ben Hutchings Signed-off-by: Sasha Levin --- fs/btrfs/tree-checker.c | 68 ++++++++++++++++++++++++++++++++++++----- 1 file changed, 61 insertions(+), 7 deletions(-) diff --git a/fs/btrfs/tree-checker.c b/fs/btrfs/tree-checker.c index 56e25a630103..5acdf3355a3f 100644 --- a/fs/btrfs/tree-checker.c +++ b/fs/btrfs/tree-checker.c @@ -37,6 +37,46 @@ btrfs_header_level(eb) == 0 ? "leaf" : "node", \ reason, btrfs_header_bytenr(eb), root->objectid, slot) +/* + * Error message should follow the following format: + * corrupt : , [, ] + * + * @type: leaf or node + * @identifier: the necessary info to locate the leaf/node. + * It's recommened to decode key.objecitd/offset if it's + * meaningful. + * @reason: describe the error + * @bad_value: optional, it's recommened to output bad value and its + * expected value (range). + * + * Since comma is used to separate the components, only space is allowed + * inside each component. + */ + +/* + * Append generic "corrupt leaf/node root=%llu block=%llu slot=%d: " to @fmt. + * Allows callers to customize the output. + */ +__printf(4, 5) +static void generic_err(const struct btrfs_root *root, + const struct extent_buffer *eb, int slot, + const char *fmt, ...) +{ + struct va_format vaf; + va_list args; + + va_start(args, fmt); + + vaf.fmt = fmt; + vaf.va = &args; + + btrfs_crit(root->fs_info, + "corrupt %s: root=%llu block=%llu slot=%d, %pV", + btrfs_header_level(eb) == 0 ? "leaf" : "node", + root->objectid, btrfs_header_bytenr(eb), slot, &vaf); + va_end(args); +} + static int check_extent_data_item(struct btrfs_root *root, struct extent_buffer *leaf, struct btrfs_key *key, int slot) @@ -282,9 +322,11 @@ int btrfs_check_node(struct btrfs_root *root, struct extent_buffer *node) if (nr == 0 || nr > BTRFS_NODEPTRS_PER_BLOCK(root->fs_info)) { btrfs_crit(root->fs_info, - "corrupt node: block %llu root %llu nritems %lu", - node->start, root->objectid, nr); - return -EIO; +"corrupt node: root=%llu block=%llu, nritems too %s, have %lu expect range [1,%u]", + root->objectid, node->start, + nr == 0 ? "small" : "large", nr, + BTRFS_NODEPTRS_PER_BLOCK(root->fs_info)); + return -EUCLEAN; } for (slot = 0; slot < nr - 1; slot++) { @@ -293,14 +335,26 @@ int btrfs_check_node(struct btrfs_root *root, struct extent_buffer *node) btrfs_node_key_to_cpu(node, &next_key, slot + 1); if (!bytenr) { - CORRUPT("invalid item slot", node, root, slot); - ret = -EIO; + generic_err(root, node, slot, + "invalid NULL node pointer"); + ret = -EUCLEAN; + goto out; + } + if (!IS_ALIGNED(bytenr, root->fs_info->sectorsize)) { + generic_err(root, node, slot, + "unaligned pointer, have %llu should be aligned to %u", + bytenr, root->fs_info->sectorsize); + ret = -EUCLEAN; goto out; } if (btrfs_comp_cpu_keys(&key, &next_key) >= 0) { - CORRUPT("bad key order", node, root, slot); - ret = -EIO; + generic_err(root, node, slot, + "bad key order, current (%llu %u %llu) next (%llu %u %llu)", + key.objectid, key.type, key.offset, + next_key.objectid, next_key.type, + next_key.offset); + ret = -EUCLEAN; goto out; } } -- 2.17.1