All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Darrick J. Wong" <djwong@kernel.org>
To: sandeen@sandeen.net, djwong@kernel.org
Cc: linux-xfs@vger.kernel.org
Subject: [PATCH 34/48] xfs_db: report absolute maxlevels for each btree type
Date: Wed, 19 Jan 2022 16:26:19 -0800	[thread overview]
Message-ID: <164263837932.865554.2100881563371751286.stgit@magnolia> (raw)
In-Reply-To: <164263819185.865554.6000499997543946756.stgit@magnolia>

From: Darrick J. Wong <djwong@kernel.org>

Augment the xfs_db btheight command so that the debugger can display the
absolute maximum btree height for each btree type.

Signed-off-by: Darrick J. Wong <djwong@kernel.org>
---
 db/btheight.c            |   73 ++++++++++++++++++++++++++++++++++++++++------
 libxfs/libxfs_api_defs.h |    5 +++
 man/man8/xfs_db.8        |    5 +++
 3 files changed, 72 insertions(+), 11 deletions(-)


diff --git a/db/btheight.c b/db/btheight.c
index e4cd4eda..0b421ab5 100644
--- a/db/btheight.c
+++ b/db/btheight.c
@@ -24,16 +24,45 @@ static int rmap_maxrecs(struct xfs_mount *mp, int blocklen, int leaf)
 
 struct btmap {
 	const char	*tag;
+	unsigned int	(*maxlevels)(void);
 	int		(*maxrecs)(struct xfs_mount *mp, int blocklen,
 				   int leaf);
 } maps[] = {
-	{"bnobt", libxfs_allocbt_maxrecs},
-	{"cntbt", libxfs_allocbt_maxrecs},
-	{"inobt", libxfs_inobt_maxrecs},
-	{"finobt", libxfs_inobt_maxrecs},
-	{"bmapbt", libxfs_bmbt_maxrecs},
-	{"refcountbt", refc_maxrecs},
-	{"rmapbt", rmap_maxrecs},
+	{
+		.tag		= "bnobt",
+		.maxlevels	= libxfs_allocbt_maxlevels_ondisk,
+		.maxrecs	= libxfs_allocbt_maxrecs,
+	},
+	{
+		.tag		= "cntbt",
+		.maxlevels	= libxfs_allocbt_maxlevels_ondisk,
+		.maxrecs	= libxfs_allocbt_maxrecs,
+	},
+	{
+		.tag		= "inobt",
+		.maxlevels	= libxfs_iallocbt_maxlevels_ondisk,
+		.maxrecs	= libxfs_inobt_maxrecs,
+	},
+	{
+		.tag		= "finobt",
+		.maxlevels	= libxfs_iallocbt_maxlevels_ondisk,
+		.maxrecs	= libxfs_inobt_maxrecs,
+	},
+	{
+		.tag		= "bmapbt",
+		.maxlevels	= libxfs_bmbt_maxlevels_ondisk,
+		.maxrecs	= libxfs_bmbt_maxrecs,
+	},
+	{
+		.tag		= "refcountbt",
+		.maxlevels	= libxfs_refcountbt_maxlevels_ondisk,
+		.maxrecs	= refc_maxrecs,
+	},
+	{
+		.tag		= "rmapbt",
+		.maxlevels	= libxfs_rmapbt_maxlevels_ondisk,
+		.maxrecs	= rmap_maxrecs,
+	},
 };
 
 static void
@@ -55,6 +84,7 @@ btheight_help(void)
 "   -n -- Number of records we want to store.\n"
 "   -w max -- Show only the best case scenario.\n"
 "   -w min -- Show only the worst case scenario.\n"
+"   -w absmax -- Print the maximum possible btree height for all filesystems.\n"
 "\n"
 " Supported btree types:\n"
 "   all "
@@ -232,6 +262,22 @@ _("%s: pointer size must be less than selected block size (%u bytes).\n"),
 #define REPORT_DEFAULT	(-1U)
 #define REPORT_MAX	(1 << 0)
 #define REPORT_MIN	(1 << 1)
