summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJohn Williams <john.williams@xilinx.com>2013-03-11 23:01:18 -0700
committerJohn Williams <john.williams@xilinx.com>2013-03-11 23:01:18 -0700
commitaa626689f022291cd3676774009494fbf87bef97 (patch)
tree3fefb219ec7d47edd2c461fa575b96febfcc5f76
parentc857e94fbfc6228eb62415c816b5b81b9806c2f5 (diff)
downloadmeta-xilinx-aa626689f022291cd3676774009494fbf87bef97.tar.gz
RHEL 5 / glibc2.5 sync_file_range syscall workaround
Signed-off-by: John Williams <john.williams@xilinx.com>
-rw-r--r--recipes-devtools/dpkg/dpkg_1.15.8.7.bbappend4
-rw-r--r--recipes-devtools/dpkg/files/glibc2.5-sync_file_range.patch88
2 files changed, 90 insertions, 2 deletions
diff --git a/recipes-devtools/dpkg/dpkg_1.15.8.7.bbappend b/recipes-devtools/dpkg/dpkg_1.15.8.7.bbappend
index dc66de5f..3c857b31 100644
--- a/recipes-devtools/dpkg/dpkg_1.15.8.7.bbappend
+++ b/recipes-devtools/dpkg/dpkg_1.15.8.7.bbappend
@@ -2,5 +2,5 @@ PRINC = "1"
2 2
3FILESEXTRAPATHS_prepend := "${THISDIR}/files" 3FILESEXTRAPATHS_prepend := "${THISDIR}/files"
4 4
5SRC_URI += "file://no-vla-warning.patch" 5SRC_URI += "file://no-vla-warning.patch \
6 6 file://glibc2.5-sync_file_range.patch"
diff --git a/recipes-devtools/dpkg/files/glibc2.5-sync_file_range.patch b/recipes-devtools/dpkg/files/glibc2.5-sync_file_range.patch
new file mode 100644
index 00000000..1c9b6e87
--- /dev/null
+++ b/recipes-devtools/dpkg/files/glibc2.5-sync_file_range.patch
@@ -0,0 +1,88 @@
1CentOS 5.8 kernels and headers support the sync_file_range() system call,
2but glibc 2.5 doesn't provide the syscall stub. It appears that this
3problem is known but will never be fixed:
4
5 https://bugzilla.redhat.com/show_bug.cgi?id=518581
6
7 Bug 518581 - [RHEL5] glibc misses sync_file_range syscall interface
8
9 Status: CLOSED CANTFIX
10 Last Closed: 2009-11-22 22:19:55
11
12 Kirby Zhou 2009-08-20 23:37:55 EDT
13
14 Description of problem:
15
16 glibc misses sync_file_range syscall interface. The header file and
17 man page both say 'sync_file_range' should exist. From man page,
18 sync_file_range should exist sinc kernel-2.6.17
19
20 Andreas Schwab 2009-08-21 03:24:24 EDT
21
22 It has only been added to glibc 2.6, and cannot be backported due to
23 ABI breakage. You can always fall back to syscall(3).
24
25 Ulrich Drepper 2009-11-22 22:19:55 EST
26
27 As comment #1 says, no chance to backport this.
28
29 See the syscall man page for instructions.
30
31 Jon E 2010-03-19 10:32:37 EDT
32
33 then why document it if it's broken and you're not going to fix it?
34 .. might want to FTFM over at sync_file_range(2) - in the meantime -
35 borrowing from glibc 2.6 .. any thoughts on this implementation for a
36 hacky workaround for those still on your "ancient releases" .. (eg:
37 RHEL5.3)?:
38
39 #ifdef ULI_WONT_FIX_THIS_IN_GLIBC2.5
40 #define NR_sync_file_range 277
41 int sync_file_range (int fd, __off64_t from, __off64_t to, unsigned int flags)
42 {
43 return syscall (NR_sync_file_range, fd,
44 __LONG_LONG_PAIR ((long) (from >> 32), (long) from),
45 __LONG_LONG_PAIR ((long) (to >> 32), (long) to),
46 flags);
47 }
48 #endif
49
50 assuming of course that you're on an x86_64 and include/asm-
51 x86_64/unistd.h has the correct entry
52
53 (fwiw - fio is starting to use this now)
54
55Rather than attempting to provide an implementation using syscall(),
56we take the more conservative route and ignore header support for
57sync_file_range() flags when the glibc version is <= 2.5.
58
59Upstream-Status: Inappropriate [everyone else builds on newer hosts :-)]
60
61Signed-off-by: Donn Seeley <donn.seeley at windriver.com>
62---
63 src/archives.c | 4 ++--
64 1 file changed, 2 insertions(+), 2 deletions(-)
65
66--- a/src/archives.c
67+++ b/src/archives.c
68@@ -85,7 +85,7 @@ static int safe_read(int fd, void *buf,
69 static inline void
70 fd_writeback_init(int fd)
71 {
72-#if defined(SYNC_FILE_RANGE_WRITE)
73+#if defined(SYNC_FILE_RANGE_WRITE) && __GLIBC_PREREQ(2, 6)
74 sync_file_range(fd, 0, 0, SYNC_FILE_RANGE_WRITE);
75 #elif defined(HAVE_POSIX_FADVISE)
76 posix_fadvise(fd, 0, 0, POSIX_FADV_DONTNEED);
77@@ -862,7 +862,7 @@ tarobject(void *ctx, struct tar_entry *t
78 return 0;
79 }
80
81-#if defined(SYNC_FILE_RANGE_WAIT_BEFORE)
82+#if defined(SYNC_FILE_RANGE_WAIT_BEFORE) && __GLIBC_PREREQ(2, 6)
83 static void
84 tar_writeback_barrier(struct fileinlist *files, struct pkginfo *pkg)
85 {
86--
871.7.6.5
88