]> git.ipfire.org Git - thirdparty/xfsprogs-dev.git/commitdiff
xfs_db: report absolute maxlevels for each btree type
authorDarrick J. Wong <djwong@kernel.org>
Wed, 18 May 2022 02:48:12 +0000 (22:48 -0400)
committerEric Sandeen <sandeen@sandeen.net>
Wed, 18 May 2022 02:48:12 +0000 (22:48 -0400)
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>
Reviewed-by: Chandan Babu R <chandan.babu@oracle.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
db/btheight.c
libxfs/libxfs_api_defs.h
man/man8/xfs_db.8

index e4cd4edabe8d9d676d039d57dfa4baeb7ef1ed61..0b421ab50a3a7610c34d996c43afc2ae5e284be9 100644 (file)
@@ -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 @@ out:
 #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;
index 0862d4b09f7d375b638442e9041c3522ed6aa9af..8abbd2310acd54e1e13aa4bb83dc4cb3f14a5c72 100644 (file)
@@ -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
 
 #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
 #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
 #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
index 55ac3487fca62aa41beacb51d39680eb31db973e..1a2bb7e98fb0961f9df2726486e77adb94e74f69 100644 (file)
@@ -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.