On Thu, 2011-12-29 at 23:33 +0100, Rafael J. Wysocki wrote: > On Thursday, December 29, 2011, Ben Hutchings wrote: > > On Tue, 2011-12-27 at 21:33 +0100, Ben Hutchings wrote: > > > This allows uswsusp built for i386 to run on an x86_64 kernel (tested > > > with Debian package version 1.0+20110509-2). > > > > Now I wonder whether all this code was necessary. > > > > [...] > > > +#ifdef CONFIG_COMPAT > > > + > > > +struct compat_resume_swap_area { > > > + compat_loff_t offset; > > > + u32 dev; > > > +} __packed; > > [...] > > > > Is there actually any case where this doesn't have compatible layout > > with struct resume_swap_area? It may have lower alignment, but > > misalignment is dealt with automatically when copying in/out of > > userland. > > Quite frankly, I'm not 100% sure.
If it wasn't for the '__packed' in the declaration of struct resume_swap_area, there would be 4 trailing bytes of padding on 64-bit architectures and none on most 32-bit architectures. But __packed should inhibit that padding. I was apparently mistaken about put_user(); that would need to be changed to put_user_unaligned() if we want to handle compat_loff_t without a wrapper. > > If the structure size was variable then the ioctl number would be as > > well, and commit cf007e3526a785a95a738d5a8fba44f1f4fe33e0 is supposed to > > have removed the last ioctls that had that problem. > > > > So maybe the compat function can be as simple as: > > > > static long > > snapshot_compat_ioctl(struct file *file, unsigned int cmd, unsigned long > > arg) > > { > > BUILD_BUG_ON(sizeof(loff_t) != sizeof(compat_loff_t)); > > BUILD_BUG_ON(sizeof(struct resume_swap_area) != > > sizeof(struct compat_resume_swap_area)); > > > > Well, I'd prefer to fail the ioctl in the above situations instead of crashing > the kernel. This is a compile-time check... > > switch (cmd) { > > case SNAPSHOT_SET_SWAP_AREA: > > case SNAPSHOT_GET_IMAGE_SIZE: > > case SNAPSHOT_CREATE_IMAGE: > > case SNAPSHOT_AVAIL_SWAP_SIZE: > > case SNAPSHOT_ALLOC_SWAP_PAGE: > > return snapshot_ioctl(file, cmd, > > (unsigned long) compat_ptr(arg)); > > > > default: > > return snapshot_ioctl(file, cmd, arg); > > } > > } > > Does it acutally work? I haven't tested, but in any case testing on x86 wouldn't prove that this works for any other 32/64-bit architecture pair. Ben. -- Ben Hutchings Design a system any fool can use, and only a fool will want to use it.
signature.asc
Description: This is a digitally signed message part