From c136be3f04bf2c96e99a7466deb4eb491fb117b2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= Date: Thu, 24 Jul 2025 15:09:58 +0200 Subject: [PATCH] basic/stat-util: avoid access syscall I was looking at strace for systemd-getty-generator and noticed the call to faccessat2(3, "", W_OK, AT_EMPTY_PATH), even though we already did fstatfs(3), which should give us all the necessary information. Let's only do this additional check when it's likely to yield something useful, i.e. for network fses and otherwise skip the syscall. The call to statvfs is replaced by statfs because that gives us the .f_type field and allows is_network_fs() to be called. I'm a bit worried that the is_network_fs() is somewhat costly. This will be improved in later commits. --- src/basic/stat-util.c | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/src/basic/stat-util.c b/src/basic/stat-util.c index 72360daadf..5582c59037 100644 --- a/src/basic/stat-util.c +++ b/src/basic/stat-util.c @@ -220,20 +220,22 @@ int null_or_empty_path_with_root(const char *fn, const char *root) { } int fd_is_read_only_fs(int fd) { - struct statvfs st; + struct statfs st; assert(fd >= 0); - if (fstatvfs(fd, &st) < 0) + if (fstatfs(fd, &st) < 0) return -errno; - if (st.f_flag & ST_RDONLY) + if (st.f_flags & ST_RDONLY) return true; - /* On NFS, fstatvfs() might not reflect whether we can actually write to the remote share. Let's try - * again with access(W_OK) which is more reliable, at least sometimes. */ - if (access_fd(fd, W_OK) == -EROFS) - return true; + if (is_network_fs(&st)) { + /* On NFS, fstatfs() might not reflect whether we can actually write to the remote share. + * Let's try again with access(W_OK) which is more reliable, at least sometimes. */ + if (access_fd(fd, W_OK) == -EROFS) + return true; + } return false; }