• Qu Wenruo's avatar
    btrfs: Fix and enhance merge_extent_mapping() to insert best fitted extent map · e6c4efd8
    Qu Wenruo authored
    The following commit enhanced the merge_extent_mapping() to reduce
    fragment in extent map tree, but it can't handle case which existing
    lies before map_start:
    51f39 btrfs: Use right extent length when inserting overlap extent map.
    
    [BUG]
    When existing extent map's start is before map_start,
    the em->len will be minus, which will corrupt the extent map and fail to
    insert the new extent map.
    This will happen when someone get a large extent map, but when it is
    going to insert it into extent map tree, some one has already commit
    some write and split the huge extent into small parts.
    
    [REPRODUCER]
    It is very easy to tiger using filebench with randomrw personality.
    It is about 100% to reproduce when using 8G preallocated file in 60s
    randonrw test.
    
    [FIX]
    This patch can now handle any existing extent position.
    Since it does not directly use existing->start, now it will find the
    previous and next extent around map_start.
    So the old existing->start < map_start bug will never happen again.
    
    [ENHANCE]
    This patch will insert the best fitted extent map into extent map tree,
    other than the oldest [map_start, map_start + sectorsize) or the
    relatively newer but not perfect [map_start, existing->start).
    
    The patch will first search existing extent that does not intersects with
    the desired map range [map_start, map_start + len).
    The existing extent will be either before or behind map_start, and based
    on the existing extent, we can find out the previous and next extent
    around map_start.
    
    So the best fitted extent would be [prev->end, next->start).
    For prev or next is not found, em->start would be prev->end and em->end
    wold be next->start.
    
    With this patch, the fragment in extent map tree should be reduced much
    more than the 51f39 commit and reduce an unneeded extent map tree search.
    Reported-by: default avatarTsutomu Itoh <t-itoh@jp.fujitsu.com>
    Signed-off-by: default avatarQu Wenruo <quwenruo@cn.fujitsu.com>
    Signed-off-by: default avatarChris Mason <clm@fb.com>
    e6c4efd8
inode.c 252 KB