| 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 <donn.seeley@windriver.com> |
| Signed-off-by: Lei Liu <lei.liu2@windriver.com> |
| --- |
| 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) |
| { |