Bug 518581

Summary: [RHEL5] glibc misses sync_file_range syscall interface
Product: Red Hat Enterprise Linux 5 Reporter: Kirby Zhou <kirbyzhou>
Component: glibcAssignee: Andreas Schwab <schwab>
Status: CLOSED CANTFIX QA Contact: BaseOS QE <qe-baseos-auto>
Severity: medium Docs Contact:
Priority: low    
Version: 5.3CC: drepper, jde
Target Milestone: rc   
Target Release: ---   
Hardware: All   
OS: Linux   
Whiteboard:
Fixed In Version: Doc Type: Bug Fix
Doc Text:
Story Points: ---
Clone Of: Environment:
Last Closed: 2009-11-23 03:19:55 UTC Type: ---
Regression: --- Mount Type: ---
Documentation: --- CRM:
Verified Versions: Category: ---
oVirt Team: --- RHEL 7.3 requirements from Atomic Host:
Cloudforms Team: --- Target Upstream Version:
Embargoed:

Description Kirby Zhou 2009-08-21 03:37:55 UTC
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

Version-Release number of selected component (if applicable):

RHEL-5.3
glibc-2.5-34

How reproducible:

100%

Steps to Reproduce:
1. use nm to detect symbol

~]# nm -D /lib64/*.so* | fgrep sync_file_range
nothing found.

2. use gcc to detect symbol
~]# cat s.cc 
#define __GNU_SOURCE

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>

char buffer[10000];

int main()
{
        int fd = open("./xxx", O_RDWR|O_CREAT, 0666);
        if (fd < 0) {
                perror("open");
                exit(1);
        }
        if (write(fd, &buffer, sizeof(buffer)) <= 0) {
                perror("write");
                exit(1);
        }
        if (sync_file_range(fd, 0, 8192, SYNC_FILE_RANGE_WRITE) < 0) {
                perror("sync_file_range");
                exit(1);
        }

}
~]# g++ s.cc -lrt -lpthread -lcrypt -lutil -lresolv -lm -lnsl -lanl -lcidn 
/tmp/ccOaK6Vj.o: In function `main':
s.cc:(.text+0x81): undefined reference to `sync_file_range'
collect2: ld returned 1 exit status
  
Actual results:
nm found no .so contains sync_file_range

Expected results:



Additional info:

Comment 1 Andreas Schwab 2009-08-21 07:24:24 UTC
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).

Comment 2 Kirby Zhou 2009-08-21 10:54:05 UTC
Can give me a example how to use syscall(3) to call sync_file_range?

Comment 3 Ulrich Drepper 2009-11-23 03:19:55 UTC
As comment #1 says, no chance to backport this.

See the syscall man page for instructions.

Comment 4 Jon E 2010-03-19 14:32:37 UTC
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)