API FUSE не выставляет вызов sync
уровня файловой системы, просто fsync
и fsyncdir
. Означает ли это, что когда sync
вызывается (или syncfs
внутри точки монтирования FUSE), ядро вызывает fsync
во всех открытых файлах на всех файловых системах FUSE? Или существует другая семантика?
Используете ли системы синхронизации "sync" и "syncfs" для вызова FUSE "fsync"?
Ответ 1
Глядя на исходный код ядра, кажется, что на sync
и syncfs
любые ожидающие обратные записи, но fsync
не вызывается (в любом случае, не AFAICS), поэтому на самом деле нет никакого способа узнать, что syncfs
sync
или syncfs
.
Соответствующий код находится в https://github.com/torvalds/linux/blob/v4.16/fs/sync.c, например, https://github.com/torvalds/linux/blob/v4.16/fs/sync..С# L31-L41
Как показано, это вызывает операцию fsync_fs
над суперблоком файловой системы, но fuse не определяет ничего:
https://github.com/torvalds/linux/blob/v4.16/fs/fuse/inode.c#L803-L814
Я также помню, чтение списка рассылки нить об этом, который предположил, что внедрение sync_fs
в взрывателя нетривиально, так как это позволило бы запал файловой системы (который может работать как непривилегированный пользователь), чтобы блокировать любые глобальные sync
системных вызовов на неопределенный срок, создает проблему безопасности (DoS). Я не могу найти эту нить больше, хотя.
Ответ 2
При вызове syscall syncfs (2) ядро вызывает sync_filesystem() в суперблоке файловой системы, к которой принадлежит fd. Если рассматриваемая файловая система реализует операцию суперблока .sync_fs, она вызывается. FUSE не работает и, следовательно, sync_filesystem() для FUSE только вызывает __sync_blockdev() on/dev/fuse, который синхронизирует все грязные страницы (и, следовательно, все несинхронизированные файлы) для этого плавкого предохранителя.