diff options
| author | Nicolas Pitre <nico@cam.org> | 2006-01-14 11:35:03 -0500 |
|---|---|---|
| committer | Russell King <rmk+kernel@arm.linux.org.uk> | 2006-01-14 11:35:03 -0500 |
| commit | 713c481519f19df9e6d90f257e7da0336b057592 (patch) | |
| tree | b8242d9f1b94f94a7075a021a3f80ddf0c0de25c | |
| parent | 704bdda03827db8a551e82b312037d63ba3c22ff (diff) | |
[ARM] 3108/2: old ABI compat: statfs64 and fstatfs64
Patch from Nicolas Pitre
struct statfs64 has extra padding with EABI growing its size from 84 to
88. This struct is now __attribute__((packed,aligned(4))) with a small
assembly wrapper to force the sz argument to 84 if it is 88 to avoid
copying the extra padding over user space memory unexpecting it.
Signed-off-by: Nicolas Pitre <nico@cam.org>
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
| -rw-r--r-- | arch/arm/kernel/calls.S | 4 | ||||
| -rw-r--r-- | arch/arm/kernel/entry-common.S | 10 | ||||
| -rw-r--r-- | include/asm-arm/statfs.h | 38 |
3 files changed, 49 insertions, 3 deletions
diff --git a/arch/arm/kernel/calls.S b/arch/arm/kernel/calls.S index 55076a75e5bf..8c0bf04814b1 100644 --- a/arch/arm/kernel/calls.S +++ b/arch/arm/kernel/calls.S | |||
| @@ -280,8 +280,8 @@ __syscall_start: | |||
| 280 | .long sys_clock_gettime | 280 | .long sys_clock_gettime |
| 281 | .long sys_clock_getres | 281 | .long sys_clock_getres |
| 282 | /* 265 */ .long sys_clock_nanosleep | 282 | /* 265 */ .long sys_clock_nanosleep |
| 283 | .long sys_statfs64 | 283 | .long sys_statfs64_wrapper |
| 284 | .long sys_fstatfs64 | 284 | .long sys_fstatfs64_wrapper |
| 285 | .long sys_tgkill | 285 | .long sys_tgkill |
| 286 | .long sys_utimes | 286 | .long sys_utimes |
| 287 | /* 270 */ .long sys_arm_fadvise64_64 | 287 | /* 270 */ .long sys_arm_fadvise64_64 |
diff --git a/arch/arm/kernel/entry-common.S b/arch/arm/kernel/entry-common.S index 34826bcceb7a..ee63ee78d84f 100644 --- a/arch/arm/kernel/entry-common.S +++ b/arch/arm/kernel/entry-common.S | |||
| @@ -262,6 +262,16 @@ sys_sigaltstack_wrapper: | |||
| 262 | ldr r2, [sp, #S_OFF + S_SP] | 262 | ldr r2, [sp, #S_OFF + S_SP] |
| 263 | b do_sigaltstack | 263 | b do_sigaltstack |
| 264 | 264 | ||
| 265 | sys_statfs64_wrapper: | ||
| 266 | teq r1, #88 | ||
| 267 | moveq r1, #84 | ||
| 268 | b sys_statfs64 | ||
| 269 | |||
| 270 | sys_fstatfs64_wrapper: | ||
| 271 | teq r1, #88 | ||
| 272 | moveq r1, #84 | ||
| 273 | b sys_fstatfs64 | ||
| 274 | |||
| 265 | /* | 275 | /* |
| 266 | * Note: off_4k (r5) is always units of 4K. If we can't do the requested | 276 | * Note: off_4k (r5) is always units of 4K. If we can't do the requested |
| 267 | * offset, we return EINVAL. | 277 | * offset, we return EINVAL. |
diff --git a/include/asm-arm/statfs.h b/include/asm-arm/statfs.h index e81f82783b87..a02e6a8c3d70 100644 --- a/include/asm-arm/statfs.h +++ b/include/asm-arm/statfs.h | |||
| @@ -1,6 +1,42 @@ | |||
| 1 | #ifndef _ASMARM_STATFS_H | 1 | #ifndef _ASMARM_STATFS_H |
| 2 | #define _ASMARM_STATFS_H | 2 | #define _ASMARM_STATFS_H |
| 3 | 3 | ||
| 4 | #include <asm-generic/statfs.h> | 4 | #ifndef __KERNEL_STRICT_NAMES |
| 5 | # include <linux/types.h> | ||
| 6 | typedef __kernel_fsid_t fsid_t; | ||
| 7 | #endif | ||
| 8 | |||
| 9 | struct statfs { | ||
| 10 | __u32 f_type; | ||
| 11 | __u32 f_bsize; | ||
| 12 | __u32 f_blocks; | ||
| 13 | __u32 f_bfree; | ||
| 14 | __u32 f_bavail; | ||
| 15 | __u32 f_files; | ||
| 16 | __u32 f_ffree; | ||
| 17 | __kernel_fsid_t f_fsid; | ||
| 18 | __u32 f_namelen; | ||
| 19 | __u32 f_frsize; | ||
| 20 | __u32 f_spare[5]; | ||
| 21 | }; | ||
| 22 | |||
| 23 | /* | ||
| 24 | * With EABI there is 4 bytes of padding added to this structure. | ||
| 25 | * Let's pack it so the padding goes away to simplify dual ABI support. | ||
| 26 | * Note that user space does NOT have to pack this structure. | ||
| 27 | */ | ||
| 28 | struct statfs64 { | ||
| 29 | __u32 f_type; | ||
| 30 | __u32 f_bsize; | ||
| 31 | __u64 f_blocks; | ||
| 32 | __u64 f_bfree; | ||
| 33 | __u64 f_bavail; | ||
| 34 | __u64 f_files; | ||
| 35 | __u64 f_ffree; | ||
| 36 | __kernel_fsid_t f_fsid; | ||
| 37 | __u32 f_namelen; | ||
| 38 | __u32 f_frsize; | ||
| 39 | __u32 f_spare[5]; | ||
| 40 | } __attribute__ ((packed,aligned(4))); | ||
| 5 | 41 | ||
| 6 | #endif | 42 | #endif |
