From: Darrick J. Wong <djwong@xxxxxxxxxx> Rearrange parts of this thing in preparation for fsck code. Signed-off-by: Darrick J. Wong <djwong@xxxxxxxxxx> --- fs/xfs/libxfs/xfs_da_format.h | 11 +++++++++++ fs/xfs/libxfs/xfs_parent.c | 29 ++++++++++++++++++++++++++++- fs/xfs/libxfs/xfs_parent.h | 6 ++---- 3 files changed, 41 insertions(+), 5 deletions(-) diff --git a/fs/xfs/libxfs/xfs_da_format.h b/fs/xfs/libxfs/xfs_da_format.h index 2db1cf97b2c8..c07b8166e8ff 100644 --- a/fs/xfs/libxfs/xfs_da_format.h +++ b/fs/xfs/libxfs/xfs_da_format.h @@ -159,6 +159,17 @@ struct xfs_da3_intnode { #define XFS_DIR3_FT_MAX 9 +#define XFS_DIR3_FTYPE_STR \ + { XFS_DIR3_FT_UNKNOWN, "unknown" }, \ + { XFS_DIR3_FT_REG_FILE, "file" }, \ + { XFS_DIR3_FT_DIR, "directory" }, \ + { XFS_DIR3_FT_CHRDEV, "char" }, \ + { XFS_DIR3_FT_BLKDEV, "block" }, \ + { XFS_DIR3_FT_FIFO, "fifo" }, \ + { XFS_DIR3_FT_SOCK, "sock" }, \ + { XFS_DIR3_FT_SYMLINK, "symlink" }, \ + { XFS_DIR3_FT_WHT, "whiteout" } + /* * Byte offset in data block and shortform entry. */ diff --git a/fs/xfs/libxfs/xfs_parent.c b/fs/xfs/libxfs/xfs_parent.c index ec2bff195773..fe6d4d1a7d57 100644 --- a/fs/xfs/libxfs/xfs_parent.c +++ b/fs/xfs/libxfs/xfs_parent.c @@ -91,7 +91,7 @@ xfs_parent_valuecheck( } /* Initializes a xfs_parent_name_rec to be stored as an attribute name */ -void +static inline void xfs_init_parent_name_rec( struct xfs_parent_name_rec *rec, struct xfs_inode *ip, @@ -135,6 +135,33 @@ xfs_parent_irec_from_disk( memset(&irec->p_name[valuelen], 0, sizeof(irec->p_name) - valuelen); } +/* + * Convert an incore parent_name record to its ondisk format. If @value or + * @valuelen are NULL, they will not be written to. + */ +void +xfs_parent_irec_to_disk( + struct xfs_parent_name_rec *rec, + void *value, + int *valuelen, + const struct xfs_parent_name_irec *irec) +{ + rec->p_ino = cpu_to_be64(irec->p_ino); + rec->p_gen = cpu_to_be32(irec->p_gen); + rec->p_diroffset = cpu_to_be32(irec->p_diroffset); + + if (valuelen) { + ASSERT(*valuelen > 0); + ASSERT(*valuelen >= irec->p_namelen); + ASSERT(*valuelen < MAXNAMELEN); + + *valuelen = irec->p_namelen; + } + + if (value) + memcpy(value, irec->p_name, irec->p_namelen); +} + /* * Allocate memory to control a logged parent pointer update as part of a * dirent operation. diff --git a/fs/xfs/libxfs/xfs_parent.h b/fs/xfs/libxfs/xfs_parent.h index 35854e968f1d..4eb92fb4b11b 100644 --- a/fs/xfs/libxfs/xfs_parent.h +++ b/fs/xfs/libxfs/xfs_parent.h @@ -33,6 +33,8 @@ struct xfs_parent_name_irec { void xfs_parent_irec_from_disk(struct xfs_parent_name_irec *irec, const struct xfs_parent_name_rec *rec, const void *value, int valuelen); +void xfs_parent_irec_to_disk(struct xfs_parent_name_rec *rec, void *value, + int *valuelen, const struct xfs_parent_name_irec *irec); /* * Dynamically allocd structure used to wrap the needed data to pass around @@ -48,10 +50,6 @@ struct xfs_parent_defer { /* * Parent pointer attribute prototypes */ -void xfs_init_parent_name_rec(struct xfs_parent_name_rec *rec, - struct xfs_inode *ip, uint32_t p_diroffset); -void xfs_init_parent_name_irec(struct xfs_parent_name_irec *irec, - struct xfs_parent_name_rec *rec); int __xfs_parent_init(struct xfs_mount *mp, bool grab_log, struct xfs_parent_defer **parentp);