On Sat, Jun 11, 2022 at 02:41:50AM -0700, Allison Henderson wrote: > We need to define the parent pointer attribute format before we start > adding support for it into all the code that needs to use it. The EA > format we will use encodes the following information: > > name={parent inode #, parent inode generation, dirent offset} > value={dirent filename} > > The inode/gen gives all the information we need to reliably identify the > parent without requiring child->parent lock ordering, and allows > userspace to do pathname component level reconstruction without the > kernel ever needing to verify the parent itself as part of ioctl calls. > > By using the dirent offset in the EA name, we have a method of knowing > the exact parent pointer EA we need to modify/remove in rename/unlink > without an unbound EA name search. > > By keeping the dirent name in the value, we have enough information to > be able to validate and reconstruct damaged directory trees. While the > diroffset of a filename alone is not unique enough to identify the > child, the {diroffset,filename,child_inode} tuple is sufficient. That > is, if the diroffset gets reused and points to a different filename, we > can detect that from the contents of EA. If a link of the same name is > created, then we can check whether it points at the same inode as the > parent EA we current have. > > [achender: rebased, changed __unint32_t to xfs_dir2_dataptr_t, > changed p_ino to xfs_ino_t and p_namelen to uint8_t, > moved to xfs_da_format for xfs_dir2_dataptr_t] > > Signed-off-by: Dave Chinner <dchinner@xxxxxxxxxx> > Signed-off-by: Allison Henderson <allison.henderson@xxxxxxxxxx> > Reviewed-by: Darrick J. Wong<darrick.wong@xxxxxxxxxx> Reviewed-by: Darrick J. Wong <djwong@xxxxxxxxxx> --D > --- > fs/xfs/libxfs/xfs_da_format.h | 25 +++++++++++++++++++++++++ > 1 file changed, 25 insertions(+) > > diff --git a/fs/xfs/libxfs/xfs_da_format.h b/fs/xfs/libxfs/xfs_da_format.h > index 2d771e6429f2..6ac8c8dd4aab 100644 > --- a/fs/xfs/libxfs/xfs_da_format.h > +++ b/fs/xfs/libxfs/xfs_da_format.h > @@ -805,4 +805,29 @@ static inline unsigned int xfs_dir2_dirblock_bytes(struct xfs_sb *sbp) > xfs_failaddr_t xfs_da3_blkinfo_verify(struct xfs_buf *bp, > struct xfs_da3_blkinfo *hdr3); > > +/* > + * Parent pointer attribute format definition > + * > + * EA name encodes the parent inode number, generation and the offset of > + * the dirent that points to the child inode. The EA value contains the > + * same name as the dirent in the parent directory. > + */ > +struct xfs_parent_name_rec { > + __be64 p_ino; > + __be32 p_gen; > + __be32 p_diroffset; > +}; > + > +/* > + * incore version of the above, also contains name pointers so callers > + * can pass/obtain all the parent pointer information in a single structure > + */ > +struct xfs_parent_name_irec { > + xfs_ino_t p_ino; > + uint32_t p_gen; > + xfs_dir2_dataptr_t p_diroffset; > + const char *p_name; > + uint8_t p_namelen; > +}; > + > #endif /* __XFS_DA_FORMAT_H__ */ > -- > 2.25.1 >