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, который синхронизирует все грязные страницы (и, следовательно, все несинхронизированные файлы) для этого плавкого предохранителя.