sync
和syncfs
上进行了任何待处理的回写,但未调用fsync
(至少我没看见),因此实际上无法知道是否调用了sync
或syncfs
。fsync_fs
操作,但是fuse没有定义任何内容:https://github.com/torvalds/linux/blob/v4.16/fs/fuse/inode.c#L803-L814
我还记得读过一封邮件列表中关于此事的讨论,该讨论建议在fuse中实现sync_fs
并不容易,因为这会允许一个fuse文件系统(可能以非特权用户身份运行)无限期地阻塞任何全局sync
系统调用,从而引发安全(DoS)问题。然而我找不到那个邮件列表的讨论了。
__sync_blockdev()
只会同步底层块设备,而fuse文件系统通常不包含底层块设备(因此可能是无操作)。至于fuse未实现sync_fs
,这意味着此if将为false,因此不会调用sync_fs
。 - Matthijs Kooijmanfsync
/syncfs
的应用程序:fsync
是唯一会到达 FUSE 文件系统的消息。syncfs
不是完全的无操作,因为任何缓存的页面仍将被发送到 FUSE 进行写入(尽管只有在启用写回缓存时才真正相关,FUSE 默认使用写穿缓存,每个写操作都立即发送到 FUSE)。然而,FUSE 应用程序不会显式地知道syncfs
发生了,所以从这个意义上说它是一个无操作,应用程序必须采用fsync
。 - Matthijs Kooijman