Linux 6.6内核 合并的新功能之一是VFS 层的多粒度时间戳,并将其连接到 EXT4、Btrfs、XFS 和 Tmpfs 文件系统。尽管这种粗粒度时间戳的替代方案最终暴露了一些问题,本周在 Linux 6.6-rc3 之前,该功能已从内核中完全剥离。
多粒度时间戳旨在解决当前粗粒度时间戳对于更新创建/修改时间无效的情况,因为在每个 jiffy 时间戳内可能发生大量 I/O。例如,NFS 依靠当前的粗粒度时间戳来验证缓存,希望这种多粒度时间戳更加稳健。不过,多粒度时间戳只能选择性地启用,以避免性能开销。
最初为 Linux 6.6 提交该功能的 Microsoft 的 Christian Brauner 继续提交了 Pull 请求,该请求已经得到尊重,以放弃短暂的内核功能。他解释说:
“当没有人主动查询细粒度时间戳更新时,内核将忽略它们以避免性能影响。因此像 write(f1) stat(f2) write(f2) stat(f2) write(f1) stat(f1) 这样的序列) 可能会导致时间戳 f1 早于最终的 f2 时间戳,即使 f1 也是最后一次写入,但第二次写入并未更新时间戳。
当程序比较时间戳时,此类漏洞可能会导致微妙的错误。例如,小睡( ) 函数将估计在后续调用之间需要在启用细粒度时间戳的文件系统上等待 1 ns,以观察时间戳变化。但一般来说,如果我们认为没有人主动更新时间戳,我们不会使用超过 1 个 jiffie 来更新时间戳查询细粒度时间戳以避免性能影响。
在讨论各种修复方案时,我们决定回到绘图板并最终探索一种解决方案,该解决方案仅将此类细粒度时间戳公开给 nfs 内部,而不是公开给用户空间。
由于讨论了多种解决方案,这里要做的诚实的事情不是修复它或禁用它,而是干净地恢复。通用基础设施可能会恢复,但没有理由将此代码保留在主线中。”
因此,短短几周后,在今天的 Linux 6.6-rc3 版本发布之前,多粒度时间戳代码已从内核中删除。至少Linux 6.6 还有许多其他很棒的功能。