New: fallocate --collapse-range causes temporal data corruption on fragmented file
https://bugzilla.kernel.org/show_bug.cgi?id=194739
Bug ID: 194739
Summary: fallocate --collapse-range causes temporal data
corruption on fragmented file
Product: File System
Version: 2.5
Kernel Version: 4.10.1
Hardware: All
OS: Linux
Tree: Mainline
Status: NEW
Severity: normal
Priority: P1
Component: ext4
Assignee: [email protected]
Reporter: [email protected]
Regression: No
I use fallocate -c to cut the start of the file without having to copy the whole file again.
However recently, after collapsing the file it seems to repeat a portion of the data, that should have been moved. That is, the new start of the file is found somewhere around its old location.
Restarting the computer (or just hibernate) seems to fix the file.
Doing:echo 3 > /proc/sys/vm/drop_caches
also seems to fix the issue. Using just echo 1 fixes some of the data, but the file still might be broken.
I've noticed this problem on 4.9 kernel. I'm not sure if it is regression, because the problem might be triggered by high fragmentation. This partition got quite full and the files are quite big, thus they are always very fragmented.
Just want to make it clear.
Data on disk is not damaged.
Signature · 2 lines
You are receiving this mail because: You are watching the assignee of the bug.
[Bug 194739] fallocate --collapse-range causes temporal data corruption on fragmented file
https://bugzilla.kernel.org/show_bug.cgi?id=194739
Ivan Kalvachev ([email protected]) changed:
What |Removed |Added
----------------------------------------------------------------------------
Status|NEW |RESOLVED
Resolution|--- |CODE_FIX--- Comment #1 from Ivan Kalvachev ([email protected]) --- With kernel-4.10.2 I cannot reproduce the bug anymore.
The following commit looks like it might be the one fixing the issue:
---
commit 011fe6ade610c2ca5a609c83c509f1fc8e4c8b7f
Author: Roman Pen <[email protected]> Date: Sun Jan 8 21:00:35 2017 -0500
ext4: do not polute the extents cache while shifting extents
commit 03e916fa8b5577d85471452a3d0c5738aa658dae upstream.
Inside ext4_ext_shift_extents() function ext4_find_extent() is called without EXT4_EX_NOCACHE flag, which should prevent cache population.
This leads to oudated offsets in the extents tree and wrong blocks afterwards.
Patch fixes the problem providing EXT4_EX_NOCACHE flag for each ext4_find_extents() call inside ext4_ext_shift_extents function.
---
Signature · 2 lines
You are receiving this mail because: You are watching the assignee of the bug.