• Liu Bo's avatar
    Btrfs: fix defrag to merge tail file extent · 4a3560c4
    Liu Bo authored
    The file layout is
    
    [extent 1]...[extent n][4k extent][HOLE][extent x]
    
    extent 1~n and 4k extent can be merged during defrag, and the whole
    defrag bytes is larger than our defrag thresh(256k), 4k extent as a
    tail is left unmerged since we check if its next extent can be merged
    (the next one is a hole, so the check will fail), the layout thus can
    be
    
    [new extent][4k extent][HOLE][extent x]
     (1~n)
    
    To fix it, beside looking at the next one, this also looks at the
    previous one by checking @defrag_end, which is set to 0 when we
    decide to stop merging contiguous extents, otherwise, we can merge
    the previous one with our extent.
    
    Also, this makes btrfs behave consistent with how xfs and ext4 do.
    Signed-off-by: default avatarLiu Bo <bo.li.liu@oracle.com>
    Signed-off-by: default avatarChris Mason <clm@fb.com>
    4a3560c4
ioctl.c 133 KB