#include <linux/compat.h>
 #include <linux/vfs.h>
 #include <linux/ptrace.h>
+#include <linux/fadvise.h>
 
 #include <asm/types.h>
 #include <asm/ipc.h>
 
        return ret;
 }
+
+/*
+ * 31 bit emulation wrapper functions for sys_fadvise64/fadvise64_64.
+ * These need to rewrite the advise values for POSIX_FADV_{DONTNEED,NOREUSE}
+ * because the 31 bit values differ from the 64 bit values.
+ */
+
+asmlinkage long
+sys32_fadvise64(int fd, loff_t offset, size_t len, int advise)
+{
+       if (advise == 4)
+               advise = POSIX_FADV_DONTNEED;
+       else if (advise == 5)
+               advise = POSIX_FADV_NOREUSE;
+       return sys_fadvise64(fd, offset, len, advise);
+}
+
+struct fadvise64_64_args {
+       int fd;
+       long long offset;
+       long long len;
+       int advice;
+};
+
+asmlinkage long
+sys32_fadvise64_64(struct fadvise64_64_args __user *args)
+{
+       struct fadvise64_64_args a;
+
+       if ( copy_from_user(&a, args, sizeof(a)) )
+               return -EFAULT;
+       if (a.advice == 4)
+               a.advice = POSIX_FADV_DONTNEED;
+       else if (a.advice == 5)
+               a.advice = POSIX_FADV_NOREUSE;
+       return sys_fadvise64_64(a.fd, a.offset, a.len, a.advice);
+}
 
        or      %r3,%r4                 # get low word of 64bit loff_t
        llgfr   %r4,%r5                 # size_t (unsigned long)
        lgfr    %r5,%r6                 # int
-       jg      sys_fadvise64
+       jg      sys32_fadvise64
 
        .globl  sys32_fadvise64_64_wrapper
 sys32_fadvise64_64_wrapper:
        llgtr   %r2,%r2                 # struct fadvise64_64_args *
-       jg      s390_fadvise64_64
+       jg      sys32_fadvise64_64
 
        .globl  sys32_clock_settime_wrapper
 sys32_clock_settime_wrapper:
 
 #define POSIX_FADV_RANDOM      1 /* Expect random page references.  */
 #define POSIX_FADV_SEQUENTIAL  2 /* Expect sequential page references.  */
 #define POSIX_FADV_WILLNEED    3 /* Will need these pages.  */
+
+/*
+ * The advise values for POSIX_FADV_DONTNEED and POSIX_ADV_NOREUSE
+ * for s390-64 differ from the values for the rest of the world.
+ */
+#if defined(__s390x__)
+#define POSIX_FADV_DONTNEED    6 /* Don't need these pages.  */
+#define POSIX_FADV_NOREUSE     7 /* Data will be accessed once.  */
+#else
 #define POSIX_FADV_DONTNEED    4 /* Don't need these pages.  */
 #define POSIX_FADV_NOREUSE     5 /* Data will be accessed once.  */
+#endif
 
 #endif /* FADVISE_H_INCLUDED */