|
@@ -58,6 +58,7 @@
|
|
|
#include <linux/compat.h>
|
|
|
#include <linux/vfs.h>
|
|
|
#include <linux/ptrace.h>
|
|
|
+#include <linux/fadvise.h>
|
|
|
|
|
|
#include <asm/types.h>
|
|
|
#include <asm/ipc.h>
|
|
@@ -1043,3 +1044,40 @@ sys32_timer_create(clockid_t which_clock, struct compat_sigevent *se32,
|
|
|
|
|
|
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);
|
|
|
+}
|