CentOS 5.8 kernels and headers support the sync_file_range() system call, but glibc 2.5 doesn't provide the syscall stub. It appears that this problem is known but will never be fixed: https://bugzilla.redhat.com/show_bug.cgi?id=518581 Bug 518581 - [RHEL5] glibc misses sync_file_range syscall interface Status: CLOSED CANTFIX Last Closed: 2009-11-22 22:19:55 Kirby Zhou 2009-08-20 23:37:55 EDT Description of problem: glibc misses sync_file_range syscall interface. The header file and man page both say 'sync_file_range' should exist. From man page, sync_file_range should exist sinc kernel-2.6.17 Andreas Schwab 2009-08-21 03:24:24 EDT It has only been added to glibc 2.6, and cannot be backported due to ABI breakage. You can always fall back to syscall(3). Ulrich Drepper 2009-11-22 22:19:55 EST As comment #1 says, no chance to backport this. See the syscall man page for instructions. Jon E 2010-03-19 10:32:37 EDT then why document it if it's broken and you're not going to fix it? .. might want to FTFM over at sync_file_range(2) - in the meantime - borrowing from glibc 2.6 .. any thoughts on this implementation for a hacky workaround for those still on your "ancient releases" .. (eg: RHEL5.3)?: #ifdef ULI_WONT_FIX_THIS_IN_GLIBC2.5 #define NR_sync_file_range 277 int sync_file_range (int fd, __off64_t from, __off64_t to, unsigned int flags) { return syscall (NR_sync_file_range, fd, __LONG_LONG_PAIR ((long) (from >> 32), (long) from), __LONG_LONG_PAIR ((long) (to >> 32), (long) to), flags); } #endif assuming of course that you're on an x86_64 and include/asm- x86_64/unistd.h has the correct entry (fwiw - fio is starting to use this now) Rather than attempting to provide an implementation using syscall(), we take the more conservative route and ignore header support for sync_file_range() flags when the glibc version is <= 2.5. Upstream-Status: Inappropriate [everyone else builds on newer hosts :-)] Signed-off-by: Donn Seeley Signed-off-by: Lei Liu --- src/archives.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) --- a/src/archives.c +++ b/src/archives.c @@ -75,7 +75,7 @@ /* Ignore the return code as it should be considered equivalent to an * asynchronous hint for the kernel, we are doing an fsync() later on * anyway. */ -#if defined(SYNC_FILE_RANGE_WRITE) +#if defined(SYNC_FILE_RANGE_WRITE) && __GLIBC_PREREQ(2, 6) sync_file_range(fd, 0, 0, SYNC_FILE_RANGE_WRITE); #elif defined(HAVE_POSIX_FADVISE) posix_fadvise(fd, 0, 0, POSIX_FADV_DONTNEED); @@ -1179,7 +1179,7 @@ return 0; } -#if defined(SYNC_FILE_RANGE_WAIT_BEFORE) +#if defined(SYNC_FILE_RANGE_WAIT_BEFORE) && __GLIBC_PREREQ(2, 6) static void tar_writeback_barrier(struct fileinlist *files, struct pkginfo *pkg) {