From 9b85e907807c0760d133e13f5886b4dd8a568c3a Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Wed, 22 Nov 2023 10:53:32 +0100 Subject: [PATCH] fs-util: add comment explaining what xopenat() is for --- TODO | 3 +++ src/basic/fs-util.c | 10 ++++++++++ 2 files changed, 13 insertions(+) diff --git a/TODO b/TODO index 5262ca828fa..d6349c74d1b 100644 --- a/TODO +++ b/TODO @@ -89,6 +89,9 @@ Janitorial Clean-ups: this up, and should probably always apply both, i.e. introduce unit_file_escape() or so, which applies both. +* xopenat() should pin the parent dir of the inode it creates before doing its + thing, so that it can create, open, label somewhat atomically. + Deprecations and removals: * Remove any support for booting without /usr pre-mounted in the initrd entirely. diff --git a/src/basic/fs-util.c b/src/basic/fs-util.c index f5a1a8edbf1..ee38e0266a6 100644 --- a/src/basic/fs-util.c +++ b/src/basic/fs-util.c @@ -1113,6 +1113,16 @@ int xopenat(int dir_fd, const char *path, int open_flags, XOpenFlags xopen_flags assert(dir_fd >= 0 || dir_fd == AT_FDCWD); + /* This is like openat(), but has a few tricks up its sleeves, extending behaviour: + * + * • O_DIRECTORY|O_CREAT is supported, which causes a directory to be created, and immediately + * opened. When used with the XO_SUBVOLUME flag this will even create a btrfs subvolume. + * + * • If O_CREAT is used with XO_LABEL, any created file will be immediately relabelled. + * + * • If the path is specified NULL or empty, behaves like fd_reopen(). + */ + if (isempty(path)) { assert(!FLAGS_SET(open_flags, O_CREAT|O_EXCL)); return fd_reopen(dir_fd, open_flags & ~O_NOFOLLOW);