xfs: kill xfs_dir2_sf_off_t
authorChristoph Hellwig <hch@lst.de>
Wed, 20 Jul 2016 01:47:21 +0000 (11:47 +1000)
committerDave Chinner <david@fromorbit.com>
Wed, 20 Jul 2016 01:47:21 +0000 (11:47 +1000)
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 <hch@lst.de>
Reviewed-by: Dave Chinner <dchinner@redhat.com>
Signed-off-by: Dave Chinner <david@fromorbit.com>
fs/xfs/libxfs/xfs_da_format.h
fs/xfs/libxfs/xfs_dir2_sf.c
fs/xfs/xfs_ondisk.h

index 8d4d8bce41bf7873fec0fc8211801207a0a46494..a5f4d6ee2bb3f01aa51201d687d732f2a46793ae 100644 (file)
@@ -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 *
index e5bb9cc3b243b9fd451db6dcc429edb6a24644bf..f8ccfd5a047752ff3fbb11bdad6b0fa134a50c68 100644 (file)
@@ -126,11 +126,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))
@@ -1048,7 +1047,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));
@@ -1124,7 +1123,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));
index 184c44effdd5a3bd107d1369c9b2873367951980..918f13c5dd58bd268d06b14a77b69a22cd7bd3f8 100644 (file)
@@ -95,7 +95,6 @@ xfs_check_ondisk_structs(void)
        XFS_CHECK_STRUCT_SIZE(xfs_dir2_leaf_tail_t,             4);
        XFS_CHECK_STRUCT_SIZE(xfs_dir2_sf_entry_t,              3);
        XFS_CHECK_STRUCT_SIZE(xfs_dir2_sf_hdr_t,                10);
-       XFS_CHECK_STRUCT_SIZE(xfs_dir2_sf_off_t,                2);
 
        /* log structures */
        XFS_CHECK_STRUCT_SIZE(struct xfs_dq_logformat,          24);