Marcus Meissner wrote: > On Tue, Aug 12, 2008 at 11:44:20PM -0600, Vitaliy Margolen wrote: >> While debugging some force-feedback issues ran into an interesting problem. >> The size of one struct from include/linux differs between 32-bit and 64-bit. >> That wouldn't be a major problem except that size is the part of the ioctl() >> request. Which results in EINVAL. >> >> In more details: >> input.h: >> #define EVIOCSFF _IOC(_IOC_WRITE, 'E', 0x80, sizeof(struct ff_effect)) >> >> The simple test program: >> >> #include <linux/input.h> >> #include <stdio.h> >> int main(int argc, char * argv[]) >> { >> printf("sizeof(struct ff_effect) = %d EVIOCSFF=%#x\n", sizeof(struct >> ff_effect), EVIOCSFF); >> >> return 0; >> } >> >> >> $ gcc test_size.c -o test_size && ./test_size >> sizeof(struct ff_effect) = 48 EVIOCSFF=0x40304580 >> $ gcc -m32 test_size.c -o test_size32 && ./test_size32 >> sizeof(struct ff_effect) = 44 EVIOCSFF=0x402c4580 >> >> The question is what do we do about it? I'm sure there are might be more >> cases like that. > > The kernel is supposed to handle this transparently. > > I would report this to the kernel developers, mention "32bit compatibility" > or so.
Just for the record, it has been fixed for 2.6.27: http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commitdiff;h=f2278f31d6feb9036eaa79f2e8abcce850420abd -- Anssi Hannula