Re: [PATCH v1 07/17] xfs: define parent pointer xattr format

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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
> 



[Index of Archives]     [XFS Filesystem Development (older mail)]     [Linux Filesystem Development]     [Linux Audio Users]     [Yosemite Trails]     [Linux Kernel]     [Linux RAID]     [Linux SCSI]


  Powered by Linux