Re: NFSD binary compatibility breakage

Neil Brown (neilb@cse.unsw.edu.au)
Thu, 10 Apr 2003 09:48:37 +1000


On Tuesday April 8, davidm@napali.hpl.hp.com wrote:
> Neil,
>
> The removal of "struct nfsctl_uidmap" from "nfsctl_fdparm" broke
> binary compatiblity on 64-bit platforms (strictly speaking: on all
> platforms with alignof(void *) > alignof(int)). The problem is that
> nfsctl_uidmap contained a "char *", which forced the alignment of the
> entire union to be 64 bits. With the removal of the uidmap, the
> required alignment drops to 32 bits. Since the first member is only
> 32 bits in size, this breaks compatibility with user-space. Patch
> below fixes the problem.

Hmm... just another reason to get rid of these binary interfaces! I
plan to rip them all out in 2.7.1. But for now I'll try to keep them
going as best I can. Thanks for the patch.

NeilBrown

>
> Thanks,
>
> --david
>
> ===== include/linux/nfsd/syscall.h 1.4 vs edited =====
> --- 1.4/include/linux/nfsd/syscall.h Sun Mar 23 14:35:20 2003
> +++ edited/include/linux/nfsd/syscall.h Tue Apr 8 22:36:59 2003
> @@ -91,6 +91,13 @@
> struct nfsctl_export u_export;
> struct nfsctl_fdparm u_getfd;
> struct nfsctl_fsparm u_getfs;
> + /*
> + * The following dummy member is needed to preserve binary compatibility
> + * on platforms where alignof(void*)>alignof(int). It's needed because
> + * this union used to contain a member (u_umap) which contained a
> + * pointer.
> + */
> + void *u_ptr;
> } u;
> #define ca_svc u.u_svc
> #define ca_client u.u_client
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/