about summary refs log tree commit diff
path: root/sysdeps/unix
diff options
context:
space:
mode:
authorMike Frysinger <vapier@gentoo.org>2012-12-06 15:01:35 -0500
committerMike Frysinger <vapier@gentoo.org>2012-12-06 20:00:43 -0500
commite933a9432cab6ff8d7995b984f0da625b3592f88 (patch)
treec17464bd30542a941dcaa6b27220e794fcd7ea00 /sysdeps/unix
parent270a72ed73df7a6fd6c73dd1fa1d577a348400dc (diff)
downloadglibc-e933a9432cab6ff8d7995b984f0da625b3592f88.tar.gz
glibc-e933a9432cab6ff8d7995b984f0da625b3592f88.tar.xz
glibc-e933a9432cab6ff8d7995b984f0da625b3592f88.zip
linux: posix_fadvise: support __NR_fadvise64_64
Some arches do not have a __NR_fadvise64 but do have __NR_fadvise64_64.
If the former is unavailable, fallback to the latter.

Reviewed-by: Carlos O'Donell <carlos@systemhalted.org>
Signed-off-by: Mike Frysinger <vapier@gentoo.org>
Diffstat (limited to 'sysdeps/unix')
-rw-r--r--sysdeps/unix/sysv/linux/posix_fadvise.c13
1 files changed, 11 insertions, 2 deletions
diff --git a/sysdeps/unix/sysv/linux/posix_fadvise.c b/sysdeps/unix/sysv/linux/posix_fadvise.c
index cf28faf9bd..064281ffc8 100644
--- a/sysdeps/unix/sysv/linux/posix_fadvise.c
+++ b/sysdeps/unix/sysv/linux/posix_fadvise.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 2003 Free Software Foundation, Inc.
+/* Copyright (C) 2003-2012 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
@@ -25,11 +25,20 @@
 int
 posix_fadvise (int fd, off_t offset, off_t len, int advise)
 {
-#ifdef __NR_fadvise64
+#if defined(__NR_fadvise64) || defined(__NR_fadvise64_64)
   INTERNAL_SYSCALL_DECL (err);
+# ifdef __NR_fadvise64
   int ret = INTERNAL_SYSCALL (fadvise64, err, 5, fd,
 			      __LONG_LONG_PAIR (offset >> 31, offset), len,
 			      advise);
+# else
+  int ret = INTERNAL_SYSCALL (fadvise64_64, err, 6, fd,
+			      __LONG_LONG_PAIR ((long) (offset >> 31),
+						(long) offset),
+			      __LONG_LONG_PAIR ((long) (len >> 31),
+						(long) len),
+			      advise);
+# endif
   if (INTERNAL_SYSCALL_ERROR_P (ret, err))
     return INTERNAL_SYSCALL_ERRNO (ret, err);
   return 0;