Source: xfsprogs
Version: 4.9.0+nmu1
Severity: important
Tags: upstream patch
User: [email protected]
Usertags: 2.27

xfsprogs 4.9.0+nmu1 fails to build with glibc 2.27 (2.27-0experimental0 from
experimental):

|     [CC]     copy_file_range.o
| copy_file_range.c:46:1: error: conflicting types for 'copy_file_range'
|  copy_file_range(int fd, loff_t *src, loff_t *dst, size_t len)
|  ^~~~~~~~~~~~~~~
| In file included from ../include/platform_defs.h:33:0,
|                  from ../include/project.h:21,
|                  from ../include/input.h:24,
|                  from copy_file_range.c:23:
| /usr/include/unistd.h:1110:9: note: previous declaration of 'copy_file_range' 
was here
|  ssize_t copy_file_range (int __infd, __off64_t *__pinoff,
|          ^~~~~~~~~~~~~~~
| ../include/buildrules:59: recipe for target 'copy_file_range.o' failed
| make[3]: *** [copy_file_range.o] Error 1
| include/buildrules:35: recipe for target 'io' failed
| make[2]: *** [io] Error 2
| Makefile:74: recipe for target 'default' failed
| make[1]: *** [default] Error 2
| make[1]: Leaving directory '/<<BUILDDIR>>/xfsprogs-4.9.0+nmu1'
| debian/rules:30: recipe for target 'built' failed
| make: *** [built] Error 2
| dpkg-buildpackage: error: debian/rules build subprocess returned exit status 2

A full build logs is available there:
http://aws-logs.debian.net/2018/02/07/glibc-exp/xfsprogs_4.9.0+nmu1_unstable_glibc-exp.log


glibc 2.27 added support for copy_file_range. Unfortunately xfsprogs
also have such a function to wrap the corresponding syscall.

The problem has been fixed in upstream commit 8041435d. I have
backported it and attached it as a patch to this bug.
diff -Nru xfsprogs-4.9.0+nmu1/io/copy_file_range.c 
xfsprogs-4.9.0+nmu2/io/copy_file_range.c
--- xfsprogs-4.9.0+nmu1/io/copy_file_range.c
+++ xfsprogs-4.9.0+nmu2/io/copy_file_range.c
@@ -42,8 +42,12 @@
 "));
 }
 
+/*
+ * Issue a raw copy_file_range syscall; for our test program we don't want the
+ * glibc buffered copy fallback.
+ */
 static loff_t
-copy_file_range(int fd, loff_t *src, loff_t *dst, size_t len)
+copy_file_range_cmd(int fd, loff_t *src, loff_t *dst, size_t len)
 {
        loff_t ret;
 
@@ -127,7 +131,7 @@
                copy_dst_truncate();
        }
 
-       ret = copy_file_range(fd, &src, &dst, len);
+       ret = copy_file_range_cmd(fd, &src, &dst, len);
        close(fd);
        return ret;
 }

Reply via email to