[ARM] 4878/1: Add oabi shim for fstatat64
authorRiku Voipio <riku.voipio@iki.fi>
Fri, 28 Mar 2008 12:08:09 +0000 (13:08 +0100)
committerRussell King <rmk+kernel@arm.linux.org.uk>
Fri, 28 Mar 2008 15:00:46 +0000 (15:00 +0000)
Ccoreutils and other have started using fstatat64. Thus, we
need a shim for it if we want to support modern oldabi
userlands (such as Debian/arm/lenny) with EABI kernels.

See http://bugs.debian.org/462677

Acked-by: Nicolas Pitre <nico@cam.org>
Signed-off-by: Riku Voipio <riku.voipio@movial.fi>
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
arch/arm/kernel/calls.S
arch/arm/kernel/sys_oabi-compat.c

index 283e14fff993dde1881b005aa6dbb1598e359780..7e97b7376563d2b6afbce8803b2ab796d29e87d9 100644 (file)
                CALL(sys_mknodat)
 /* 325 */      CALL(sys_fchownat)
                CALL(sys_futimesat)
-               CALL(sys_fstatat64)
+               CALL(ABI(sys_fstatat64,  sys_oabi_fstatat64))
                CALL(sys_unlinkat)
                CALL(sys_renameat)
 /* 330 */      CALL(sys_linkat)
index e8b98046895b9b3907e9f02b2dc4d7393cdfc424..96ab5f52949c99d145aea4be30f077e5ea34ef9f 100644 (file)
@@ -25,6 +25,7 @@
  * sys_stat64:
  * sys_lstat64:
  * sys_fstat64:
+ * sys_fstatat64:
  *
  *   struct stat64 has different sizes and some members are shifted
  *   Compatibility wrappers are needed for them and provided below.
@@ -169,6 +170,29 @@ asmlinkage long sys_oabi_fstat64(unsigned long fd,
        return error;
 }
 
+asmlinkage long sys_oabi_fstatat64(int dfd,
+                                  char __user *filename,
+                                  struct oldabi_stat64  __user *statbuf,
+                                  int flag)
+{
+       struct kstat stat;
+       int error = -EINVAL;
+
+       if ((flag & ~AT_SYMLINK_NOFOLLOW) != 0)
+               goto out;
+
+       if (flag & AT_SYMLINK_NOFOLLOW)
+               error = vfs_lstat_fd(dfd, filename, &stat);
+       else
+               error = vfs_stat_fd(dfd, filename, &stat);
+
+       if (!error)
+       error = cp_oldabi_stat64(&stat, statbuf);
+
+out:
+       return error;
+}
+
 struct oabi_flock64 {
        short   l_type;
        short   l_whence;