Да. statvfs()
работает и в этом случае. В то же время он предотвращает блокировку файловой системы FUSE.
$ mkdir mnt
$ bindfs --no-allow-other mnt mnt
$ stat -f mnt
File: "mnt"
ID: 0 Namelen: 255 Type: fuseblk
Block size: 4096 Fundamental block size: 4096
Blocks: Total: 78150265 Free: 8223357 Available: 4722313
Inodes: Total: 19857408 Free: 18558102
$ strace stat -f mnt
...
statfs("mnt", {f_type=FUSE_SUPER_MAGIC, f_bsize=0, f_blocks=0, f_bfree=0, f_bavail=0, f_files=0, f_ffree=0, f_fsid={val=[0, 0]}, f_namelen=0, f_frsize=0, f_flags=ST_VALID|ST_NOSUID|ST_NODEV|ST_RELATIME}) = 0
...
File: "mnt"
ID: 0 Namelen: 0 Type: fuseblk
Block size: 0 Fundamental block size: 0
Blocks: Total: 0 Free: 0 Available: 0
Inodes: Total: 0 Free: 0
+++ exited with 0 +++
statvfs()
явно задокументировано как не требующий доступа к целевому каталогу, только родители.
EACCES (statvfs ()) Отказано в разрешении на поиск для компонента
путь префикс пути. (См. Также path_resolution (7).)
К сожалению, ваш процесс перемонтирования имеет условие гонки, которое нельзя исправить, если вы не можете открыть целевой каталог. Примечание O_PATH
позволяет открывать каталоги, не требуя разрешения для самого каталога. (O_PATH
fds может быть адресован как путь, используя /proc/self/fd/%d
, в том числе mount()
).