From: Lennart Poettering Date: Tue, 26 May 2020 10:52:57 +0000 (+0200) Subject: tmpfiles: deal with kernel errno change if quota is not enabled X-Git-Tag: v246-rc1~282 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=4b019d2f2d4b4dd691f92113f53cc65db683f3d9;p=thirdparty%2Fsystemd.git tmpfiles: deal with kernel errno change if quota is not enabled Old kernels returned EINVAL if quota was off but we tried to manipulate it anyway. Since https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=8a36e408d40606e21cd4e2dd9601004a67b14868 this changed: now ENOTCONN is returned. This of course is a kernel API compat breakage, but let's not make a fuss and just map EINVAL to ENOTCONN to make it recognizable the same way everywhere. Fixes: #15896 --- diff --git a/src/basic/btrfs-util.c b/src/basic/btrfs-util.c index 17ee474f733..71e1bc92eb7 100644 --- a/src/basic/btrfs-util.c +++ b/src/basic/btrfs-util.c @@ -927,9 +927,12 @@ static int qgroup_create_or_destroy(int fd, bool b, uint64_t qgroupid) { for (c = 0;; c++) { if (ioctl(fd, BTRFS_IOC_QGROUP_CREATE, &args) < 0) { - /* If quota is not enabled, we get EINVAL. Turn this into a recognizable error */ - if (errno == EINVAL) - return -ENOPROTOOPT; + /* On old kernels if quota is not enabled, we get EINVAL. On newer kernels we get + * ENOTCONN. Let's always convert this to ENOTCONN to make this recognizable + * everywhere the same way. */ + + if (IN_SET(errno, EINVAL, ENOTCONN)) + return -ENOTCONN; if (errno == EBUSY && c < 10) { (void) btrfs_quota_scan_wait(fd); diff --git a/src/tmpfiles/tmpfiles.c b/src/tmpfiles/tmpfiles.c index e9453d39351..a69411f1759 100644 --- a/src/tmpfiles/tmpfiles.c +++ b/src/tmpfiles/tmpfiles.c @@ -1625,7 +1625,7 @@ static int create_subvolume(Item *i, const char *path) { log_debug_errno(r, "Couldn't adjust quota for subvolume \"%s\" (unsupported fs or dir not a subvolume): %m", i->path); else if (r == -EROFS) log_debug_errno(r, "Couldn't adjust quota for subvolume \"%s\" (fs is read-only).", i->path); - else if (r == -ENOPROTOOPT) + else if (r == -ENOTCONN) log_debug_errno(r, "Couldn't adjust quota for subvolume \"%s\" (quota support is disabled).", i->path); else if (r < 0) q = log_error_errno(r, "Failed to adjust quota for subvolume \"%s\": %m", i->path);