xfs: check parent pointer xattrs when scrubbing
authorDarrick J. Wong <djwong@kernel.org>
Mon, 22 Apr 2024 16:48:05 +0000 (09:48 -0700)
committerDarrick J. Wong <djwong@kernel.org>
Tue, 23 Apr 2024 14:47:03 +0000 (07:47 -0700)
Check parent pointer xattrs as part of scrubbing xattrs.

Signed-off-by: Darrick J. Wong <djwong@kernel.org>
Reviewed-by: Christoph Hellwig <hch@lst.de>
fs/xfs/scrub/attr.c

index 393ed36709b3a96cc3264e8226cbcbe05cb96d70..b550f3e34ffc73cc7900f8f8f036702f8a3edd8a 100644 (file)
@@ -17,6 +17,7 @@
 #include "xfs_attr.h"
 #include "xfs_attr_leaf.h"
 #include "xfs_attr_sf.h"
+#include "xfs_parent.h"
 #include "scrub/scrub.h"
 #include "scrub/common.h"
 #include "scrub/dabtree.h"
@@ -208,6 +209,13 @@ xchk_xattr_actor(
                return -ECANCELED;
        }
 
+       /* Check parent pointer record. */
+       if ((attr_flags & XFS_ATTR_PARENT) &&
+           !xfs_parent_valuecheck(sc->mp, value, valuelen)) {
+               xchk_fblock_set_corrupt(sc, XFS_ATTR_FORK, args.blkno);
+               return -ECANCELED;
+       }
+
        /*
         * Try to allocate enough memory to extract the attr value.  If that
         * doesn't work, return -EDEADLOCK as a signal to try again with a
@@ -219,6 +227,14 @@ xchk_xattr_actor(
        if (error)
                return error;
 
+       /*
+        * Parent pointers are matched on attr name and value, so we must
+        * supply the xfs_parent_rec here when confirming that the dabtree
+        * indexing works correctly.
+        */
+       if (attr_flags & XFS_ATTR_PARENT)
+               memcpy(ab->value, value, valuelen);
+
        args.value = ab->value;
 
        /*