]> www.infradead.org Git - users/hch/xfsprogs.git/commitdiff
xfs_repair: reject regular directory dirents that point to metadata fieles
authorDarrick J. Wong <djwong@kernel.org>
Sat, 13 May 2023 00:00:43 +0000 (17:00 -0700)
committerDarrick J. Wong <djwong@kernel.org>
Wed, 22 Nov 2023 23:03:31 +0000 (15:03 -0800)
If a directory that's in the regular (non-metadata) directory tree has
an entry that points to a metadata file, trash the dirent.  Files are
not allowed to cross between the two trees.

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

index 9f10fde09a1bfd439ae65c7a61ef23c220f2baf3..b4ebcd56d576aac26d659225060e9bdaca54e732 100644 (file)
@@ -140,6 +140,7 @@ static bool
 is_meta_ino(
        struct xfs_mount        *mp,
        xfs_ino_t               dirino,
+       const struct xfs_dinode *dip,
        xfs_ino_t               lino,
        char                    **junkreason)
 {
@@ -155,6 +156,9 @@ is_meta_ino(
                reason = _("group quota");
        else if (lino == mp->m_sb.sb_pquotino)
                reason = _("project quota");
+       else if (dip->di_version >= 3 &&
+                (dip->di_flags2 & cpu_to_be64(XFS_DIFLAG2_METADIR)))
+               reason = _("metadata directory file");
 
        if (reason)
                *junkreason = reason;
@@ -252,7 +256,7 @@ process_sf_dir2(
                } else if (!libxfs_verify_dir_ino(mp, lino)) {
                        junkit = 1;
                        junkreason = _("invalid");
-               } else if (is_meta_ino(mp, ino, lino, &junkreason)) {
+               } else if (is_meta_ino(mp, ino, dip, lino, &junkreason)) {
                        /*
                         * Directories that are not in the metadir tree should
                         * not be linking to metadata files.
@@ -714,7 +718,7 @@ process_dir2_data(
                         * directory since it's still structurally intact.
                         */
                        clearreason = _("invalid");
-               } else if (is_meta_ino(mp, ino, ent_ino, &clearreason)) {
+               } else if (is_meta_ino(mp, ino, dip, ent_ino, &clearreason)) {
                        /*
                         * Directories that are not in the metadir tree should
                         * not be linking to metadata files.