lkml.org 
[lkml]   [2020]   [Nov]   [17]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.4 14/64] Btrfs: fix missing error return if writeback for extent buffer never started
    Date
    From: Filipe Manana <fdmanana@suse.com>

    [ Upstream commit 0607eb1d452d45c5ac4c745a9e9e0d95152ea9d0 ]

    If lock_extent_buffer_for_io() fails, it returns a negative value, but its
    caller btree_write_cache_pages() ignores such error. This means that a
    call to flush_write_bio(), from lock_extent_buffer_for_io(), might have
    failed. We should make btree_write_cache_pages() notice such error values
    and stop immediatelly, making sure filemap_fdatawrite_range() returns an
    error to the transaction commit path. A failure from flush_write_bio()
    should also result in the endio callback end_bio_extent_buffer_writepage()
    being invoked, which sets the BTRFS_FS_*_ERR bits appropriately, so that
    there's no risk a transaction or log commit doesn't catch a writeback
    failure.

    Reviewed-by: Josef Bacik <josef@toxicpanda.com>
    Signed-off-by: Filipe Manana <fdmanana@suse.com>
    Signed-off-by: David Sterba <dsterba@suse.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    fs/btrfs/extent_io.c | 4 ++++
    1 file changed, 4 insertions(+)

    diff --git a/fs/btrfs/extent_io.c b/fs/btrfs/extent_io.c
    index 97a80238fdee3..b28bc7690d4b3 100644
    --- a/fs/btrfs/extent_io.c
    +++ b/fs/btrfs/extent_io.c
    @@ -4000,6 +4000,10 @@ int btree_write_cache_pages(struct address_space *mapping,
    if (!ret) {
    free_extent_buffer(eb);
    continue;
    + } else if (ret < 0) {
    + done = 1;
    + free_extent_buffer(eb);
    + break;
    }

    ret = write_one_eb(eb, fs_info, wbc, &epd);
    --
    2.27.0


    \
     
     \ /
      Last update: 2020-11-17 14:08    [W:4.088 / U:0.760 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site