]> git.ipfire.org Git - thirdparty/xfsprogs-dev.git/commitdiff
xfs_db: support dumping realtime group data and superblocks
authorDarrick J. Wong <djwong@kernel.org>
Thu, 21 Nov 2024 00:24:37 +0000 (16:24 -0800)
committerDarrick J. Wong <djwong@kernel.org>
Tue, 24 Dec 2024 02:01:33 +0000 (18:01 -0800)
Allow dumping of realtime device superblocks and the new fields in the
primary superblock that were added for rtgroups support.

Signed-off-by: "Darrick J. Wong" <djwong@kernel.org>
Reviewed-by: Christoph Hellwig <hch@lst.de>
db/Makefile
db/command.c
db/field.c
db/field.h
db/rtgroup.c [new file with mode: 0644]
db/rtgroup.h [new file with mode: 0644]
db/sb.c
db/type.c
db/type.h

index 83389376c36c4678ace19456a852a7404a6afa38..02eeead25b49d04af2d9d5e1206be763f1c35f9d 100644 (file)
@@ -49,6 +49,7 @@ HFILES = \
        output.h \
        print.h \
        quit.h \
+       rtgroup.h \
        sb.h \
        sig.h \
        strvec.h \
index 6cda03e9856d84bb4a3fa6c50757779aeb49877b..1b46c3fec08a0eb49faa01488c79232e9bf475e7 100644 (file)
@@ -39,6 +39,7 @@
 #include "fsmap.h"
 #include "crc.h"
 #include "fuzz.h"
+#include "rtgroup.h"
 
 cmdinfo_t      *cmdtab;
 int            ncmds;
@@ -135,6 +136,7 @@ init_commands(void)
        output_init();
        print_init();
        quit_init();
+       rtsb_init();
        sb_init();
        type_init();
        write_init();
index 946684415f65d3d1e67bc75908b2fb0c4d084505..f70955ef57a3234c577d29d21628e057be22beb1 100644 (file)
@@ -23,6 +23,7 @@
 #include "dir2.h"
 #include "dir2sf.h"
 #include "symlink.h"
