]> git.ipfire.org Git - thirdparty/xfsprogs-dev.git/commitdiff
xfs_repair: junk parent pointer attributes when filesystem doesn't support them
authorDarrick J. Wong <djwong@kernel.org>
Mon, 29 Jul 2024 23:23:25 +0000 (16:23 -0700)
committerDarrick J. Wong <djwong@kernel.org>
Tue, 30 Jul 2024 00:01:12 +0000 (17:01 -0700)
Drop a parent pointer xattr if the filesystem doesn't support parent
pointers.

Signed-off-by: Darrick J. Wong <djwong@kernel.org>
Reviewed-by: Christoph Hellwig <hch@lst.de>
repair/attr_repair.c

index 2e97fd9775ba38a9b3da3ad1755c6b2fe51b1fed..50159b9a533875a82b8e24f01131945703873ae9 100644 (file)
@@ -327,6 +327,13 @@ process_shortform_attr(
                                        NULL, currententry->namelen,
                                        currententry->valuelen);
 
+               if ((currententry->flags & XFS_ATTR_PARENT) &&
+                   !xfs_has_parent(mp)) {
+                       do_warn(
+ _("parent pointer found on filesystem that doesn't support parent pointers\n"));
+                       junkit |= 1;
+               }
+
                remainingspace = remainingspace -
                                        xfs_attr_sf_entsize(currententry);
 
@@ -527,6 +534,15 @@ process_leaf_attr_local(
                        return -1;
                }
        }
+
+       if ((entry->flags & XFS_ATTR_PARENT) && !xfs_has_parent(mp)) {
+               do_warn(
+ _("parent pointer found in attribute entry %d in attr block %u, inode %"
+   PRIu64 " on filesystem that doesn't support parent pointers\n"),
+                               i, da_bno, ino);
+               return -1;
+       }
+
        return xfs_attr_leaf_entsize_local(local->namelen,
                                                be16_to_cpu(local->valuelen));
 }
@@ -562,6 +578,20 @@ process_leaf_attr_remote(
                return -1;
        }
 
+       if (entry->flags & XFS_ATTR_PARENT) {
+               if (!xfs_has_parent(mp))
+                       do_warn(
+ _("parent pointer found in attribute entry %d in attr block %u, inode %"
+   PRIu64 " on filesystem that doesn't support parent pointers\n"),
+                                       i, da_bno, ino);
+               else
+                       do_warn(
+ _("parent pointer found in attribute entry %d in attr block %u, inode %"
+   PRIu64 " with bogus remote value\n"),
+                                       i, da_bno, ino);
+               return -1;
+       }
+
        value = malloc(be32_to_cpu(remotep->valuelen));
        if (value == NULL) {
                do_warn(