• Qu Wenruo's avatar
    btrfs: allow defrag to convert inline extents to regular extents · d8101a0c
    Qu Wenruo authored
    Btrfs defaults to max_inline=2K to make small writes inlined into
    metadata.
    
    The default value is always a win, as even DUP/RAID1/RAID10 doubles the
    metadata usage, it should still cause less physical space used compared
    to a 4K regular extents.
    
    But since the introduction of RAID1C3 and RAID1C4 it's no longer the case,
    users may find inlined extents causing too much space wasted, and want
    to convert those inlined extents back to regular extents.
    
    Unfortunately defrag will unconditionally skip all inline extents, no
    matter if the user is trying to converting them back to regular extents.
    
    So this patch will add a small exception for defrag_collect_targets() to
    allow defragging inline extents, if and only if the inlined extents are
    larger than max_inline, allowing users to convert them to regular ones.
    
    This also allows us to defrag extents like the following:
    
    	item 6 key (257 EXTENT_DATA 0) itemoff 15794 itemsize 69
    		generation 7 type 0 (inline)
    		inline extent data size 48 ram_bytes 4096 compression 1 (zlib)
    	item 7 key (257 EXTENT_DATA 4096) itemoff 15741 itemsize 53
    		generation 7 type 1 (regular)
    		extent data disk byte 13631488 nr 4096
    		extent data offset 0 nr 16384 ram 16384
    		extent compression 1 (zlib)
    
    Previously we're unable to do any defrag, since the first extent is
    inlined, and the second one has no extent to merge.
    
    Now we can defrag it to just one single extent, saving 48 bytes metadata
    space.
    
    	item 6 key (257 EXTENT_DATA 0) itemoff 15810 itemsize 53
    		generation 8 type 1 (regular)
    		extent data disk byte 13635584 nr 4096
    		extent data offset 0 nr 20480 ram 20480
    		extent compression 1 (zlib)
    Reviewed-by: default avatarFilipe Manana <fdmanana@suse.com>
    Signed-off-by: default avatarQu Wenruo <wqu@suse.com>
    Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
    d8101a0c
ioctl.c 139 KB