FUSE API不会公开文件系统级sync
来电,只有fsync
和fsyncdir
。这是否意味着当调用sync
(或FUSE挂载点内的syncfs
)时,内核会对所有FUSE挂载的文件系统上的所有打开文件调用fsync
?或者是否有不同的语义?
答案 0 :(得分:2)
查看内核源代码,似乎在sync
和syncfs
上执行了任何挂起的回写,但是fsync
没有被调用(不管是AFAICS),所以实际上并没有任何方式都可以知道sync
或syncfs
被调用。
相关代码位于https://github.com/torvalds/linux/blob/v4.16/fs/sync.c,例如https://github.com/torvalds/linux/blob/v4.16/fs/sync.c#L31-L41
如图所示,这会调用文件系统超级块上的fsync_fs
操作,但保险丝不会定义任何:
https://github.com/torvalds/linux/blob/v4.16/fs/fuse/inode.c#L803-L814
我还记得阅读一个关于此的邮件列表帖子,这表明在fuse中实现sync_fs
是非常重要的,因为它允许一个fuse文件系统(可能作为非特权用户运行)阻止任何全局sync
系统无限期调用,造成安全(DoS)问题。不过,我不能再找到那个帖子了。