From: Filipe Manana Date: Wed, 11 Sep 2019 16:42:28 +0000 (+0100) Subject: Btrfs: fix missing error return if writeback for extent buffer never started X-Git-Tag: v4.14.207~65 X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=b37799da7161e0aacd4d50ebb7686d8232d55b3c;p=users%2Fdwmw2%2Flinux.git Btrfs: fix missing error return if writeback for extent buffer never started [ 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 Signed-off-by: Filipe Manana Signed-off-by: David Sterba Signed-off-by: Sasha Levin --- diff --git a/fs/btrfs/extent_io.c b/fs/btrfs/extent_io.c index 0ba338cffa937..fd56c22c12a0e 100644 --- a/fs/btrfs/extent_io.c +++ b/fs/btrfs/extent_io.c @@ -3869,6 +3869,10 @@ retry: 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);