ext4下使用带FALLOC_FL_COLLAPSE_RANGE的fallocate裁剪文件开头是否原子?
ext4 中 FALLOC_FL_COLLAPSE_RANGE 操作崩溃后的状态说明
常规场景(ext4默认开启日志的挂载模式)
ext4 对带FALLOC_FL_COLLAPSE_RANGE标志的fallocate调用的所有元数据修改,都包裹在同一个完整的日志事务中提交,因此系统崩溃后只会出现两种稳定状态:
- 操作完全未生效:文件大小、块映射关系和调用
fallocate前完全一致,所有待裁剪范围的块都保留,无任何数据偏移 - 操作完全生效:整个待裁剪范围的块全部被移除,裁剪范围之后的所有数据都偏移到文件起始位置,文件大小对应减少裁剪范围的长度,所有变更完整落地
这种场景下不存在仅部分待裁剪块被移除的中间状态。
特殊场景(手动关闭ext4日志的挂载模式)
如果你通过journal=off挂载参数关闭了ext4的日志功能,失去了事务原子性保障,崩溃后才可能出现部分裁剪的中间状态。
这种场景下如果出现部分块被移除的情况,被移除的块一定是从待裁剪范围的起始位置开始的连续块,不会出现待裁剪范围中间的块先被移除、首尾块保留的情况。这是由ext4处理该操作的执行逻辑决定的:内核会先从待裁剪范围的起始位置开始扫描并移除对应的extent块映射,再调整后续extent的逻辑偏移量,最后更新inode的文件大小。
内容的提问来源于stack exchange,提问作者greghvk
相关产品推荐
相关产品推荐