+#define REPORT_ABSMAX	(1 << 2)
+
+static void
+report_absmax(const char *tag)
+{
+	struct btmap	*m;
+	int		i;
+
+	for (i = 0, m = maps; i < ARRAY_SIZE(maps); i++, m++) {
+		if (!strcmp(m->tag, tag)) {
+			printf("%s: %u\n", tag, m->maxlevels());
+			return;
+		}
+	}
+	printf(_("%s: Don't know how to report max height.\n"), tag);
+}
 
 static void
 report(
@@ -243,6 +289,11 @@ report(
 	unsigned int		records_per_block[2];
 	int			ret;
 
+	if (report_what == REPORT_ABSMAX) {
+		report_absmax(tag);
+		return;
+	}
+
 	ret = construct_records_per_block(tag, blocksize, records_per_block);
 	if (ret)
 		return;
@@ -344,6 +395,8 @@ btheight_f(
 				report_what = REPORT_MIN;
 			else if (!strcmp(optarg, "max"))
 				report_what = REPORT_MAX;
+			else if (!strcmp(optarg, "absmax"))
+				report_what = REPORT_ABSMAX;
 			else {
 				btheight_help();
 				return 0;
@@ -355,20 +408,20 @@ btheight_f(
 		}
 	}
 
-	if (nr_records == 0) {
+	if (report_what != REPORT_ABSMAX && nr_records == 0) {
 		fprintf(stderr,
 _("Number of records must be greater than zero.\n"));
 		return 0;
 	}
 
-	if (blocksize > INT_MAX) {
+	if (report_what != REPORT_ABSMAX && blocksize > INT_MAX) {
 		fprintf(stderr,
 _("The largest block size this command will consider is %u bytes.\n"),
 			INT_MAX);
 		return 0;
 	}
 
-	if (blocksize < 128) {
+	if (report_what != REPORT_ABSMAX && blocksize < 128) {
 		fprintf(stderr,
 _("The smallest block size this command will consider is 128 bytes.\n"));
 		return 0;
diff --git a/libxfs/libxfs_api_defs.h b/libxfs/libxfs_api_defs.h
index 0862d4b0..8abbd231 100644
--- a/libxfs/libxfs_api_defs.h
+++ b/libxfs/libxfs_api_defs.h
@@ -23,6 +23,7 @@
 #define xfs_ag_block_count		libxfs_ag_block_count
 
 #define xfs_alloc_ag_max_usable		libxfs_alloc_ag_max_usable
+#define xfs_allocbt_maxlevels_ondisk	libxfs_allocbt_maxlevels_ondisk
 #define xfs_allocbt_maxrecs		libxfs_allocbt_maxrecs
 #define xfs_allocbt_stage_cursor	libxfs_allocbt_stage_cursor
 #define xfs_alloc_fix_freelist		libxfs_alloc_fix_freelist
@@ -39,6 +40,7 @@
 #define xfs_bmapi_read			libxfs_bmapi_read
 #define xfs_bmapi_write			libxfs_bmapi_write
 #define xfs_bmap_last_offset		libxfs_bmap_last_offset
+#define xfs_bmbt_maxlevels_ondisk	libxfs_bmbt_maxlevels_ondisk
 #define xfs_bmbt_maxrecs		libxfs_bmbt_maxrecs
 #define xfs_bmdr_maxrecs		libxfs_bmdr_maxrecs
 
@@ -109,6 +111,7 @@
 #define xfs_highbit32			libxfs_highbit32
 #define xfs_highbit64			libxfs_highbit64
 #define xfs_ialloc_calc_rootino		libxfs_ialloc_calc_rootino
+#define xfs_iallocbt_maxlevels_ondisk	libxfs_iallocbt_maxlevels_ondisk
 #define xfs_idata_realloc		libxfs_idata_realloc
 #define xfs_idestroy_fork		libxfs_idestroy_fork
 #define xfs_iext_lookup_extent		libxfs_iext_lookup_extent
@@ -138,6 +141,7 @@
 #define xfs_refc_block			libxfs_refc_block
 #define xfs_refcountbt_calc_reserves	libxfs_refcountbt_calc_reserves
 #define xfs_refcountbt_init_cursor	libxfs_refcountbt_init_cursor
+#define xfs_refcountbt_maxlevels_ondisk	libxfs_refcountbt_maxlevels_ondisk
 #define xfs_refcountbt_maxrecs		libxfs_refcountbt_maxrecs
 #define xfs_refcountbt_stage_cursor	libxfs_refcountbt_stage_cursor
 #define xfs_refcount_get_rec		libxfs_refcount_get_rec
@@ -146,6 +150,7 @@
 #define xfs_rmap_alloc			libxfs_rmap_alloc
 #define xfs_rmapbt_calc_reserves	libxfs_rmapbt_calc_reserves
 #define xfs_rmapbt_init_cursor		libxfs_rmapbt_init_cursor
+#define xfs_rmapbt_maxlevels_ondisk	libxfs_rmapbt_maxlevels_ondisk
 #define xfs_rmapbt_maxrecs		libxfs_rmapbt_maxrecs
 #define xfs_rmapbt_stage_cursor		libxfs_rmapbt_stage_cursor
 #define xfs_rmap_compare		libxfs_rmap_compare
diff --git a/man/man8/xfs_db.8 b/man/man8/xfs_db.8
index 55ac3487..1a2bb7e9 100644
--- a/man/man8/xfs_db.8
+++ b/man/man8/xfs_db.8
@@ -402,7 +402,7 @@ If the cursor points at an inode, dump the extended attribute block mapping btre
 Dump all keys and pointers in intermediate btree nodes, and all records in leaf btree nodes.
 .RE
 .TP
-.BI "btheight [\-b " blksz "] [\-n " recs "] [\-w " max "|\-w " min "] btree types..."
+.BI "btheight [\-b " blksz "] [\-n " recs "] [\-w " max "|" min "|" absmax "] btree types..."
 For a given number of btree records and a btree type, report the number of
 records and blocks for each level of the btree, and the total number of blocks.
 The btree type must be given after the options.
@@ -435,6 +435,9 @@ The default is the filesystem block size.
 is used to specify the number of records to store.
 This argument is required.
 .TP
+.B \-w absmax
+shows the maximum possible height for the given btree types.
+.TP
 .B \-w max
 shows only the best case scenario, which is when the btree blocks are
 maximally loaded.


  parent reply	other threads:[~2022-01-20  0:26 UTC|newest]

Thread overview: 51+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-01-20  0:23 [PATCHSET 00/48] xfsprogs: sync libxfs with 5.16 Darrick J. Wong
2022-01-20  0:23 ` [PATCH 01/48] xfs: formalize the process of holding onto resources across a defer roll Darrick J. Wong
2022-01-20  0:23 ` [PATCH 02/48] xfs: port the defer ops capture and continue to resource capture Darrick J. Wong
2022-01-20  0:23 ` [PATCH 03/48] xfs: fix maxlevels comparisons in the btree staging code Darrick J. Wong
2022-01-20  0:23 ` [PATCH 04/48] xfs: remove xfs_btree_cur_t typedef Darrick J. Wong
2022-01-20  0:23 ` [PATCH 05/48] xfs: check that bc_nlevels never overflows Darrick J. Wong
2022-01-20  0:23 ` [PATCH 06/48] xfs: remove the xfs_dinode_t typedef Darrick J. Wong
2022-01-20  0:23 ` [PATCH 07/48] xfs: remove the xfs_dsb_t typedef Darrick J. Wong
2022-01-20  0:23 ` [PATCH 08/48] xfs: remove the xfs_dqblk_t typedef Darrick J. Wong
2022-01-20  0:24 ` [PATCH 09/48] xfs: fold perag loop iteration logic into helper function Darrick J. Wong
2022-01-20  0:24 ` [PATCH 10/48] xfs: rename the next_agno perag iteration variable Darrick J. Wong
2022-01-20  0:24 ` [PATCH 11/48] xfs: terminate perag iteration reliably on agcount Darrick J. Wong
2022-01-20  0:24 ` [PATCH 12/48] xfs: fix perag reference leak on iteration race with growfs Darrick J. Wong
2022-01-20  0:24 ` [PATCH 13/48] xfs: remove xfs_btree_cur.bc_blocklog Darrick J. Wong
2022-01-20  0:24 ` [PATCH 14/48] xfs: reduce the size of nr_ops for refcount btree cursors Darrick J. Wong
2022-01-20  0:24 ` [PATCH 15/48] xfs: prepare xfs_btree_cur for dynamic cursor heights Darrick J. Wong
2022-01-20  0:24 ` [PATCH 16/48] xfs: rearrange xfs_btree_cur fields for better packing Darrick J. Wong
2022-01-20  0:24 ` [PATCH 17/48] xfs: refactor btree cursor allocation function Darrick J. Wong
2022-01-20  0:24 ` [PATCH 18/48] xfs: encode the max btree height in the cursor Darrick J. Wong
2022-01-20  0:24 ` [PATCH 19/48] xfs: dynamically allocate cursors based on maxlevels Darrick J. Wong
2022-01-20  0:25 ` [PATCH 20/48] xfs: rename m_ag_maxlevels to m_allocbt_maxlevels Darrick J. Wong
2022-01-20  0:25 ` [PATCH 21/48] xfs: compute maximum AG btree height for critical reservation calculation Darrick J. Wong
2022-01-20  0:25 ` [PATCH 22/48] xfs: clean up xfs_btree_{calc_size,compute_maxlevels} Darrick J. Wong
2022-01-20  0:25 ` [PATCH 23/48] xfs: compute the maximum height of the rmap btree when reflink enabled Darrick J. Wong
2022-01-20  0:25 ` [PATCH 24/48] xfs_db: fix metadump level comparisons Darrick J. Wong
2022-04-28  3:02   ` Eric Sandeen
2022-01-20  0:25 ` [PATCH 25/48] xfs_db: warn about suspicious finobt trees when metadumping Darrick J. Wong
2022-01-20  0:25 ` [PATCH 26/48] xfs_db: stop using XFS_BTREE_MAXLEVELS Darrick J. Wong
2022-01-20  0:25 ` [PATCH 27/48] xfs_repair: fix AG header btree level comparisons Darrick J. Wong
2022-04-28  3:03   ` Eric Sandeen
2022-01-20  0:25 ` [PATCH 28/48] xfs_repair: warn about suspicious btree levels in AG headers Darrick J. Wong
2022-01-20  0:25 ` [PATCH 29/48] xfs_repair: stop using XFS_BTREE_MAXLEVELS Darrick J. Wong
2022-01-20  0:25 ` [PATCH 30/48] xfs: kill XFS_BTREE_MAXLEVELS Darrick J. Wong
2022-01-20  0:26 ` [PATCH 31/48] xfs: compute absolute maximum nlevels for each btree type Darrick J. Wong
2022-01-20  0:26 ` [PATCH 32/48] xfs: use separate btree cursor cache " Darrick J. Wong
2022-01-20  0:26 ` [PATCH 33/48] xfs_db: support computing btheight for all cursor types Darrick J. Wong
2022-01-20  0:26 ` Darrick J. Wong [this message]
2022-01-20  0:26 ` [PATCH 35/48] libxfs: remove kmem_zone_destroy Darrick J. Wong
2022-01-20  0:26 ` [PATCH 36/48] libxfs: remove kmem_zone_init Darrick J. Wong
2022-01-20  0:26 ` [PATCH 37/48] xfs: remove kmem_zone typedef Darrick J. Wong
2022-01-20  0:26 ` [PATCH 38/48] xfs: rename _zone variables to _cache Darrick J. Wong
2022-01-20  0:26 ` [PATCH 39/48] libxfs: rename all the other " Darrick J. Wong
2022-01-20  0:26 ` [PATCH 40/48] libxfs: change zone to cache for all kmem functions Darrick J. Wong
2022-01-20  0:26 ` [PATCH 41/48] xfs: compact deferred intent item structures Darrick J. Wong
2022-01-20  0:27 ` [PATCH 42/48] xfs: create slab caches for frequently-used deferred items Darrick J. Wong
2022-01-20  0:27 ` [PATCH 43/48] xfs: rename xfs_bmap_add_free to xfs_free_extent_later Darrick J. Wong
2022-01-20  0:27 ` [PATCH 44/48] xfs: reduce the size of struct xfs_extent_free_item Darrick J. Wong
2022-01-20  0:27 ` [PATCH 45/48] xfs: remove unused parameter from refcount code Darrick J. Wong
2022-01-20  0:27 ` [PATCH 46/48] xfs: use swap() to make dabtree code cleaner Darrick J. Wong
2022-01-20  0:27 ` [PATCH 47/48] xfs: Fix the free logic of state in xfs_attr_node_hasname Darrick J. Wong
2022-01-20  0:27 ` [PATCH 48/48] libxfs: remove kernel stubs from xfs_shared.h Darrick J. Wong

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=164263837932.865554.2100881563371751286.stgit@magnolia \
    --to=djwong@kernel.org \
    --cc=linux-xfs@vger.kernel.org \
    --cc=sandeen@sandeen.net \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.