From: "Darrick J. Wong" <darrick.wong@oracle.com>
To: sandeen@redhat.com
Cc: linux-xfs@vger.kernel.org
Subject: [PATCH v2 2/4] xfs_db: use iocursor type to guess btree geometry if bad magic
Date: Mon, 10 Apr 2017 17:20:12 -0700 [thread overview]
Message-ID: <20170411002012.GB5094@birch.djwong.org> (raw)
In-Reply-To: <149186447366.32572.11858750403661352513.stgit@birch.djwong.org>
From: Darrick J. Wong <darrick.wong@oracle.com>
The function block_to_bt plays an integral role in determining the btree
geometry of a block that we want to manipulate with the debugger.
Normally we use the block magic to find the geometry profile, but if the
magic is bad we'll never find it and return NULL. The callers of this
function do not check for NULL and crash.
Therefore, if we can't find a geometry profile matching the magic
number, use the iocursor type to guess the profile and scowl about that
to stdout. This makes it so that even with a corrupt magic we can try
to print the fields instead of crashing the debugger.
Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
---
v2: be less macro-happy and only evaluate hascrc once
v3: braces around the for loop body
---
db/btblock.c | 54 ++++++++++++++++++++++++++++++++++++++++++++++--------
1 file changed, 46 insertions(+), 8 deletions(-)
diff --git a/db/btblock.c b/db/btblock.c
index 835a5f0..b819fa5 100644
--- a/db/btblock.c
+++ b/db/btblock.c
@@ -25,6 +25,8 @@
#include "print.h"
#include "bit.h"
#include "init.h"
+#include "io.h"
+#include "output.h"
/*
* Definition of the possible btree block layouts.
@@ -122,13 +124,52 @@ static struct xfs_db_btree *
block_to_bt(
struct xfs_btree_block *bb)
{
- struct xfs_db_btree *btp = &btrees[0];
+ struct xfs_db_btree *btp;
+ uint32_t magic;
+ bool crc;
- do {
- if (be32_to_cpu((bb)->bb_magic) == btp->magic)
+ magic = be32_to_cpu((bb)->bb_magic);
+ for (btp = &btrees[0]; btp->magic != 0; btp++) {
+ if (magic == btp->magic)
+ return btp;
+ }
+
+ crc = xfs_sb_version_hascrc(&mp->m_sb);
+ switch (iocur_top->typ->typnm) {
+ case TYP_BMAPBTA:
+ case TYP_BMAPBTD:
+ magic = crc ? XFS_BMAP_CRC_MAGIC : XFS_BMAP_MAGIC;
+ break;
+ case TYP_BNOBT:
+ magic = crc ? XFS_ABTB_CRC_MAGIC : XFS_ABTB_MAGIC;
+ break;
+ case TYP_CNTBT:
+ magic = crc ? XFS_ABTC_CRC_MAGIC : XFS_ABTC_MAGIC;
+ break;
+ case TYP_INOBT:
+ magic = crc ? XFS_IBT_CRC_MAGIC : XFS_IBT_MAGIC;
+ break;
+ case TYP_FINOBT:
+ magic = crc ? XFS_FIBT_CRC_MAGIC : XFS_FIBT_MAGIC;
+ break;
+ case TYP_RMAPBT:
+ magic = crc ? XFS_RMAP_CRC_MAGIC : 0;
+ break;
+ case TYP_REFCBT:
+ magic = crc ? XFS_REFC_CRC_MAGIC : 0;
+ break;
+ default:
+ ASSERT(0);
+ }
+
+ dbprintf(_("Bad btree magic 0x%x; coercing to %s.\n"),
+ be32_to_cpu((bb)->bb_magic),
+ iocur_top->typ->name);
+
+ for (btp = &btrees[0]; btp->magic != 0; btp++) {
+ if (magic == btp->magic)
return btp;
- btp++;
- } while (btp->magic != 0);
+ }
return NULL;
}
@@ -193,7 +234,6 @@ btblock_key_offset(
int offset;
ASSERT(startoff == 0);
- ASSERT(block->bb_level != 0);
offset = bt->block_len + (idx - 1) * bt->key_len;
return bitize(offset);
@@ -214,7 +254,6 @@ btblock_ptr_offset(
int maxrecs;
ASSERT(startoff == 0);
- ASSERT(block->bb_level != 0);
maxrecs = btblock_maxrecs(bt, mp->m_sb.sb_blocksize);
offset = bt->block_len +
@@ -238,7 +277,6 @@ btblock_rec_offset(
int offset;
ASSERT(startoff == 0);
- ASSERT(block->bb_level == 0);
offset = bt->block_len + (idx - 1) * bt->rec_len;
return bitize(offset);
next prev parent reply other threads:[~2017-04-11 0:20 UTC|newest]
Thread overview: 21+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-04-10 22:47 [PATCH v2 0/4] xfs_db misc. btree dumping improvements Darrick J. Wong
2017-04-10 22:47 ` [PATCH 1/4] xfs_db: don't print arrays off the end of a buffer Darrick J. Wong
2017-04-26 17:12 ` Eric Sandeen
2017-04-26 17:45 ` Darrick J. Wong
2017-04-10 22:47 ` [PATCH 2/4] xfs_db: use iocursor type to guess btree geometry if bad magic Darrick J. Wong
2017-04-11 0:03 ` Dave Chinner
2017-04-11 0:19 ` Darrick J. Wong
2017-04-11 0:20 ` Darrick J. Wong [this message]
2017-04-26 17:48 ` [PATCH v2 " Eric Sandeen
2017-04-26 18:25 ` Darrick J. Wong
2017-04-26 18:41 ` Eric Sandeen
2017-04-26 18:43 ` Darrick J. Wong
2017-04-26 18:47 ` [PATCH v3 " Eric Sandeen
2017-04-26 19:11 ` Darrick J. Wong
2017-04-10 22:47 ` [PATCH 3/4] xfs_db: complain about dir/attr blocks with bad magics Darrick J. Wong
2017-04-11 21:42 ` Darrick J. Wong
2017-04-10 22:48 ` [PATCH 4/4] xfs_db: dump metadata btrees via 'btdump' Darrick J. Wong
2017-04-26 19:50 ` Eric Sandeen
2017-04-26 20:27 ` Darrick J. Wong
2017-04-26 20:36 ` [PATCH v2 " Darrick J. Wong
2017-04-26 21:35 ` Eric Sandeen
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20170411002012.GB5094@birch.djwong.org \
--to=darrick.wong@oracle.com \
--cc=linux-xfs@vger.kernel.org \
--cc=sandeen@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox