]> git.ipfire.org Git - thirdparty/xfsprogs-dev.git/commitdiff
xfs_db: display di_metatype
authorDarrick J. Wong <djwong@kernel.org>
Thu, 21 Nov 2024 00:24:16 +0000 (16:24 -0800)
committerDarrick J. Wong <djwong@kernel.org>
Tue, 24 Dec 2024 02:01:26 +0000 (18:01 -0800)
Print the metadata file type if available.

Signed-off-by: "Darrick J. Wong" <djwong@kernel.org>
Reviewed-by: Christoph Hellwig <hch@lst.de>
db/field.c
db/field.h
db/inode.c
db/inode.h

index a61ccc9ef6d072c7350bc536163a645fabfc93d1..946684415f65d3d1e67bc75908b2fb0c4d084505 100644 (file)
@@ -212,6 +212,8 @@ const ftattr_t      ftattrtab[] = {
          SI(bitsz(struct xfs_dinode)), 0, NULL, inode_core_flds },
        { FLDT_DINODE_FMT, "dinode_fmt", fp_dinode_fmt, NULL,
          SI(bitsz(int8_t)), 0, NULL, NULL },
+       { FLDT_DINODE_METATYPE, "metatype", fp_metatype, NULL,
+         SI(bitsz(uint16_t)), 0, NULL, NULL },
        { FLDT_DINODE_U, "dinode_u", NULL, (char *)inode_u_flds, inode_u_size,
          FTARG_SIZE|FTARG_OKEMPTY, NULL, inode_u_flds },
        { FLDT_DINODE_V3, "dinode_v3", NULL, (char *)inode_v3_flds,
index b1bfdbed19cea3ccce033dec4162a510f566c81c..9746676a6c7ac9dba495373f06e0cf9caccc8a52 100644 (file)
@@ -95,6 +95,7 @@ typedef enum fldt     {
        FLDT_DINODE_A,
        FLDT_DINODE_CORE,
        FLDT_DINODE_FMT,
+       FLDT_DINODE_METATYPE,
        FLDT_DINODE_U,
        FLDT_DINODE_V3,
 
index 0aff68083508cb3570a36efe46c4b112ad2b141a..07efbb4902be089cc19bb5844a5192bea5e0ccc1 100644 (file)
@@ -25,6 +25,7 @@ static int    inode_a_offset(void *obj, int startoff, int idx);
 static int     inode_a_sfattr_count(void *obj, int startoff);
 static int     inode_core_nlinkv2_count(void *obj, int startoff);
 static int     inode_core_onlink_count(void *obj, int startoff);
+static int     inode_core_metatype_count(void *obj, int startoff);
 static int     inode_core_projid_count(void *obj, int startoff);
 static int     inode_core_nlinkv1_count(void *obj, int startoff);
 static int     inode_core_v3_pad_count(void *obj, int startoff);
@@ -94,6 +95,8 @@ const field_t inode_core_flds[] = {
          FLD_COUNT, TYP_NONE },
        { "onlink", FLDT_UINT16D, OI(COFF(metatype)), inode_core_onlink_count,
          FLD_COUNT, TYP_NONE },
+       { "metatype", FLDT_DINODE_METATYPE, OI(COFF(metatype)),
+         inode_core_metatype_count, FLD_COUNT, TYP_NONE },
        { "uid", FLDT_UINT32D, OI(COFF(uid)), C1, 0, TYP_NONE },
        { "gid", FLDT_UINT32D, OI(COFF(gid)), C1, 0, TYP_NONE },
        { "nlinkv2", FLDT_UINT32D, OI(COFF(nlink)), inode_core_nlinkv2_count,
@@ -247,9 +250,8 @@ static const char   *dinode_fmt_name[] =
 static const int       dinode_fmt_name_size =
        sizeof(dinode_fmt_name) / sizeof(dinode_fmt_name[0]);
 
-/*ARGSUSED*/
-int
-fp_dinode_fmt(
+static int
+fp_enum_fmt(
        void                    *obj,
        int                     bit,
        int                     count,
@@ -257,26 +259,65 @@ fp_dinode_fmt(
        int                     size,
        int                     arg,
        int                     base,
-       int                     array)
+       int                     array,
+       const char              **names,
+       unsigned int            nr_names)
 {
        int                     bitpos;
-       enum xfs_dinode_fmt     f;
+       int                     f;
        int                     i;
 
        for (i = 0, bitpos = bit; i < count; i++, bitpos += size) {
-               f = (enum xfs_dinode_fmt)getbitval(obj, bitpos, size, BVUNSIGNED);
+               f = getbitval(obj, bitpos, size, BVUNSIGNED);
                if (array)
                        dbprintf("%d:", i + base);
-               if (f < 0 || f >= dinode_fmt_name_size)
-                       dbprintf("%d", (int)f);
+               if (f < 0 || f >= nr_names)
+                       dbprintf("%d", f);
                else
-                       dbprintf("%d (%s)", (int)f, dinode_fmt_name[(int)f]);
+                       dbprintf("%d (%s)", f, names[f]);
                if (i < count - 1)
                        dbprintf(" ");
        }
        return 1;
 }
 
+/*ARGSUSED*/
+int
+fp_dinode_fmt(
+       void                    *obj,
+       int                     bit,
+       int                     count,
+       char                    *fmtstr,
+       int                     size,
+       int                     arg,
+       int                     base,
+       int                     array)
+{
+       return fp_enum_fmt(obj, bit, count, fmtstr, size, arg, base, array,
+                       dinode_fmt_name, dinode_fmt_name_size);
+}
+
+static const char      *metatype_name[] =
+       { "unknown", "dir", "usrquota", "grpquota", "prjquota", "rtbitmap",
+         "rtsummary"
+       };
+static const int       metatype_name_size = ARRAY_SIZE(metatype_name);
+
+int
+fp_metatype(
+       void                    *obj,
+       int                     bit,
+       int                     count,
+       char                    *fmtstr,
+       int                     size,
+       int                     arg,
+       int                     base,
+       int                     array)
+{
+       return fp_enum_fmt(obj, bit, count, fmtstr, size, arg, base, array,
+                       metatype_name, metatype_name_size);
+}
+
 static int
 inode_a_bmbt_count(
        void                    *obj,
@@ -414,7 +455,29 @@ inode_core_onlink_count(
        ASSERT(startoff == 0);
        ASSERT(obj == iocur_top->data);
        dic = obj;
-       return dic->di_version >= 2;
+       if (dic->di_version < 2)
+               return 0;
+       if (dic->di_flags2 & cpu_to_be64(XFS_DIFLAG2_METADATA))
+               return 0;
+       return 1;
+}
+
+static int
+inode_core_metatype_count(
+       void                    *obj,
+       int                     startoff)
+{
+       struct xfs_dinode       *dic;
+
+       ASSERT(startoff == 0);
+       ASSERT(obj == iocur_top->data);
+       dic = obj;
+
+       if (dic->di_version < 3)
+               return 0;
+       if (dic->di_flags2 & cpu_to_be64(XFS_DIFLAG2_METADATA))
+               return 1;
+       return 0;
 }
 
 static int
index 31a2ebbba6a175469a18dcdfd7a0323e6908eb1b..9e4ec1b3833716dc20fde1291a607f13c39952d1 100644 (file)
@@ -16,6 +16,8 @@ extern const struct field     timestamp_flds[];
 
 extern int     fp_dinode_fmt(void *obj, int bit, int count, char *fmtstr,
                              int size, int arg, int base, int array);
+int            fp_metatype(void *obj, int bit, int count, char *fmtstr,
+                             int size, int arg, int base, int array);
 extern int     inode_a_size(void *obj, int startoff, int idx);
 extern void    inode_init(void);
 extern typnm_t inode_next_type(void);