]> www.infradead.org Git - users/hch/xfs.git/commitdiff
xfs: metadata files can have xattrs if metadir is enabled
authorDarrick J. Wong <djwong@kernel.org>
Wed, 29 May 2024 04:11:04 +0000 (21:11 -0700)
committerDarrick J. Wong <djwong@kernel.org>
Thu, 1 Aug 2024 00:10:04 +0000 (17:10 -0700)
If metadata directory trees are enabled, it's possible that some future
metadata file might want to store information in extended attributes.
Or, if parent pointers are enabled, then children of the metadir tree
need parent pointers.  Either way, we start allowing xattr data when
metadir is enabled, so we now need check and repair to examine attr
forks for metadata files on metadir filesystems.

Signed-off-by: Darrick J. Wong <djwong@kernel.org>
fs/xfs/scrub/common.c
fs/xfs/scrub/repair.c

index 72cec56f52eb176a5ca0746e2a8ece5131133ed4..f3fa9f2770d4a3f90e9fdd655abd74ffb66c1bf6 100644 (file)
@@ -1245,12 +1245,6 @@ xchk_metadata_inode_forks(
                return 0;
        }
 
-       /* They also should never have extended attributes. */
-       if (xfs_inode_hasattr(sc->ip)) {
-               xchk_ino_set_corrupt(sc, sc->ip->i_ino);
-               return 0;
-       }
-
        /* Invoke the data fork scrubber. */
        error = xchk_metadata_inode_subtype(sc, XFS_SCRUB_TYPE_BMBTD);
        if (error || (sc->sm->sm_flags & XFS_SCRUB_OFLAG_CORRUPT))
@@ -1267,6 +1261,21 @@ xchk_metadata_inode_forks(
                        xchk_ino_set_corrupt(sc, sc->ip->i_ino);
        }
 
+       /*
+        * Metadata files can only have extended attributes on metadir
+        * filesystems, either for parent pointers or for actual xattr data.
+        */
+       if (xfs_inode_hasattr(sc->ip)) {
+               if (!xfs_has_metadir(sc->mp)) {
+                       xchk_ino_set_corrupt(sc, sc->ip->i_ino);
+                       return 0;
+               }
+
+               error = xchk_metadata_inode_subtype(sc, XFS_SCRUB_TYPE_BMBTA);
+               if (error || (sc->sm->sm_flags & XFS_SCRUB_OFLAG_CORRUPT))
+                       return error;
+       }
+
        return 0;
 }
 
index 155bbaaa496e44236a108128c4e7e69ed998dfd3..01c0e863775d4562a536a97967f12086da7cf6d9 100644 (file)
@@ -1083,7 +1083,12 @@ xrep_metadata_inode_forks(
        if (error)
                return error;
 
-       /* Make sure the attr fork looks ok before we delete it. */
+       /*
+        * Metadata files can only have extended attributes on metadir
+        * filesystems, either for parent pointers or for actual xattr data.
+        * For a non-metadir filesystem, make sure the attr fork looks ok
+        * before we delete it.
+        */
        if (xfs_inode_hasattr(sc->ip)) {
                error = xrep_metadata_inode_subtype(sc, XFS_SCRUB_TYPE_BMBTA);
                if (error)
@@ -1099,8 +1104,11 @@ xrep_metadata_inode_forks(
                        return error;
        }
 
-       /* Clear the attr forks since metadata shouldn't have that. */
-       if (xfs_inode_hasattr(sc->ip)) {
+       /*
+        * Metadata files on non-metadir filesystems cannot have attr forks,
+        * so clear them now.
+        */
+       if (xfs_inode_hasattr(sc->ip) && !xfs_has_metadir(sc->mp)) {
                if (!dirty) {
                        dirty = true;
                        xfs_trans_ijoin(sc->tp, sc->ip, 0);