]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
fs-util: optimize xopenat(XAT_FDROOT, ...) a bit
authorMike Yuan <me@yhndnzj.com>
Sun, 18 Jan 2026 23:53:48 +0000 (00:53 +0100)
committerMike Yuan <me@yhndnzj.com>
Mon, 19 Jan 2026 12:33:27 +0000 (13:33 +0100)
Follow-up for ef582ab201c2942813960ad3c451df3642d85558

* Open / with O_PATH
* Shortcut to fd_reopen() directly if path is empty

src/basic/fs-util.c

index 0159934ddb39aaaabf36a9e82d0c60d96bd8bbb5..f790ca4e136b5c22da3be4bbc919e9b49f034031 100644 (file)
@@ -1158,19 +1158,6 @@ int xopenat_full(int dir_fd, const char *path, int open_flags, XOpenFlags xopen_
          *   • The dir fd can be passed as XAT_FDROOT, in which case any relative paths will be taken relative to the root fs.
          */
 
-        _cleanup_close_ int _dir_fd = -EBADF;
-        if (dir_fd == XAT_FDROOT) {
-                if (path_is_absolute(path))
-                        dir_fd = AT_FDCWD;
-                else {
-                        _dir_fd = open("/", O_CLOEXEC|O_DIRECTORY|O_RDONLY);
-                        if (_dir_fd < 0)
-                                return -errno;
-
-                        dir_fd = _dir_fd;
-                }
-        }
-
         if (mode == MODE_INVALID)
                 mode = (open_flags & O_DIRECTORY) ? 0755 : 0644;
 
@@ -1186,6 +1173,19 @@ int xopenat_full(int dir_fd, const char *path, int open_flags, XOpenFlags xopen_
                 return fd_reopen(dir_fd, open_flags & ~O_NOFOLLOW);
         }
 
+        _cleanup_close_ int _dir_fd = -EBADF;
+        if (dir_fd == XAT_FDROOT) {
+                if (path_is_absolute(path))
+                        dir_fd = AT_FDCWD;
+                else {
+                        _dir_fd = open("/", O_CLOEXEC|O_DIRECTORY|O_PATH);
+                        if (_dir_fd < 0)
+                                return -errno;
+
+                        dir_fd = _dir_fd;
+                }
+        }
+
         bool call_label_ops_post = false;
 
         if (FLAGS_SET(open_flags, O_CREAT) && FLAGS_SET(xopen_flags, XO_LABEL)) {