Bug 194739 - fallocate --collapse-range causes temporal data corruption on fragmented file
Summary: fallocate --collapse-range causes temporal data corruption on fragmented file
Status: RESOLVED CODE_FIX
Alias: None
Product: File System
Classification: Unclassified
Component: ext4 (show other bugs)
Hardware: All Linux
: P1 normal
Assignee: fs_ext4@kernel-bugs.osdl.org
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2017-03-01 00:00 UTC by Ivan Kalvachev
Modified: 2017-03-15 17:48 UTC (History)
0 users

See Also:
Kernel Version: 4.10.1
Subsystem:
Regression: No
Bisected commit-id:


Attachments

Description Ivan Kalvachev 2017-03-01 00:00:51 UTC
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.
Comment 1 Ivan Kalvachev 2017-03-15 17:48:30 UTC
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 <roman.penyaev@profitbricks.com>
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.
    
    Fixes: 331573febb6a2
---

Note You need to log in before you can comment on or make changes to this bug.