+#include "rtgroup.h"
 
 #define        PPOFF(f)        bitize(offsetof(struct xfs_parent_rec, f))
 const field_t          parent_flds[] = {
@@ -52,6 +53,13 @@ const ftattr_t       ftattrtab[] = {
        { FLDT_AGNUMBER, "agnumber", fp_num, "%u", SI(bitsz(xfs_agnumber_t)),
          FTARG_DONULL, NULL, NULL },
 
+       { FLDT_RGBLOCK, "rgblock", fp_num, "%u", SI(bitsz(xfs_rgblock_t)),
+         FTARG_DONULL, NULL, NULL },
+       { FLDT_RTXLEN, "rtxlen", fp_num, "%u", SI(bitsz(xfs_rtxlen_t)),
+         FTARG_DONULL, NULL, NULL },
+       { FLDT_RGNUMBER, "rgnumber", fp_num, "%u", SI(bitsz(xfs_rgnumber_t)),
+         FTARG_DONULL, NULL, NULL },
+
 /* attr fields */
        { FLDT_ATTR, "attr", NULL, (char *)attr_flds, attr_size, FTARG_SIZE,
          NULL, attr_flds },
@@ -357,6 +365,8 @@ const ftattr_t      ftattrtab[] = {
          NULL, NULL },
        { FLDT_SB, "sb", NULL, (char *)sb_flds, sb_size, FTARG_SIZE, NULL,
          sb_flds },
+       { FLDT_RTSB, "rtsb", NULL, (char *)rtsb_flds, rtsb_size, FTARG_SIZE,
+         NULL, rtsb_flds },
 
 /* CRC enabled symlink */
        { FLDT_SYMLINK_CRC, "symlink", NULL, (char *)symlink_crc_flds,
index 9746676a6c7ac9dba495373f06e0cf9caccc8a52..8797a75f669246d29543d85fed16519b7dda1bc9 100644 (file)
@@ -15,6 +15,10 @@ typedef enum fldt    {
        FLDT_AGINONN,
        FLDT_AGNUMBER,
 
+       FLDT_RGBLOCK,
+       FLDT_RTXLEN,
+       FLDT_RGNUMBER,
+
        /* attr fields */
        FLDT_ATTR,
        FLDT_ATTR_BLKINFO,
@@ -167,6 +171,7 @@ typedef enum fldt   {
        FLDT_QCNT,
        FLDT_QWARNCNT,
        FLDT_SB,
+       FLDT_RTSB,
 
        /* CRC enabled symlink */
        FLDT_SYMLINK_CRC,
diff --git a/db/rtgroup.c b/db/rtgroup.c
new file mode 100644 (file)
index 0000000..5cda1a4
--- /dev/null
@@ -0,0 +1,100 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Copyright (c) 2022-2024 Oracle.  All Rights Reserved.
+ * Author: Darrick J. Wong <djwong@kernel.org>
+ */
+#include "libxfs.h"
+#include "libxlog.h"
+#include "command.h"
+#include "type.h"
+#include "faddr.h"
+#include "fprint.h"
+#include "field.h"
+#include "io.h"
+#include "sb.h"
+#include "bit.h"
+#include "output.h"
+#include "init.h"
+#include "rtgroup.h"
+
+#define uuid_equal(s,d)                (platform_uuid_compare((s),(d)) == 0)
+
+static int     rtsb_f(int argc, char **argv);
+static void     rtsb_help(void);
+
+static const cmdinfo_t rtsb_cmd =
+       { "rtsb", NULL, rtsb_f, 0, 0, 1, "",
+         N_("set current address to realtime sb header"), rtsb_help };
+
+void
+rtsb_init(void)
+{
+       if (xfs_has_rtgroups(mp))
+               add_command(&rtsb_cmd);
+}
+
+#define        OFF(f)  bitize(offsetof(struct xfs_rtsb, rsb_ ## f))
+#define        SZC(f)  szcount(struct xfs_rtsb, rsb_ ## f)
+const field_t  rtsb_flds[] = {
+       { "magicnum", FLDT_UINT32X, OI(OFF(magicnum)), C1, 0, TYP_NONE },
+       { "crc", FLDT_CRC, OI(OFF(crc)), C1, 0, TYP_NONE },
+       { "pad", FLDT_UINT32X, OI(OFF(pad)), C1, 0, TYP_NONE },
+       { "fname", FLDT_CHARNS, OI(OFF(fname)), CI(SZC(fname)), 0, TYP_NONE },
+       { "uuid", FLDT_UUID, OI(OFF(uuid)), C1, 0, TYP_NONE },
+       { "meta_uuid", FLDT_UUID, OI(OFF(meta_uuid)), C1, 0, TYP_NONE },
+       { NULL }
+};
+
+const field_t  rtsb_hfld[] = {
+       { "", FLDT_RTSB, OI(0), C1, 0, TYP_NONE },
+       { NULL }
+};
+
+static void
+rtsb_help(void)
+{
+       dbprintf(_(
+"\n"
+" seek to realtime superblock\n"
+"\n"
+" Example:\n"
+"\n"
+" 'rtsb - set location to realtime superblock, set type to 'rtsb'\n"
+"\n"
+" Located in the first block of the realtime volume, the rt superblock\n"
+" contains the base information for the realtime section of a filesystem.\n"
+"\n"
+));
+}
+
+static int
+rtsb_f(
+       int             argc,
+       char            **argv)
+{
+       int             c;
+
+       while ((c = getopt(argc, argv, "")) != -1) {
+               switch (c) {
+               default:
+                       rtsb_help();
+                       return 0;
+               }
+       }
+
+       cur_agno = NULLAGNUMBER;
+
+       ASSERT(typtab[TYP_RTSB].typnm == TYP_RTSB);
+       set_rt_cur(&typtab[TYP_RTSB], XFS_RTSB_DADDR, XFS_FSB_TO_BB(mp, 1),
+                       DB_RING_ADD, NULL);
+       return 0;
+}
+
+int
+rtsb_size(
+       void    *obj,
+       int     startoff,
+       int     idx)
+{
+       return bitize(mp->m_sb.sb_blocksize);
+}
diff --git a/db/rtgroup.h b/db/rtgroup.h
new file mode 100644 (file)
index 0000000..85960a3
--- /dev/null
@@ -0,0 +1,15 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Copyright (c) 2022-2024 Oracle.  All Rights Reserved.
+ * Author: Darrick J. Wong <djwong@kernel.org>
+ */
+#ifndef DB_RTGROUP_H_
+#define DB_RTGROUP_H_
+
+extern const struct field      rtsb_flds[];
+extern const struct field      rtsb_hfld[];
+
+extern void    rtsb_init(void);
+extern int     rtsb_size(void *obj, int startoff, int idx);
+
+#endif /* DB_RTGROUP_H_ */
diff --git a/db/sb.c b/db/sb.c
index fa15b429ecbefab73e7ce4977ecb5008b885fd02..de248c10cb27f5cb2bc9f99e7a585012641ab91e 100644 (file)
--- a/db/sb.c
+++ b/db/sb.c
@@ -127,6 +127,14 @@ const field_t      sb_flds[] = {
        { "meta_uuid", FLDT_UUID, OI(OFF(meta_uuid)), C1, 0, TYP_NONE },
        { "metadirino", FLDT_INO, OI(OFF(metadirino)), metadirfld_count,
                FLD_COUNT, TYP_INODE },
+       { "rgcount", FLDT_RGNUMBER, OI(OFF(rgcount)), metadirfld_count,
+               FLD_COUNT, TYP_NONE },
+       { "rgextents", FLDT_RTXLEN, OI(OFF(rgextents)), metadirfld_count,
+               FLD_COUNT, TYP_NONE },
+       { "rgblklog", FLDT_UINT8D, OI(OFF(rgblklog)), metadirfld_count,
+               FLD_COUNT, TYP_NONE },
+       { "pad", FLDT_UINT8X, OI(OFF(pad)), metadirfld_count,
+               FLD_COUNT, TYP_NONE },
        { NULL }
 };
 
index efe7044569d3576f0e4824bc65bae76f7cae4141..d875c0c636553b851cde8fe3feaececd1d3cdf35 100644 (file)
--- a/db/type.c
+++ b/db/type.c
@@ -28,6 +28,7 @@
 #include "text.h"
 #include "symlink.h"
 #include "fuzz.h"
+#include "rtgroup.h"
 
 static const typ_t     *findtyp(char *name);
 static int             type_f(int argc, char **argv);
@@ -60,6 +61,7 @@ static const typ_t    __typtab[] = {
        { TYP_LOG, "log", NULL, NULL, NULL, TYP_F_NO_CRC_OFF },
        { TYP_RTBITMAP, "rtbitmap", handle_text, NULL, NULL, TYP_F_NO_CRC_OFF },
        { TYP_RTSUMMARY, "rtsummary", handle_text, NULL, NULL, TYP_F_NO_CRC_OFF },
+       { TYP_RTSB, "rtsb", handle_struct, rtsb_hfld, NULL, TYP_F_NO_CRC_OFF },
        { TYP_SB, "sb", handle_struct, sb_hfld, NULL, TYP_F_NO_CRC_OFF },
        { TYP_SYMLINK, "symlink", handle_string, NULL, NULL, TYP_F_NO_CRC_OFF },
        { TYP_TEXT, "text", handle_text, NULL, NULL, TYP_F_NO_CRC_OFF },
@@ -102,6 +104,8 @@ static const typ_t  __typtab_crc[] = {
        { TYP_LOG, "log", NULL, NULL, NULL, TYP_F_NO_CRC_OFF },
        { TYP_RTBITMAP, "rtbitmap", handle_text, NULL, NULL, TYP_F_NO_CRC_OFF },
        { TYP_RTSUMMARY, "rtsummary", handle_text, NULL, NULL, TYP_F_NO_CRC_OFF },
+       { TYP_RTSB, "rtsb", handle_struct, rtsb_hfld, &xfs_rtsb_buf_ops,
+               XFS_SB_CRC_OFF },
        { TYP_SB, "sb", handle_struct, sb_hfld, &xfs_sb_buf_ops,
                XFS_SB_CRC_OFF },
        { TYP_SYMLINK, "symlink", handle_struct, symlink_crc_hfld,
@@ -146,6 +150,8 @@ static const typ_t  __typtab_spcrc[] = {
        { TYP_LOG, "log", NULL, NULL, NULL, TYP_F_NO_CRC_OFF },
        { TYP_RTBITMAP, "rtbitmap", handle_text, NULL, NULL, TYP_F_NO_CRC_OFF },
        { TYP_RTSUMMARY, "rtsummary", handle_text, NULL, NULL, TYP_F_NO_CRC_OFF },
+       { TYP_RTSB, "rtsb", handle_struct, rtsb_hfld, &xfs_rtsb_buf_ops,
+               XFS_SB_CRC_OFF },
        { TYP_SB, "sb", handle_struct, sb_hfld, &xfs_sb_buf_ops,
                XFS_SB_CRC_OFF },
        { TYP_SYMLINK, "symlink", handle_struct, symlink_crc_hfld,
index 397dcf5464c6c884787ef2e79b845a732ad5aa61..d4efa4b0fab541a414d7fce733124e7492e397da 100644 (file)
--- a/db/type.h
+++ b/db/type.h
@@ -30,6 +30,7 @@ typedef enum typnm
        TYP_LOG,
        TYP_RTBITMAP,
        TYP_RTSUMMARY,
+       TYP_RTSB,
        TYP_SB,
        TYP_SYMLINK,
        TYP_TEXT,