Bug#414932: linux-image-2.6.18-4-ixp4xx: xfs partition from x86 system can not be used on arm
Root cause seems to be gcc misaligning the xfs shortform directory
structures. In the example below, bar.parent has offset 4, while
boo.parent has offset 2. The union seems to cause extra padding - I
believe "c" should be at offset 2 in both structures.
This is leading to trouble in xfs_dir2_sf_hdr_t and others, and is
unfortunately leading to on-disk corruption, I think. The patch that's
been floating around to "fix" this probably only masks the problem, by
accommodating the extra padding when calculating sizes.
#include <stdio.h>
struct bar {
unsigned char a;
unsigned char b;
union {
unsigned char x;
unsigned char y;
} c;
};
struct boo {
unsigned char a;
unsigned char b;
unsigned char c;
};
#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
int main(int argc, char ** argv) {
printf("a: %d\n", offsetof(struct bar, a));
printf("b: %d\n", offsetof(struct bar, b));
printf("c: %d\n", offsetof(struct bar, c));
printf("a: %d\n", offsetof(struct boo, a));
printf("b: %d\n", offsetof(struct boo, b));
printf("c: %d\n", offsetof(struct boo, c));
return 0;
}
sandeen@all6500-arm:~$ ./gcc-test
a: 0
b: 1
c: 4
a: 0
b: 1
c: 2
sandeen@all6500-arm:~$ gcc -v
Using built-in specs.
Target: arm-linux-gnu
Configured with: ../src/configure -v
--enable-languages=c,c++,fortran,objc,obj-c++,treelang --prefix=/usr
--enable-shared --with-system-zlib --libexecdir=/usr/lib
--without-included-gettext --enable-threads=posix --enable-nls
--program-suffix=-4.1 --enable-__cxa_atexit --enable-clocale=gnu
--enable-libstdcxx-debug --enable-mpfr --enable-checking=release
arm-linux-gnu
Thread model: posix
gcc version 4.1.2 20061115 (prerelease) (Debian 4.1.1-21)
sandeen@all6500-arm:~$ uname -a
Linux all6500-arm 2.6.18-4-iop32x #1 Thu Feb 22 03:51:25 UTC 2007
armv5tel GNU/Linux
Reply to: