• Qu Wenruo's avatar
    btrfs: Change the expanding write sequence to fix snapshot related bug. · 3ac0d7b9
    Qu Wenruo authored
    When testing fsstress with snapshot making background, some snapshot
    following problem.
    
    Snapshot 270:
    inode 323: size 0
    
    Snapshot 271:
    inode 323: size 349145
    |-------Hole---|---------Empty gap-------|-------Hole-----|
    0	    122880			172032	      349145
    
    Snapshot 272:
    inode 323: size 349145
    |-------Hole---|------------Data---------|-------Hole-----|
    0	    122880			172032	      349145
    
    The fsstress operation on inode 323 is the following:
    write: 		offset 	126832 	len 43124
    truncate: 	size 	349145
    
    Since the write with offset is consist of 2 operations:
    1. punch hole
    2. write data
    Hole punching is faster than data write, so hole punching in write
    and truncate is done first and then buffered write, so the snapshot 271 got
    empty gap, which will not pass btrfsck.
    
    To fix the bug, this patch will change the write sequence which will
    first punch a hole covering the write end if a hole is needed.
    Reported-by: default avatarGui Hecheng <guihc.fnst@cn.fujitsu.com>
    Signed-off-by: default avatarQu Wenruo <quwenruo@cn.fujitsu.com>
    Signed-off-by: default avatarChris Mason <clm@fb.com>
    3ac0d7b9
file.c 68.8 KB