]> git.apps.os.sepia.ceph.com Git - xfsprogs-dev.git/commitdiff
xfs_repair: drop all the metadata directory files during pass 4
authorDarrick J. Wong <djwong@kernel.org>
Thu, 21 Nov 2024 00:24:21 +0000 (16:24 -0800)
committerDarrick J. Wong <djwong@kernel.org>
Tue, 24 Dec 2024 02:01:28 +0000 (18:01 -0800)
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>
Reviewed-by: Christoph Hellwig <hch@lst.de>
repair/dinode.c
repair/scan.c

index 8148cdbc4f10ad7000d06fe7d08a283d64626484..2185214ac41bdfa07d74c8314b0a2b23c1410f54 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;
        }
@@ -3123,6 +3123,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 0fec7c222ff15604d8675b15d4e1288ac0acb1ae..ed73de4b2477bf8fee414ac4f6ddfa9eb930fc93 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);