本质上是让多个 erofs 文件系统共享同一个 volume。因而在 erofs 内部维护一个 volume 的池子。此时 erofs 可以增加一个 -o share_domain=… 挂载参数,每个 share domain 维护一个 volume 池子,在同一个 share domain 内可以共享 bootstrap/blob
方案:
要求:kill daemon 的时候,对应的 cookie 仍然可用,即仍然能够访问对应的缓存文件
现状:在 erofs 实例仍在挂载着的时候,杀掉 daemon,此时该 erofs 的任何 IO 访问都会返回 -ENOBUFS 错误
fscache_begin_operation
fscache_begin_cookie_access
# if !fscache_cache_is_live(cookie->volume->cache)
return false
return -ENOBUFS
改造:当 blob 已经完全下载 (CACHEFILES_CONTENT_ALL) 的时候,跳过该检查
fscache_begin_operation
fscache_begin_cookie_access
# if (!fscache_cache_is_live(cookie->volume->cache) || CACHEFILES_CONTENT_ALL)
return false
return -ENOBUFS
问题:如何设置 CACHEFILES_CONTENT_ALL
choice 1: 用户态设置。daemon 在用户态维护 blob 的缓存状态,全部下载完成的时候,通知内核态设置上 CACHEFILES_CONTENT_ALL
choice 2: 内核态设置。内核态在每次将数据写入 blob 的时候,检查 blob 是否已经全部下载,从而设置上 CACHEFILES_CONTENT_ALL