[ARM] 3108/2: old ABI compat: statfs64 and fstatfs64
authorNicolas Pitre <nico@cam.org>
Sat, 14 Jan 2006 16:35:03 +0000 (16:35 +0000)
committerRussell King <rmk+kernel@arm.linux.org.uk>
Sat, 14 Jan 2006 16:35:03 +0000 (16:35 +0000)
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>
arch/arm/kernel/calls.S
arch/arm/kernel/entry-common.S
include/asm-arm/statfs.h

index 55076a75e5bf3794de942c7f7abe3e1993bfb18e..8c0bf04814b1c04c26d98c6b4038810bb6af02f6 100644 (file)
@@ -280,8 +280,8 @@ __syscall_start:
                .long   sys_clock_gettime
                .long   sys_clock_getres
 /* 265 */      .long   sys_clock_nanosleep
-               .long   sys_statfs64
-               .long   sys_fstatfs64
+               .long   sys_statfs64_wrapper
+               .long   sys_fstatfs64_wrapper
                .long   sys_tgkill
                .long   sys_utimes
 /* 270 */      .long   sys_arm_fadvise64_64
index 34826bcceb7aa07dadb9c5a1999b7f96b5adc355..ee63ee78d84fa4f1669697bcbfe199c9527166eb 100644 (file)
@@ -262,6 +262,16 @@ sys_sigaltstack_wrapper:
                ldr     r2, [sp, #S_OFF + S_SP]
                b       do_sigaltstack
 
+sys_statfs64_wrapper:
+               teq     r1, #88
+               moveq   r1, #84
+               b       sys_statfs64
+
+sys_fstatfs64_wrapper:
+               teq     r1, #88
+               moveq   r1, #84
+               b       sys_fstatfs64
+
 /*
  * Note: off_4k (r5) is always units of 4K.  If we can't do the requested
  * offset, we return EINVAL.
index e81f82783b878d64717af7885a1842e56c1b4929..a02e6a8c3d70ac2d681ef9dd35a426426f1b0ae4 100644 (file)
@@ -1,6 +1,42 @@
 #ifndef _ASMARM_STATFS_H
 #define _ASMARM_STATFS_H
 
-#include <asm-generic/statfs.h>
+#ifndef __KERNEL_STRICT_NAMES
+# include <linux/types.h>
+typedef __kernel_fsid_t        fsid_t;
+#endif
+
+struct statfs {
+       __u32 f_type;
+       __u32 f_bsize;
+       __u32 f_blocks;
+       __u32 f_bfree;
+       __u32 f_bavail;
+       __u32 f_files;
+       __u32 f_ffree;
+       __kernel_fsid_t f_fsid;
+       __u32 f_namelen;
+       __u32 f_frsize;
+       __u32 f_spare[5];
+};
+
+/*
+ * With EABI there is 4 bytes of padding added to this structure.
+ * Let's pack it so the padding goes away to simplify dual ABI support.
+ * Note that user space does NOT have to pack this structure.
+ */
+struct statfs64 {
+       __u32 f_type;
+       __u32 f_bsize;
+       __u64 f_blocks;
+       __u64 f_bfree;
+       __u64 f_bavail;
+       __u64 f_files;
+       __u64 f_ffree;
+       __kernel_fsid_t f_fsid;
+       __u32 f_namelen;
+       __u32 f_frsize;
+       __u32 f_spare[5];
+} __attribute__ ((packed,aligned(4)));
 
 #endif