Используете ли системы синхронизации "sync" и "syncfs" для вызова FUSE "fsync"?

API FUSE не выставляет вызов sync уровня файловой системы, просто fsync и fsyncdir. Означает ли это, что когда sync вызывается (или syncfs внутри точки монтирования FUSE), ядро ​​вызывает fsync во всех открытых файлах на всех файловых системах FUSE? Или существует другая семантика?

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