]> www.infradead.org Git - users/hch/xfsprogs.git/commitdiff
fixup xfs-meta-btree
authorChristoph Hellwig <hch@lst.de>
Tue, 12 Nov 2024 09:07:53 +0000 (10:07 +0100)
committerChristoph Hellwig <hch@lst.de>
Tue, 12 Nov 2024 09:14:34 +0000 (10:14 +0100)
db/btdump.c
db/inode.c
db/metadump.c
repair/dinode.c
repair/rmap.c
repair/rtrefcount_repair.c
repair/rtrmap_repair.c

index 31f32a8f7a5f6ef75e3b2a22dd205a45606ce46e..5866421d70a03d5e69457408cbddcaef5d642ac7 100644 (file)
@@ -444,41 +444,43 @@ err:
 static bool
 is_btree_inode(void)
 {
-       struct xfs_dinode       *dip;
+       struct xfs_dinode       *dip = iocur_top->data;
 
-       dip = iocur_top->data;
-       return dip->di_format == XFS_DINODE_FMT_RMAP ||
-              dip->di_format == XFS_DINODE_FMT_REFCOUNT;
+       return dip->di_format == XFS_DINODE_FMT_META_BTREE;
 }
 
 static int
 dump_btree_inode(
        bool                    dump_node_blocks)
 {
+       struct xfs_dinode       *dip = iocur_top->data;
        char                    *prefix;
-       struct xfs_dinode       *dip;
        struct xfs_rtrmap_root  *rtrmap;
        struct xfs_rtrefcount_root *rtrefc;
        int                     level;
        int                     numrecs;
        int                     ret;
 
-       dip = iocur_top->data;
-       switch (dip->di_format) {
-       case XFS_DINODE_FMT_RMAP:
+       if (dip->di_format != XFS_DINODE_FMT_META_BTREE) {
+               dbprintf("Unknown metadata inode format %u\n", dip->di_format);
+               return 0;
+       }
+       switch (be16_to_cpu(dip->di_metatype)) {
+       case XFS_METAFILE_RTRMAP:
                prefix = "u3.rtrmapbt";
                rtrmap = (struct xfs_rtrmap_root *)XFS_DFORK_DPTR(dip);
                level = be16_to_cpu(rtrmap->bb_level);
                numrecs = be16_to_cpu(rtrmap->bb_numrecs);
                break;
-       case XFS_DINODE_FMT_REFCOUNT:
+       case XFS_METAFILE_RTREFCOUNT:
                prefix = "u3.rtrefcbt";
                rtrefc = (struct xfs_rtrefcount_root *)XFS_DFORK_DPTR(dip);
                level = be16_to_cpu(rtrefc->bb_level);
                numrecs = be16_to_cpu(rtrefc->bb_numrecs);
                break;
        default:
-               dbprintf("Unknown metadata inode type %u\n", dip->di_format);
+               dbprintf("Unknown metadata inode type %u\n",
+                       be16_to_cpu(dip->di_metatype));
                return 0;
        }
 
index ad104dbb71b992f2ab0f5f2ccc834d6b0b4fb591..ddc3a4f89870823e9ec69356386aebbe915622f3 100644 (file)
@@ -887,7 +887,7 @@ inode_u_rtrmapbt_count(
        ASSERT(obj == iocur_top->data);
        dip = obj;
        ASSERT((char *)XFS_DFORK_DPTR(dip) - (char *)dip == byteize(startoff));
-       return dip->di_format == XFS_DINODE_FMT_RMAP;
+       return be16_to_cpu(dip->di_metatype) == XFS_METAFILE_RTRMAP;
 }
 
 static int
@@ -901,7 +901,7 @@ inode_u_rtrefcbt_count(
        ASSERT(obj == iocur_top->data);
        dip = obj;
        ASSERT((char *)XFS_DFORK_DPTR(dip) - (char *)dip == byteize(startoff));
-       return dip->di_format == XFS_DINODE_FMT_REFCOUNT;
+       return be16_to_cpu(dip->di_metatype) == XFS_METAFILE_RTREFCOUNT;
 }
 
 int
index 7fb14c25201c6a2df6487a9228983bfff4046103..ad821b4ab94d3f5ca1dd24bbfc81cccf5800efb9 100644 (file)
@@ -2591,11 +2591,11 @@ process_inode_data(
        case XFS_DINODE_FMT_BTREE:
                return process_btinode(dip, XFS_DATA_FORK);
 
-       case XFS_DINODE_FMT_RMAP:
-               return process_rtrmap(dip);
-
-       case XFS_DINODE_FMT_REFCOUNT:
-               return process_rtrefc(dip);
+       case XFS_DINODE_FMT_META_BTREE:
+               if (be16_to_cpu(dip->di_metatype) == XFS_METAFILE_RTRMAP)
+                       return process_rtrmap(dip);
+               if (be16_to_cpu(dip->di_metatype) == XFS_METAFILE_RTREFCOUNT)
+                       return process_rtrefc(dip);
        }
        return 1;
 }
index 30395ef1d26e5445cd98406654ab560a9f60a13b..08826b14d608f5c1f7289a19c1be83b2790e6fd3 100644 (file)
@@ -2064,10 +2064,9 @@ check_dinode_mode_format(
 
        case S_IFREG:
                switch (dinoc->di_format) {
-               case XFS_DINODE_FMT_RMAP:
                case XFS_DINODE_FMT_EXTENTS:
                case XFS_DINODE_FMT_BTREE:
-               case XFS_DINODE_FMT_REFCOUNT:
+               case XFS_DINODE_FMT_META_BTREE:
                        return 0;
                }
                return -1;
@@ -2330,9 +2329,8 @@ _("bad attr fork offset %d in dev inode %" PRIu64 ", should be %d\n"),
                        return 1;
                }
                break;
-       case XFS_DINODE_FMT_RMAP:
-       case XFS_DINODE_FMT_REFCOUNT:
-               if (!(xfs_has_metadir(mp) && xfs_has_parent(mp))) {
+       case XFS_DINODE_FMT_META_BTREE:
+               if (!xfs_has_metadir(mp) || !xfs_has_parent(mp)) {
                        do_warn(
 _("metadata inode %" PRIu64 " type %d cannot have attr fork\n"),
                                lino, dino->di_format);
@@ -2524,13 +2522,20 @@ retry:
                        totblocks, nextents, dblkmap, XFS_DATA_FORK,
                        check_dups, zap_metadata);
                break;
-       case XFS_DINODE_FMT_RMAP:
-               err = process_rtrmap(mp, agno, ino, dino, type, dirty,
+       case XFS_DINODE_FMT_META_BTREE:
+               switch (be16_to_cpu(dino->di_metatype)) {
+               case XFS_METAFILE_RTRMAP:
+                       err = process_rtrmap(mp, agno, ino, dino, type, dirty,
+                                       totblocks, nextents, dblkmap,
+                                       check_dups);
+                       break;
+               case XFS_METAFILE_RTREFCOUNT:
+                       err = process_rtrefc(mp, agno, ino, dino, type, dirty,
                                totblocks, nextents, dblkmap, check_dups);
-               break;
-       case XFS_DINODE_FMT_REFCOUNT:
-               err = process_rtrefc(mp, agno, ino, dino, type, dirty,
-                       totblocks, nextents, dblkmap, check_dups);
+                       break;
+               default:
+                       break;
+               }
                break;
        case XFS_DINODE_FMT_DEV:
                err = 0;
@@ -2591,8 +2596,7 @@ _("would have tried to rebuild inode %"PRIu64" data fork\n"),
                                XFS_DATA_FORK, 0, zap_metadata);
                        break;
                case XFS_DINODE_FMT_DEV:
-               case XFS_DINODE_FMT_RMAP:
-               case XFS_DINODE_FMT_REFCOUNT:
+               case XFS_DINODE_FMT_META_BTREE:
                        err = 0;
                        break;
                default:
index 2debfcbf96271159608756111c544654c68a97b3..adf2edc6466591640f94c0ca503505eb75ef1233 100644 (file)
@@ -1425,11 +1425,10 @@ rtrmaps_verify_btree(
                goto err_rtg;
        }
 
-       if (ip->i_df.if_format != XFS_DINODE_FMT_RMAP) {
+       if (ip->i_metatype != XFS_METAFILE_RTRMAP) {
                do_warn(
-_("rtgroup %u rmap inode has wrong format 0x%x, expected 0x%x\n"),
-                               rgno, ip->i_df.if_format,
-                               XFS_DINODE_FMT_RMAP);
+_("rtgroup %u rmap inode has wrong metatype 0x%x, expected 0x%x\n"),
+                       rgno, ip->i_metatype, XFS_METAFILE_RTRMAP);
                goto err_rtg;
        }
 
@@ -1884,12 +1883,10 @@ check_rtrefcounts(
                goto err_rtg;
        }
 
-       if (ip->i_df.if_format != XFS_DINODE_FMT_REFCOUNT) {
+       if (ip->i_metatype != XFS_METAFILE_RTREFCOUNT) {
                do_warn(
-_("rtgroup %u refcount inode has wrong format 0x%x, expected 0x%x\n"),
-                               rgno,
-                               ip->i_df.if_format,
-                               XFS_DINODE_FMT_REFCOUNT);
+_("rtgroup %u refcount inode has wrong metatype 0x%x, expected 0x%x\n"),
+                       rgno, ip->i_metatype, XFS_METAFILE_RTREFCOUNT);
                goto err_rtg;
        }
 
index 31d075ba9c7cc071ada2883ab31c8733ce193375..e219904cc3a648f413343535c1022ceaa1987b22 100644 (file)
@@ -185,7 +185,7 @@ xrep_rtrefc_build_new_tree(
         * inode locked.
         */
        libxfs_trans_ijoin(sc->tp, sc->ip, 0);
-       ifake->if_fork->if_format = XFS_DINODE_FMT_REFCOUNT;
+       ifake->if_fork->if_format = XFS_DINODE_FMT_META_BTREE;
        error = xrep_rtrefc_btree_load(rr, cur);
        if (error)
                goto err_cur;
index a4c840897161fd76ec70c77d17a2b7ad318f7b48..d1ce986f87728430f0dbbdfe1715e5bf6aeaf2f4 100644 (file)
@@ -190,7 +190,7 @@ xrep_rtrmap_build_new_tree(
         * inode locked.
         */
        libxfs_trans_ijoin(sc->tp, sc->ip, 0);
-       ifake->if_fork->if_format = XFS_DINODE_FMT_RMAP;
+       ifake->if_fork->if_format = XFS_DINODE_FMT_META_BTREE;
        error = xrep_rtrmap_btree_load(rr, cur);
        if (error)
                goto err_cur;