]> www.infradead.org Git - users/hch/xfsprogs.git/commitdiff
xfs_repair: drop all the metadata directory files during pass 4
authorDarrick J. Wong <djwong@kernel.org>
Wed, 3 Jul 2024 21:21:55 +0000 (14:21 -0700)
committerDarrick J. Wong <djwong@kernel.org>
Tue, 30 Jul 2024 00:13:18 +0000 (17:13 -0700)
Drop the entire metadata directory tree during pass 4 so that we can
reinitialize the entire tree in phase 6.  The existing metadata files
(rtbitmap, rtsummary, quotas) will be reattached to the newly rebuilt
directory tree.

Signed-off-by: Darrick J. Wong <djwong@kernel.org>
repair/dinode.c
repair/scan.c

index 39ab4de17ac36fd342ce195d685f1ddd415b3927..6d1549aa66a569b93c824bd69d48b946dadc026f 100644 (file)
@@ -656,7 +656,7 @@ _("illegal state %d in block map %" PRIu64 "\n"),
                                break;
                        }
                }
-               if (collect_rmaps) /* && !check_dups */
+               if (collect_rmaps && !zap_metadata) /* && !check_dups */
                        rmap_add_rec(mp, ino, whichfork, &irec);
                *tot += irec.br_blockcount;
        }
@@ -3120,6 +3120,18 @@ _("Bad CoW extent size %u on inode %" PRIu64 ", "),
         */
        *dirty += process_check_inode_nlink_version(dino, lino);
 
+       /*
+        * The entire metadata directory tree will be rebuilt during phase 6.
+        * Therefore, if we're at the end of phase 4 and this is a metadata
+        * file, zero the ondisk inode and the incore state.
+        */
+       if (check_dups && zap_metadata && !no_modify) {
+               clear_dinode(mp, dino, lino);
+               *dirty += 1;
+               *used = is_free;
+               *isa_dir = 0;
+       }
+
        return retval;
 
 clear_bad_out:
index 81bb82c6785b98ac08adad993f55343c37ffaad4..a8499e3aa2b08c05af691982b5bee6b20cf2abd4 100644 (file)
@@ -418,7 +418,7 @@ _("bad state %d, inode %" PRIu64 " bmap block 0x%" PRIx64 "\n"),
        numrecs = be16_to_cpu(block->bb_numrecs);
 
        /* Record BMBT blocks in the reverse-mapping data. */
-       if (check_dups && collect_rmaps) {
+       if (check_dups && collect_rmaps && !zap_metadata) {
                agno = XFS_FSB_TO_AGNO(mp, bno);
                pthread_mutex_lock(&ag_locks[agno].lock);
                rmap_add_bmbt_rec(mp, ino, whichfork, bno);