From 1faa1a813f846c2c66f4715e577f0c0af1723307 Mon Sep 17 00:00:00 2001 From: Christoph Hellwig Date: Wed, 10 Aug 2016 11:29:36 +1000 Subject: [PATCH] xfs: kill xfs_dir2_sf_off_t Source kernel commit: 8353a649f577a5d775f4666a31b286b8a5156dfb Just use an array of two unsigned chars directly to avoid problems with architectures that pad the size of structures. Signed-off-by: Christoph Hellwig Reviewed-by: Dave Chinner Signed-off-by: Dave Chinner --- db/field.c | 2 +- libxfs/xfs_da_format.h | 14 ++++---------- libxfs/xfs_dir2_sf.c | 13 ++++++------- 3 files changed, 11 insertions(+), 18 deletions(-) diff --git a/db/field.c b/db/field.c index 843c385cb..a9d4a3a7a 100644 --- a/db/field.c +++ b/db/field.c @@ -225,7 +225,7 @@ const ftattr_t ftattrtab[] = { { FLDT_DIR2_SF_HDR, "dir2_sf_hdr", NULL, (char *)dir2_sf_hdr_flds, dir2_sf_hdr_size, FTARG_SIZE, NULL, dir2_sf_hdr_flds }, { FLDT_DIR2_SF_OFF, "dir2_sf_off", fp_num, "%#x", - SI(bitsz(xfs_dir2_sf_off_t)), 0, NULL, NULL }, + SI(bitize(2*sizeof(__u8))), 0, NULL, NULL }, { FLDT_DIR2SF, "dir2sf", NULL, (char *)dir2sf_flds, dir2sf_size, FTARG_SIZE, NULL, dir2sf_flds }, diff --git a/libxfs/xfs_da_format.h b/libxfs/xfs_da_format.h index 8d4d8bce4..a5f4d6ee2 100644 --- a/libxfs/xfs_da_format.h +++ b/libxfs/xfs_da_format.h @@ -191,12 +191,6 @@ typedef __uint16_t xfs_dir2_data_off_t; #define NULLDATAOFF 0xffffU typedef uint xfs_dir2_data_aoff_t; /* argument form */ -/* - * Normalized offset (in a data block) of the entry, really xfs_dir2_data_off_t. - * Only need 16 bits, this is the byte offset into the single block form. - */ -typedef struct { __uint8_t i[2]; } __arch_pack xfs_dir2_sf_off_t; - /* * Offset in data space of a data entry. */ @@ -251,7 +245,7 @@ typedef struct xfs_dir2_sf_hdr { typedef struct xfs_dir2_sf_entry { __u8 namelen; /* actual name length */ - xfs_dir2_sf_off_t offset; /* saved offset */ + __u8 offset[2]; /* saved offset */ __u8 name[]; /* name, variable size */ /* * A single byte containing the file type field follows the inode @@ -260,7 +254,7 @@ typedef struct xfs_dir2_sf_entry { * A xfs_dir2_ino8_t or xfs_dir2_ino4_t follows here, at a * variable offset after the name. */ -} __arch_pack xfs_dir2_sf_entry_t; +} xfs_dir2_sf_entry_t; static inline int xfs_dir2_sf_hdr_size(int i8count) { @@ -272,13 +266,13 @@ static inline int xfs_dir2_sf_hdr_size(int i8count) static inline xfs_dir2_data_aoff_t xfs_dir2_sf_get_offset(xfs_dir2_sf_entry_t *sfep) { - return get_unaligned_be16(&sfep->offset.i); + return get_unaligned_be16(sfep->offset); } static inline void xfs_dir2_sf_put_offset(xfs_dir2_sf_entry_t *sfep, xfs_dir2_data_aoff_t off) { - put_unaligned_be16(off, &sfep->offset.i); + put_unaligned_be16(off, sfep->offset); } static inline struct xfs_dir2_sf_entry * diff --git a/libxfs/xfs_dir2_sf.c b/libxfs/xfs_dir2_sf.c index 90b07f7ea..b4482aa70 100644 --- a/libxfs/xfs_dir2_sf.c +++ b/libxfs/xfs_dir2_sf.c @@ -124,11 +124,10 @@ xfs_dir2_block_sfsize( /* * Calculate the new size, see if we should give up yet. */ - size = xfs_dir2_sf_hdr_size(i8count) + /* header */ - count + /* namelen */ - count * (uint)sizeof(xfs_dir2_sf_off_t) + /* offset */ - namelen + /* name */ - (i8count ? /* inumber */ + size = xfs_dir2_sf_hdr_size(i8count) + /* header */ + count * 3 * sizeof(__u8) + /* namelen + offset */ + namelen + /* name */ + (i8count ? /* inumber */ (uint)sizeof(xfs_dir2_ino8_t) * count : (uint)sizeof(xfs_dir2_ino4_t) * count); if (size > XFS_IFORK_DSIZE(dp)) @@ -1046,7 +1045,7 @@ xfs_dir2_sf_toino4( i++, sfep = dp->d_ops->sf_nextentry(sfp, sfep), oldsfep = dp->d_ops->sf_nextentry(oldsfp, oldsfep)) { sfep->namelen = oldsfep->namelen; - sfep->offset = oldsfep->offset; + memcpy(sfep->offset, oldsfep->offset, sizeof(sfep->offset)); memcpy(sfep->name, oldsfep->name, sfep->namelen); dp->d_ops->sf_put_ino(sfp, sfep, dp->d_ops->sf_get_ino(oldsfp, oldsfep)); @@ -1122,7 +1121,7 @@ xfs_dir2_sf_toino8( i++, sfep = dp->d_ops->sf_nextentry(sfp, sfep), oldsfep = dp->d_ops->sf_nextentry(oldsfp, oldsfep)) { sfep->namelen = oldsfep->namelen; - sfep->offset = oldsfep->offset; + memcpy(sfep->offset, oldsfep->offset, sizeof(sfep->offset)); memcpy(sfep->name, oldsfep->name, sfep->namelen); dp->d_ops->sf_put_ino(sfp, sfep, dp->d_ops->sf_get_ino(oldsfp, oldsfep)); -- 2.50.1