@@ -842,21 +842,24 @@ xfs_failaddr_t xfs_da3_blkinfo_verify(struct xfs_buf *bp,
struct xfs_parent_name_rec {
__be64 p_ino;
__be32 p_gen;
- __u8 p_namehash[XFS_PARENT_NAME_HASH_SIZE];
+ __u8 p_namehash[];
} __attribute__((packed));
+#define XFS_PARENT_NAME_MAX_SIZE \
+ (sizeof(struct xfs_parent_name_rec) + XFS_PARENT_NAME_HASH_SIZE)
+
static inline unsigned int
xfs_parent_name_rec_sizeof(
unsigned int hashlen)
{
- return offsetof(struct xfs_parent_name_rec, p_namehash) + hashlen;
+ return sizeof(struct xfs_parent_name_rec) + hashlen;
}
static inline unsigned int
xfs_parent_name_hashlen(
unsigned int rec_sizeof)
{
- return rec_sizeof - offsetof(struct xfs_parent_name_rec, p_namehash);
+ return rec_sizeof - sizeof(struct xfs_parent_name_rec);
}
#endif /* __XFS_DA_FORMAT_H__ */
@@ -98,7 +98,7 @@ xfs_init_parent_name_rec(
rec->p_ino = cpu_to_be64(dp->i_ino);
rec->p_gen = cpu_to_be32(VFS_IC(dp)->i_generation);
return xfs_parent_namehash(ip, name, rec->p_namehash,
- sizeof(rec->p_namehash));
+ XFS_PARENT_NAME_HASH_SIZE);
}
/*
@@ -197,7 +197,7 @@ __xfs_parent_init(
parent->args.attr_filter = XFS_ATTR_PARENT;
parent->args.op_flags = XFS_DA_OP_OKNOENT | XFS_DA_OP_LOGGED;
parent->args.name = (const uint8_t *)&parent->rec;
- parent->args.namelen = sizeof(struct xfs_parent_name_rec);
+ parent->args.namelen = 0;
*parentp = parent;
return 0;
@@ -43,8 +43,14 @@ void xfs_parent_irec_to_disk(struct xfs_parent_name_rec *rec, int *reclen,
* the defer ops machinery
*/
struct xfs_parent_defer {
- struct xfs_parent_name_rec rec;
- struct xfs_parent_name_rec old_rec;
+ union {
+ struct xfs_parent_name_rec rec;
+ __u8 dummy1[XFS_PARENT_NAME_MAX_SIZE];
+ };
+ union {
+ struct xfs_parent_name_rec old_rec;
+ __u8 dummy2[XFS_PARENT_NAME_MAX_SIZE];
+ };
struct xfs_da_args args;
bool have_log;
};
@@ -112,7 +118,10 @@ unsigned int xfs_pptr_calc_space_res(struct xfs_mount *mp,
/* Scratchpad memory so that raw parent operations don't burn stack space. */
struct xfs_parent_scratch {
- struct xfs_parent_name_rec rec;
+ union {
+ struct xfs_parent_name_rec rec;
+ __u8 dummy1[XFS_PARENT_NAME_MAX_SIZE];
+ };
struct xfs_da_args args;
};
@@ -427,19 +427,19 @@ static inline unsigned int xfs_calc_pptr_link_overhead(void)
{
return sizeof(struct xfs_attri_log_format) +
xlog_calc_iovec_len(XATTR_NAME_MAX) +
- xlog_calc_iovec_len(sizeof(struct xfs_parent_name_rec));
+ xlog_calc_iovec_len(XFS_PARENT_NAME_MAX_SIZE);
}
static inline unsigned int xfs_calc_pptr_unlink_overhead(void)
{
return sizeof(struct xfs_attri_log_format) +
- xlog_calc_iovec_len(sizeof(struct xfs_parent_name_rec));
+ xlog_calc_iovec_len(XFS_PARENT_NAME_MAX_SIZE);
}
static inline unsigned int xfs_calc_pptr_replace_overhead(void)
{
return sizeof(struct xfs_attri_log_format) +
xlog_calc_iovec_len(XATTR_NAME_MAX) +
xlog_calc_iovec_len(XATTR_NAME_MAX) +
- xlog_calc_iovec_len(sizeof(struct xfs_parent_name_rec));
+ xlog_calc_iovec_len(XFS_PARENT_NAME_MAX_SIZE);
}
/*
@@ -116,7 +116,7 @@ xfs_check_ondisk_structs(void)
XFS_CHECK_OFFSET(xfs_dir2_sf_entry_t, offset, 1);
XFS_CHECK_OFFSET(xfs_dir2_sf_entry_t, name, 3);
XFS_CHECK_STRUCT_SIZE(xfs_dir2_sf_hdr_t, 10);
- XFS_CHECK_STRUCT_SIZE(struct xfs_parent_name_rec, 76);
+ XFS_CHECK_STRUCT_SIZE(struct xfs_parent_name_rec, 12);
BUILD_BUG_ON(XFS_PARENT_NAME_HASH_SIZE != SHA512_DIGEST_SIZE);
/* log structures */