From: Daan De Meyer Date: Mon, 14 Aug 2023 13:32:22 +0000 (+0200) Subject: fs-util: Add XO_SUBVOLUME flag for xopenat() X-Git-Tag: v255-rc1~724^2~3 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=bc6a6130ace354ac774cbc8e55dad2eec4a02643;p=thirdparty%2Fsystemd.git fs-util: Add XO_SUBVOLUME flag for xopenat() When specified, xopenat() will try to create a btrfs subvolume and fall back to creating a regular directory. --- diff --git a/src/basic/fs-util.c b/src/basic/fs-util.c index 804440ef2a5..a9336f1a675 100644 --- a/src/basic/fs-util.c +++ b/src/basic/fs-util.c @@ -9,6 +9,7 @@ #include #include "alloc-util.h" +#include "btrfs.h" #include "dirent-util.h" #include "fd-util.h" #include "fileio.h" @@ -1110,7 +1111,10 @@ int xopenat(int dir_fd, const char *path, int open_flags, XOpenFlags xopen_flags } if (FLAGS_SET(open_flags, O_DIRECTORY|O_CREAT)) { - r = RET_NERRNO(mkdirat(dir_fd, path, mode)); + if (FLAGS_SET(xopen_flags, XO_SUBVOLUME)) + r = btrfs_subvol_make_fallback(dir_fd, path, mode); + else + r = RET_NERRNO(mkdirat(dir_fd, path, mode)); if (r == -EEXIST) { if (FLAGS_SET(open_flags, O_EXCL)) return -EEXIST; diff --git a/src/basic/fs-util.h b/src/basic/fs-util.h index a19836d1389..1023ab73cac 100644 --- a/src/basic/fs-util.h +++ b/src/basic/fs-util.h @@ -133,7 +133,8 @@ int open_mkdir_at(int dirfd, const char *path, int flags, mode_t mode); int openat_report_new(int dirfd, const char *pathname, int flags, mode_t mode, bool *ret_newly_created); typedef enum XOpenFlags { - XO_LABEL = 1 << 0, + XO_LABEL = 1 << 0, + XO_SUBVOLUME = 1 << 1, } XOpenFlags; int xopenat(int dir_fd, const char *path, int open_flags, XOpenFlags xopen_flags, mode_t mode);