“sync”和“syncfs”系统调用是否映射到FUSE的“fsync”调用?

11

FUSE API并没有暴露出文件系统级别的sync调用,只有fsyncfsyncdir。这是否意味着当调用sync(或在FUSE挂载点内调用syncfs)时,内核会在所有FUSE挂载的文件系统上对所有打开的文件调用fsync?还是有不同的语义?

1个回答

2
查看内核源代码,似乎在syncsyncfs上进行了任何待处理的回写,但未调用fsync(至少我没看见),因此实际上无法知道是否调用了syncsyncfs
相关代码位于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操作,但是fuse没有定义任何内容:https://github.com/torvalds/linux/blob/v4.16/fs/fuse/inode.c#L803-L814 我还记得读过一封邮件列表中关于此事的讨论,该讨论建议在fuse中实现sync_fs并不容易,因为这会允许一个fuse文件系统(可能以非特权用户身份运行)无限期地阻塞任何全局sync系统调用,从而引发安全(DoS)问题。然而我找不到那个邮件列表的讨论了。

由于fuse没有实现sync_fs,这是否意味着对__sync_blockdev()的调用在涉及已被应用程序打开的文件并向fuse客户端发送同步方面是无操作的? - itisravi
换句话说,如果应用程序已经打开了一些文件的写入描述符,并且想要同步内容,唯一的方法就是在这些描述符上单独发送显式的fsync(2)? - itisravi
我相信__sync_blockdev()只会同步底层块设备,而fuse文件系统通常不包含底层块设备(因此可能是无操作)。至于fuse未实现sync_fs,这意味着此if将为false,因此不会调用sync_fs - Matthijs Kooijman
对于发送 fsync/syncfs 的应用程序:fsync 是唯一会到达 FUSE 文件系统的消息。syncfs 不是完全的无操作,因为任何缓存的页面仍将被发送到 FUSE 进行写入(尽管只有在启用写回缓存时才真正相关,FUSE 默认使用写穿缓存,每个写操作都立即发送到 FUSE)。然而,FUSE 应用程序不会显式地知道 syncfs 发生了,所以从这个意义上说它是一个无操作,应用程序必须采用 fsync - Matthijs Kooijman
@PetrPudlák 我认为这是你应该接受的正确答案。我可能应该删除我的回答。 - itisravi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接