On LP64 struct ifid is 64-bit aligned while struct fid is 32-bit aligned

so on architectures with strict alignment requirements we can't just simply
cast the latter to the former but need to copy it bytewise instead.

PR:		143010
MFC after:	3 days
This commit is contained in:
marius 2010-01-23 22:38:01 +00:00
parent aa7c04ce46
commit 6d095a5fb7
2 changed files with 17 additions and 10 deletions

View File

@ -589,17 +589,19 @@ cd9660_fhtovp(mp, fhp, vpp)
struct fid *fhp;
struct vnode **vpp;
{
struct ifid *ifhp = (struct ifid *)fhp;
struct ifid ifh;
struct iso_node *ip;
struct vnode *nvp;
int error;
memcpy(&ifh, fhp, sizeof(ifh));
#ifdef ISOFS_DBG
printf("fhtovp: ino %d, start %ld\n",
ifhp->ifid_ino, ifhp->ifid_start);
ifh.ifid_ino, ifh.ifid_start);
#endif
if ((error = VFS_VGET(mp, ifhp->ifid_ino, LK_EXCLUSIVE, &nvp)) != 0) {
if ((error = VFS_VGET(mp, ifh.ifid_ino, LK_EXCLUSIVE, &nvp)) != 0) {
*vpp = NULLVP;
return (error);
}

View File

@ -819,20 +819,25 @@ cd9660_vptofh(ap)
struct fid *a_fhp;
} */ *ap;
{
struct ifid ifh;
struct iso_node *ip = VTOI(ap->a_vp);
struct ifid *ifhp;
ifhp = (struct ifid *)ap->a_fhp;
ifhp->ifid_len = sizeof(struct ifid);
ifh.ifid_len = sizeof(struct ifid);
ifhp->ifid_ino = ip->i_number;
ifhp->ifid_start = ip->iso_start;
ifh.ifid_ino = ip->i_number;
ifh.ifid_start = ip->iso_start;
/*
* This intentionally uses sizeof(ifh) in order to not copy stack
* garbage on ILP32.
*/
memcpy(ap->a_fhp, &ifh, sizeof(ifh));
#ifdef ISOFS_DBG
printf("vptofh: ino %d, start %ld\n",
ifhp->ifid_ino,ifhp->ifid_start);
ifh.ifid_ino, ifh.ifid_start);
#endif
return 0;
return (0);
}
/*