• Li Zefan's avatar
    Btrfs: rewrite btrfs_trim_block_group() · 7fe1e641
    Li Zefan authored
    There are various bugs in block group trimming:
    
    - It may trim from offset smaller than user-specified offset.
    - It may trim beyond user-specified range.
    - It may leak free space for extents smaller than specified minlen.
    - It may truncate the last trimmed extent thus leak free space.
    - With mixed extents+bitmaps, some extents may not be trimmed.
    - With mixed extents+bitmaps, some bitmaps may not be trimmed (even
    none will be trimmed). Even for those trimmed, not all the free space
    in the bitmaps will be trimmed.
    
    I rewrite btrfs_trim_block_group() and break it into two functions.
    One is to trim extents only, and the other is to trim bitmaps only.
    
    Before patching:
    
    	# fstrim -v /mnt/
    	/mnt/: 1496465408 bytes were trimmed
    
    After patching:
    
    	# fstrim -v /mnt/
    	/mnt/: 2193768448 bytes were trimmed
    
    And this matches the total free space:
    
    	# btrfs fi df /mnt
    	Data: total=3.58GB, used=1.79GB
    	System, DUP: total=8.00MB, used=4.00KB
    	System: total=4.00MB, used=0.00
    	Metadata, DUP: total=205.12MB, used=97.14MB
    	Metadata: total=8.00MB, used=0.00
    Signed-off-by: default avatarLi Zefan <lizf@cn.fujitsu.com>
    7fe1e641
free-space-cache.c 71.9 KB