From patchwork Wed Dec 10 20:51:34 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: mwilck@arcor.de X-Patchwork-Id: 5472411 Return-Path: X-Original-To: patchwork-linux-btrfs@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork2.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.19.201]) by patchwork2.web.kernel.org (Postfix) with ESMTP id AD0F6BEEBA for ; Wed, 10 Dec 2014 21:05:49 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id D5015201BB for ; Wed, 10 Dec 2014 21:05:48 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id F27EA201B9 for ; Wed, 10 Dec 2014 21:05:47 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S933331AbaLJVFo (ORCPT ); Wed, 10 Dec 2014 16:05:44 -0500 Received: from mail-in-16.arcor-online.net ([151.189.21.56]:36437 "EHLO mail-in-16.arcor-online.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S933303AbaLJVFl (ORCPT ); Wed, 10 Dec 2014 16:05:41 -0500 Received: from mail-in-15-z2.arcor-online.net (mail-in-15-z2.arcor-online.net [151.189.8.32]) by mx.arcor.de (Postfix) with ESMTP id 3B37B8767 for ; Wed, 10 Dec 2014 22:05:40 +0100 (CET) Received: from mail-in-10.arcor-online.net (mail-in-10.arcor-online.net [151.189.21.50]) by mail-in-15-z2.arcor-online.net (Postfix) with ESMTP id 34A551121BD; Wed, 10 Dec 2014 22:05:40 +0100 (CET) X-Greylist: Passed host: 188.96.131.100 X-DKIM: Sendmail DKIM Filter v2.8.2 mail-in-10.arcor-online.net 051402D6538 DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=arcor.de; s=mail-in; t=1418245540; bh=DS3lurTiF0P75KKnl3J+ecQLN4YF1jRvKVtWx0yM6YE=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References; b=OHxvsBGUDKPe9ujdLEXMXEjnWyd3e6L5r4XGHXgKHQIT04T2fPKEU1eW38H1QUwk0 FyZIOUm1u6xg7d80yceOyZM7RjJoCKdVrQR0QRHFdtKZimFqWx0sHJEXMC1xnKLhvJ 256JWNqT+6/LdK6FLA4PohtZaMbqZogJLkuFI6oU= X-Greylist: Passed host: 188.96.131.100 Received: from localhost.localdomain (dslb-188-096-131-100.188.096.pools.vodafone-ip.de [188.96.131.100]) (Authenticated sender: mwilck@arcor.de) by mail-in-10.arcor-online.net (Postfix) with ESMTPSA id 051402D6538; Wed, 10 Dec 2014 22:05:39 +0100 (CET) From: mwilck@arcor.de To: linux-btrfs@vger.kernel.org Cc: mwilck@arcor.de Subject: [PATCH 04/18] btrfs-progs: btrfs-debug-tree: handle corruption more gracefully Date: Wed, 10 Dec 2014 21:51:34 +0100 Message-Id: <1418244708-7087-5-git-send-email-mwilck@arcor.de> X-Mailer: git-send-email 1.7.3.4 In-Reply-To: <1418244708-7087-1-git-send-email-mwilck@arcor.de> References: <1418244708-7087-1-git-send-email-mwilck@arcor.de> Sender: linux-btrfs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-btrfs@vger.kernel.org X-Spam-Status: No, score=-6.8 required=5.0 tests=BAYES_00,DKIM_SIGNED, FREEMAIL_FROM,RCVD_IN_DNSWL_HI,T_DKIM_INVALID,T_RP_MATCHES_RCVD, UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP From: Martin Wilck This patch fixes the same thing in two different places. First, the first of the two BUG() tests is just a special case of the second one and can therefore be omitted. Second, instead of bailing out with BUG(), just print a reasonable error message and check the next child. Signed-off-by: Martin Wilck --- btrfs-debug-tree.c | 22 ++++++++++++++++------ print-tree.c | 22 ++++++++++++++++------ 2 files changed, 32 insertions(+), 12 deletions(-) diff --git a/btrfs-debug-tree.c b/btrfs-debug-tree.c index 4c1e835..d7c1155 100644 --- a/btrfs-debug-tree.c +++ b/btrfs-debug-tree.c @@ -73,13 +73,23 @@ static void print_extents(struct btrfs_root *root, struct extent_buffer *eb) btrfs_node_blockptr(eb, i), size, btrfs_node_ptr_generation(eb, i)); - if (btrfs_is_leaf(next) && - btrfs_header_level(eb) != 1) - BUG(); if (btrfs_header_level(next) != - btrfs_header_level(eb) - 1) - BUG(); - print_extents(root, next); + btrfs_header_level(eb) - 1) { + fprintf(stderr, "EXTENT TREE CORRUPTION detected at %llu, " + "slot %d pointing at %llu.\n" + "\tExpected child level: %d, found %d\n" + "\tExpected tree/transid: %llu/%llu," + " found %llu/%llu\n", + eb->start, i, next->start, + btrfs_header_level(eb) - 1, + btrfs_header_level(next), + (unsigned long long)btrfs_header_owner(eb), + (unsigned long long)btrfs_header_generation(eb), + (unsigned long long)btrfs_header_owner(next), + (unsigned long long) + btrfs_header_generation(next)); + } else + print_extents(root, next); free_extent_buffer(next); } } diff --git a/print-tree.c b/print-tree.c index 70a7acc..6769e20 100644 --- a/print-tree.c +++ b/print-tree.c @@ -1066,13 +1066,23 @@ void btrfs_print_tree(struct btrfs_root *root, struct extent_buffer *eb, int fol (unsigned long long)btrfs_header_owner(eb)); continue; } - if (btrfs_is_leaf(next) && - btrfs_header_level(eb) != 1) - BUG(); if (btrfs_header_level(next) != - btrfs_header_level(eb) - 1) - BUG(); - btrfs_print_tree(root, next, 1); + btrfs_header_level(eb) - 1) { + fprintf(stderr, "TREE CORRUPTION detected at %llu, " + "slot %d pointing at %llu.\n" + "\tExpected child level: %d, found %d\n" + "\tExpected tree/transid: %llu/%llu," + " found %llu/%llu\n", + eb->start, i, next->start, + btrfs_header_level(eb) - 1, + btrfs_header_level(next), + (unsigned long long)btrfs_header_owner(eb), + (unsigned long long)btrfs_header_generation(eb), + (unsigned long long)btrfs_header_owner(next), + (unsigned long long) + btrfs_header_generation(next)); + } else + btrfs_print_tree(root, next, 1); free_extent_buffer(next); } }