Index: sys/ufs/lfs/lfs_accessors.h =================================================================== RCS file: /cvsroot/src/sys/ufs/lfs/lfs_accessors.h,v retrieving revision 1.48 diff -u -r1.48 lfs_accessors.h --- sys/ufs/lfs/lfs_accessors.h 10 Jun 2017 05:29:36 -0000 1.48 +++ sys/ufs/lfs/lfs_accessors.h 6 Mar 2020 20:44:50 -0000 @@ -721,24 +721,29 @@ static __inline type \ lfs_fi_get##field(STRUCT_LFS *fs, FINFO *fip) \ { \ + FINFO aligned_fip; \ + memcpy(&aligned_fip, fip, sizeof(*fip)); \ if (fs->lfs_is64) { \ - return fip->u_64.fi_##field; \ + return aligned_fip.u_64.fi_##field; \ } else { \ - return fip->u_32.fi_##field; \ + return aligned_fip.u_32.fi_##field; \ } \ } \ static __inline void \ lfs_fi_set##field(STRUCT_LFS *fs, FINFO *fip, type val) \ { \ + FINFO aligned_fip; \ + memcpy(&aligned_fip, fip, sizeof(*fip)); \ if (fs->lfs_is64) { \ - type *p = &fip->u_64.fi_##field; \ + type *p = &aligned_fip.u_64.fi_##field; \ (void)p; \ - fip->u_64.fi_##field = val; \ + aligned_fip.u_64.fi_##field = val; \ } else { \ - type32 *p = &fip->u_32.fi_##field; \ + type32 *p = &aligned_fip.u_32.fi_##field;\ (void)p; \ - fip->u_32.fi_##field = val; \ + aligned_fip.u_32.fi_##field = val; \ } \ + memcpy(fip, &aligned_fip, sizeof(*fip)); \ } \ LFS_DEF_FI_ACCESSOR(uint32_t, uint32_t, nblocks); @@ -856,24 +861,29 @@ static __inline type \ lfs_if_get##field(STRUCT_LFS *fs, IFILE *ifp) \ { \ + IFILE aligned_ifp; \ + memcpy(&aligned_ifp, ifp, sizeof(*ifp)); \ if (fs->lfs_is64) { \ - return ifp->u_64.if_##field; \ + return aligned_ifp.u_64.if_##field; \ } else { \ - return ifp->u_32.if_##field; \ + return aligned_ifp.u_32.if_##field; \ } \ } \ static __inline void \ lfs_if_set##field(STRUCT_LFS *fs, IFILE *ifp, type val) \ { \ + IFILE aligned_ifp; \ + memcpy(&aligned_ifp, ifp, sizeof(*ifp)); \ if (fs->lfs_is64) { \ - type *p = &ifp->u_64.if_##field; \ + type *p = &aligned_ifp.u_64.if_##field; \ (void)p; \ - ifp->u_64.if_##field = val; \ + aligned_ifp.u_64.if_##field = val; \ } else { \ - type32 *p = &ifp->u_32.if_##field; \ + type32 *p = &aligned_ifp.u_32.if_##field;\ (void)p; \ - ifp->u_32.if_##field = val; \ + aligned_ifp.u_32.if_##field = val; \ } \ + memcpy(ifp, &aligned_ifp, sizeof(*ifp)); \ } \ LFS_DEF_IF_ACCESSOR(uint32_t, uint32_t, version);