FUSE I/O 模式¶
FUSE 支持以下 I/O 模式
直接 I/O (direct-io)
缓存 + 写通 + 写回缓存
可以使用 FUSE_OPEN 回复中的 FOPEN_DIRECT_IO 标志选择直接 I/O 模式。
在直接 I/O 模式下,读取和写入完全绕过页面缓存。不会进行预读。默认情况下禁用共享 mmap。要允许共享 mmap,可以在 FUSE_INIT 回复中启用 FUSE_DIRECT_IO_ALLOW_MMAP 标志。
在缓存模式下,读取可以从页面缓存中满足,并且内核可以预读数据以填充缓存。在对文件进行任何写入后,缓存始终保持一致。支持所有 mmap 模式。
缓存模式有两种子模式,用于控制如何处理写入。写通模式是默认模式,所有内核都支持。可以通过 FUSE_INIT 回复中的 FUSE_WRITEBACK_CACHE 标志选择写回缓存模式。
在写通模式下,每次写入都会立即作为一次或多次 WRITE 请求发送到用户空间,并更新任何缓存的页面(以及缓存以前未缓存但完全写入的页面)。永远不会为写入发送 READ 请求,因此当部分写入未缓存的页面时,该页面将被丢弃。
在写回缓存模式(通过 FUSE_WRITEBACK_CACHE 标志启用)下,写入仅进入缓存,这意味着 write(2) 系统调用通常可以非常快速地完成。脏页面会被隐式地写回(后台写回或在内存压力下页面回收),或者显式地写回(由 close(2)、fsync(2) 以及当文件的最后一个引用在 munmap(2) 上被释放时调用)。此模式假定对文件系统的所有更改都通过 FUSE 内核模块进行(大小和 atime/ctime/mtime 属性由内核保持最新),因此通常不适合网络文件系统。如果写入部分页面,则需要首先从用户空间读取该页面。这意味着,即使对于以 O_WRONLY 打开的文件,内核也可能会生成 READ 请求。