• Naohiro Aota's avatar
    btrfs: finish ordered extent cleaning if no progress is found · 67c003f9
    Naohiro Aota authored
    __endio_write_update_ordered() repeats the search until it reaches the end
    of the specified range. This works well with direct IO path, because before
    the function is called, it's ensured that there are ordered extents filling
    whole the range. It's not the case, however, when it's called from
    run_delalloc_range(): it is possible to have error in the midle of the loop
    in e.g. run_delalloc_nocow(), so that there exisits the range not covered
    by any ordered extents. By cleaning such "uncomplete" range,
    __endio_write_update_ordered() stucks at offset where there're no ordered
    extents.
    
    Since the ordered extents are created from head to tail, we can stop the
    search if there are no offset progress.
    
    Fixes: 52427260 ("btrfs: Handle delalloc error correctly to avoid ordered extent hang")
    Cc: <stable@vger.kernel.org> # 4.12
    Signed-off-by: default avatarNaohiro Aota <naohiro.aota@wdc.com>
    Reviewed-by: default avatarQu Wenruo <quwenruo.btrfs@gmx.com>
    Reviewed-by: default avatarJosef Bacik <jbacik@fb.com>
    Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
    67c003f9
inode.c 293 KB