'sync' 和 'syncfs' 系统调用是否映射到 FUSE 的 'fsync' 调用?
Do the 'sync' and 'syncfs' system calls map to FUSE's 'fsync' calls?
FUSE API doesn't expose a file-system level sync
call, just fsync
和 fsyncdir
。这是否意味着当 sync
被调用时(或 FUSE 挂载点内的 syncfs
),内核对所有 FUSE 挂载文件系统上的所有打开文件调用 fsync
?还是有不同的语义?
查看内核源代码,似乎在 sync
和 syncfs
上执行了任何挂起的回写,但是 fsync
没有被调用(反正不是 AFAICS),所以有没有任何方法可以知道调用了 sync
或 syncfs
。
相关代码在https://github.com/torvalds/linux/blob/v4.16/fs/sync.c, e.g. https://github.com/torvalds/linux/blob/v4.16/fs/sync.c#L31-L41
如图所示,这调用了fileystem superblock上的fsync_fs
操作,但是fuse没有定义任何:
https://github.com/torvalds/linux/blob/v4.16/fs/fuse/inode.c#L803-L814
我还记得读过一个关于这个的邮件列表线程,它建议在 fuse 中实现 sync_fs
是 non-trivial,因为它会允许一个 fuse 文件系统(可能 运行 作为non-privileged 用户)无限期地阻止任何全局 sync
系统调用,造成安全 (DoS) 问题。不过,我再也找不到那个帖子了。
FUSE API doesn't expose a file-system level sync
call, just fsync
和 fsyncdir
。这是否意味着当 sync
被调用时(或 FUSE 挂载点内的 syncfs
),内核对所有 FUSE 挂载文件系统上的所有打开文件调用 fsync
?还是有不同的语义?
查看内核源代码,似乎在 sync
和 syncfs
上执行了任何挂起的回写,但是 fsync
没有被调用(反正不是 AFAICS),所以有没有任何方法可以知道调用了 sync
或 syncfs
。
相关代码在https://github.com/torvalds/linux/blob/v4.16/fs/sync.c, e.g. https://github.com/torvalds/linux/blob/v4.16/fs/sync.c#L31-L41
如图所示,这调用了fileystem superblock上的fsync_fs
操作,但是fuse没有定义任何:
https://github.com/torvalds/linux/blob/v4.16/fs/fuse/inode.c#L803-L814
我还记得读过一个关于这个的邮件列表线程,它建议在 fuse 中实现 sync_fs
是 non-trivial,因为它会允许一个 fuse 文件系统(可能 运行 作为non-privileged 用户)无限期地阻止任何全局 sync
系统调用,造成安全 (DoS) 问题。不过,我再也找不到那个帖子了。