并发、缓存一致性与故障恢复
1. 锁层次
VFS 常见锁:
| 锁 | 保护 |
|---|---|
s_umount |
super freeze/unmount |
| mount lock/seqlock | mount topology |
i_rwsem |
inode/目录操作 |
i_lock |
inode state/flags/lists |
d_lock |
dentry fields |
| rename lock | rename/pathwalk sequence |
file_lock |
fdtable update |
| folio lock | page cache folio state |
| mapping xarray lock | page cache index |
具体文件系统还有 transaction、extent、allocation group、journal、log 等锁。
2. Lockless fast path
- fd lookup 使用 RCU;
- pathwalk 优先 RCU-walk;
- dcache hash lookup 配合 sequence validation;
- mount/path rename 通过 seqlock 检测变化。
无锁读取不是无同步,而是读取后验证;失败需重试或转慢路径。
3. Dentry/inode 一致性
本地 fs 通常由 VFS mutation 更新 dcache;网络/stacked fs 可能通过 d_revalidate 检查远端/lower 状态。negative dentry timeout 和 attribute cache 会影响“何时看到新文件”。
4. Data/metadata ordering
持久化涉及:
1 | application data |
文件系统只能在设备正确实现 flush/FUA 时兑现顺序。
5. fsync 语义
fsync 目标是该文件所需数据和 metadata;rename/create 的目录项持久性可能还需 parent fsync。不同文件系统的 journal/CoW 实现不同,但应用应使用通用 crash-safe protocol,而不依赖偶然行为。
6. Freeze/unmount
- freeze 阻断新写并同步,供 snapshot;
- unmount 先从 namespace detach,再等待/关闭 super;
- lazy unmount 只断开可见路径,活动引用仍存在;
- forced unmount 可能让后续 I/O 返回错误。
7. 崩溃恢复
- journal replay;
- log replay;
- orphan cleanup;
- checkpoint/roll-forward;
- CoW tree root 选择;
- fsck/offline repair;
- online scrub。
恢复机制无法修复所有硬件 silent corruption;checksum、scrub 和备份仍必要。
8. Writeback error
异步错误可能在后续 fsync 才报告。多进程对同一 inode 打开的 file 各自跟踪 errseq,应用必须检查并记录第一次持久化错误。
9. Deadlock 防护
存储路径分配内存常使用 GFP_NOFS/memalloc_nofs,避免回收再次进入同一文件系统。新增代码不能在 filesystem transaction lock 下随意 GFP_KERNEL 分配或调用可递归 VFS 操作。
10. 测试
- fsx/xfstests;
- fault injection;
- dm-flakey;
- 强制掉电;
- fsfreeze;
- ENOSPC/inode exhaustion;
- I/O error;
- concurrent rename/unlink/mmap;
- mount namespace stress。
正在加载留言…