-
Notifications
You must be signed in to change notification settings - Fork 93
/
glibc2.5-sync_file_range.patch
86 lines (65 loc) · 2.9 KB
/
glibc2.5-sync_file_range.patch
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
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)
{