From f5254d004727cfded5bc739d8115fb570ea5631f Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Wed, 16 Aug 2023 12:11:06 +0200 Subject: [PATCH 1/2] btrfs: drop O_PATH from dir_fd passed to btrfs_subvol_make() if needed Let's make sure btrfs_subvol_make() can operate on O_PATH fds, just like mkdirat(). Fixes a bunch of tmpfiles errors at boot if we try to create btrfs subvols, introduced by e54c79ccc2e90a375640815b05f28ec22664e44c Fixes: e54c79ccc2e90a375640815b05f28ec22664e44c --- src/basic/btrfs.c | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/src/basic/btrfs.c b/src/basic/btrfs.c index a13fec4873..78957a1d2b 100644 --- a/src/basic/btrfs.c +++ b/src/basic/btrfs.c @@ -40,7 +40,7 @@ static int extract_subvolume_name(const char *path, char **ret) { int btrfs_subvol_make(int dir_fd, const char *path) { struct btrfs_ioctl_vol_args args = {}; - _cleanup_free_ char *subvolume = NULL; + _cleanup_free_ char *subvolume = NULL, *parent = NULL; _cleanup_close_ int fd = -EBADF; int r; @@ -51,11 +51,18 @@ int btrfs_subvol_make(int dir_fd, const char *path) { if (r < 0) return r; - r = path_extract_directory(path, NULL); - if (r >= 0) { - fd = open_parent_at(dir_fd, path, O_RDONLY|O_CLOEXEC|O_CLOEXEC, 0); + r = path_extract_directory(path, &parent); + if (r < 0) { + if (r != -EDESTADDRREQ) /* Propagate error, unless only a filename was specified, which is OK */ + return r; + + dir_fd = fd_reopen_condition(dir_fd, O_CLOEXEC, O_PATH, &fd); /* drop O_PATH if it is set */ + if (dir_fd < 0) + return dir_fd; + } else { + fd = openat(dir_fd, parent, O_DIRECTORY|O_RDONLY|O_CLOEXEC, 0); if (fd < 0) - return fd; + return -errno; dir_fd = fd; } From 33b2da2d5bd84f8bd1f7ef4e669fde6620fab1c3 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Wed, 16 Aug 2023 12:12:07 +0200 Subject: [PATCH 2/2] btrfs: use ERRNO_IS_NOT_SUPPORTED() where appropriate --- src/basic/btrfs.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/basic/btrfs.c b/src/basic/btrfs.c index 78957a1d2b..bb07374def 100644 --- a/src/basic/btrfs.c +++ b/src/basic/btrfs.c @@ -88,7 +88,7 @@ int btrfs_subvol_make_fallback(int dir_fd, const char *path, mode_t mode) { if (r >= 0) return 1; /* subvol worked */ - if (r != -ENOTTY) + if (!ERRNO_IS_NOT_SUPPORTED(r)) return r; if (mkdirat(dir_fd, path, mode) < 0)