Description
In the Linux kernel, the following vulnerability has been resolved: f2fs: fix data loss caused by incorrect use of nat_entry flag Data loss can occur when fsync is performed on a newly created file (before any checkpoint has been written) concurrently with a checkpoint operation. The scenario is as follows: create & write & fsync 'file A' write checkpoint - f2fs_do_sync_file // inline inode - f2fs_write_inode // inode folio is dirty - f2fs_write_checkpoint - f2fs_flush_merged_writes - f2fs_sync_node_pages - f2fs_flush_nat_entries - f2fs_fsync_node_pages // no dirty node - f2fs_need_inode_block_update // return false SPO and lost 'file A' f2fs_flush_nat_entries() sets the IS_CHECKPOINTED and HAS_LAST_FSYNC flags for the nat_entry, but this does not mean that the checkpoint has actually completed successfully. However, f2fs_need_inode_block_update() checks these flags and incorrectly assumes that the checkpoint has finished. The root cause is that the semantics of IS_CHECKPOINTED and HAS_LAST_FSYNC are only guaranteed after the checkpoint write fully completes. This patch modifies f2fs_need_inode_block_update() to acquire the sbi->node_write lock before reading the nat_entry flags, ensuring that once IS_CHECKPOINTED and HAS_LAST_FSYNC are observed to be set, the checkpoint operation has already completed.
Affected products
Version statuses are supplied by the assigning organization. Consult the original record for detailed ranges and platform conditions.
Linux Linux
Default version status: unaffected
e05df3b115e7308afbca652769b54e4549fcc723 to < 0645fa4d48e9b77d93f8b7a1c1fea58a97c2f8b0affectede05df3b115e7308afbca652769b54e4549fcc723 to < 9fd3bcb54a6afea5fa8a828d010561143560b7c5affectede05df3b115e7308afbca652769b54e4549fcc723 to < cb06a07d835ba1ea250785a796243bb483e65816affectede05df3b115e7308afbca652769b54e4549fcc723 to < 20cedb4d9f6b230d0ee469690b8f868f06a07c29affectede05df3b115e7308afbca652769b54e4549fcc723 to < 238e14eb7226f883b72caccd2d37bf5707df066baffected
Linux Linux
Default version status: affected
3.8affected0 to < 3.8unaffected6.6.160 to ≤ 6.6.*unaffected6.12.114 to ≤ 6.12.*unaffected6.18.57 to ≤ 6.18.*unaffected7.0.10 to ≤ 7.0.*unaffected7.1 to ≤ *unaffected
References
- https://git.kernel.org/stable/c/0645fa4d48e9b77d93f8b7a1c1fea58a97c2f8b0 ↗
- https://git.kernel.org/stable/c/9fd3bcb54a6afea5fa8a828d010561143560b7c5 ↗
- https://git.kernel.org/stable/c/cb06a07d835ba1ea250785a796243bb483e65816 ↗
- https://git.kernel.org/stable/c/20cedb4d9f6b230d0ee469690b8f868f06a07c29 ↗
- https://git.kernel.org/stable/c/238e14eb7226f883b72caccd2d37bf5707df066b ↗