xfs: rearrange bits of the parent pointer apis for fsck
Rearrange parts of this thing in preparation for fsck code.
Signed-off-by: Darrick J. Wong <djwong@kernel.org>
diff --git a/libxfs/libxfs_api_defs.h b/libxfs/libxfs_api_defs.h
index 132e2ac..60d3339 100644
--- a/libxfs/libxfs_api_defs.h
+++ b/libxfs/libxfs_api_defs.h
@@ -124,7 +124,6 @@
#define xfs_initialize_perag libxfs_initialize_perag
#define xfs_initialize_perag_data libxfs_initialize_perag_data
#define xfs_init_local_fork libxfs_init_local_fork
-#define xfs_init_parent_name_rec libxfs_init_parent_name_rec
#define xfs_inobt_maxrecs libxfs_inobt_maxrecs
#define xfs_inobt_stage_cursor libxfs_inobt_stage_cursor
diff --git a/libxfs/xfs_da_format.h b/libxfs/xfs_da_format.h
index 2db1cf9..c07b816 100644
--- a/libxfs/xfs_da_format.h
+++ b/libxfs/xfs_da_format.h
@@ -159,6 +159,17 @@
#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/libxfs/xfs_parent.c b/libxfs/xfs_parent.c
index 89eb531..980f0b8 100644
--- a/libxfs/xfs_parent.c
+++ b/libxfs/xfs_parent.c
@@ -92,7 +92,7 @@
}
/* 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,
@@ -137,6 +137,33 @@
}
/*
+ * 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/libxfs/xfs_parent.h b/libxfs/xfs_parent.h
index 35854e9..4eb92fb 100644
--- a/libxfs/xfs_parent.h
+++ b/libxfs/xfs_parent.h
@@ -33,6 +33,8 @@
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 @@
/*
* 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);