]> git.apps.os.sepia.ceph.com Git - xfsprogs-dev.git/commitdiff
xfs: check dirents have parent pointers
authorDarrick J. Wong <djwong@kernel.org>
Mon, 29 Jul 2024 23:22:50 +0000 (16:22 -0700)
committerDarrick J. Wong <djwong@kernel.org>
Tue, 30 Jul 2024 00:01:03 +0000 (17:01 -0700)
Source kernel commit: 61b3f0df5c235806d372aaf696ce9aee7746d18f

If the fs has parent pointers, we need to check that each child dirent
points to a file that has a parent pointer pointing back at us.

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

index bb046519746a06d0a54360ea46806a508d49eeeb..8c29ba61c25b51a8e1b87f81a5bad600586921b5 100644 (file)
@@ -288,3 +288,25 @@ xfs_parent_from_attr(
                *parent_gen = be32_to_cpu(rec->p_gen);
        return 0;
 }
+
+/*
+ * Look up a parent pointer record (@parent_name -> @pptr) of @ip.
+ *
+ * Caller must hold at least ILOCK_SHARED.  The scratchpad need not be
+ * initialized.
+ *
+ * Returns 0 if the pointer is found, -ENOATTR if there is no match, or a
+ * negative errno.
+ */
+int
+xfs_parent_lookup(
+       struct xfs_trans                *tp,
+       struct xfs_inode                *ip,
+       const struct xfs_name           *parent_name,
+       struct xfs_parent_rec           *pptr,
+       struct xfs_da_args              *scratch)
+{
+       memset(scratch, 0, sizeof(struct xfs_da_args));
+       xfs_parent_da_args_init(scratch, tp, pptr, ip, ip->i_ino, parent_name);
+       return xfs_attr_get_ilocked(scratch);
+}
index d7ab09e738ad42df52517132908978bdd38ca719..97788582321a6fe0fe609b29e01d108381edc0d6 100644 (file)
@@ -96,4 +96,9 @@ int xfs_parent_from_attr(struct xfs_mount *mp, unsigned int attr_flags,
                const void *value, unsigned int valuelen,
                xfs_ino_t *parent_ino, uint32_t *parent_gen);
 
+/* Repair functions */
+int xfs_parent_lookup(struct xfs_trans *tp, struct xfs_inode *ip,
+               const struct xfs_name *name, struct xfs_parent_rec *pptr,
+               struct xfs_da_args *scratch);
+
 #endif /* __XFS_PARENT_H__ */