Package: thin-provisioning-tools Version: 0.7.4-2 Severity: important Tags: patch User: ubuntu-de...@lists.ubuntu.com Usertags: origin-ubuntu bionic ubuntu-patch
Hi Bastian, In Ubuntu, thin-provisioning-tools 0.7.4-2 fails to build on ppc64el with an ICE in the compiler while building the test suite. An strace implies that this is because your LD_PRELOAD wrapper has interposed open(), but not openat(). If I extend the wrapper as in the attached patch to cover openat(), the package now builds. This build failure is probably not reproducible yet in Debian, but I expect it will be once Debian moves to glibc 2.17. I briefly looked at whether your custom LD_PRELOAD wrapper could be replaced with libeatmydata, but I see that libeatmydata only handles O_SYNC and O_DSYNC, not O_DIRECT. Do you think it would make sense to ask libeatmydata to filter O_DIRECT as well, to reduce the need for maintaining this separate .so? -- Steve Langasek Give me a lever long enough and a Free OS Debian Developer to set it on, and I can move the world. Ubuntu Developer http://www.debian.org/ slanga...@ubuntu.com vor...@debian.org
diff -Nru thin-provisioning-tools-0.7.4/debian/control thin-provisioning-tools-0.7.4/debian/control --- thin-provisioning-tools-0.7.4/debian/control 2017-11-01 14:50:39.000000000 -0700 +++ thin-provisioning-tools-0.7.4/debian/control 2018-03-19 14:10:28.000000000 -0700 @@ -1,8 +1,7 @@ Source: thin-provisioning-tools Section: admin Priority: optional -Maintainer: Ubuntu Developers <ubuntu-devel-disc...@lists.ubuntu.com> -XSBC-Original-Maintainer: Debian LVM Team <pkg-lvm-maintain...@lists.alioth.debian.org> +Maintainer: Debian LVM Team <pkg-lvm-maintain...@lists.alioth.debian.org> Uploaders: Bastian Blank <wa...@debian.org> Build-Depends: debhelper (>= 9), diff -Nru thin-provisioning-tools-0.7.4/debian/unit-tests/preload.c thin-provisioning-tools-0.7.4/debian/unit-tests/preload.c --- thin-provisioning-tools-0.7.4/debian/unit-tests/preload.c 2017-11-01 14:50:39.000000000 -0700 +++ thin-provisioning-tools-0.7.4/debian/unit-tests/preload.c 2018-03-19 14:10:17.000000000 -0700 @@ -4,13 +4,17 @@ #include <stdarg.h> #include <stdlib.h> -static int (*orig_open)(const char *pathname, int flags, int mode); +static int (*orig_open)(const char *pathname, int flags, mode_t mode); +static int (*orig_openat)(int dirfd, const char *pathname, int flags, mode_t mode); __attribute__((constructor)) static void constructor() { orig_open = dlsym(RTLD_NEXT, "open"); if (!orig_open) abort(); + orig_openat = dlsym(RTLD_NEXT, "openat"); + if (!orig_openat) + abort(); } int open(const char *file, int oflag, ...) { @@ -51,3 +55,34 @@ int __open64_2(const char *file, int oflag) { return orig_open(file, (oflag & ~O_DIRECT) | O_LARGEFILE, 0); } + +int openat(int dirfd, const char *file, int oflag, ...) { + int mode = 0; + + oflag &= ~O_DIRECT; + + if (oflag & O_CREAT) { + va_list arg; + va_start(arg, oflag); + mode = va_arg(arg, int); + va_end(arg); + } + + return orig_openat(dirfd, file, oflag, mode); +} + +int openat64(int dirfd, const char *file, int oflag, ...) { + int mode = 0; + + oflag |= O_LARGEFILE; + oflag &= ~O_DIRECT; + + if (oflag & O_CREAT) { + va_list arg; + va_start(arg, oflag); + mode = va_arg(arg, int); + va_end(arg); + } + + return orig_openat(dirfd, file, oflag, mode); +}