In extent_write_cache_pages() since flush_write_bio() can return error, we need some extra error handling.
For the first flush_write_bio() since we haven't locked the page, we only need to exit the loop. For the seconds flush_write_bio() call, we have the page locked, despite that there is nothing special need to handle. Signed-off-by: Qu Wenruo <w...@suse.com> Reviewed-by: Johannes Thumshirn <jthumsh...@suse.de> --- changelog: v5.2: - Update commit message to explain why the error out behavior is correct. - Add a missing unlock_page() for the 2nd error out case. --- fs/btrfs/extent_io.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/fs/btrfs/extent_io.c b/fs/btrfs/extent_io.c index 1572e892ec7b..477d7f19a34a 100644 --- a/fs/btrfs/extent_io.c +++ b/fs/btrfs/extent_io.c @@ -3998,7 +3998,10 @@ static int extent_write_cache_pages(struct address_space *mapping, */ if (!trylock_page(page)) { ret = flush_write_bio(epd); - BUG_ON(ret < 0); + if (ret < 0) { + done = 1; + break; + } lock_page(page); } @@ -4010,7 +4013,11 @@ static int extent_write_cache_pages(struct address_space *mapping, if (wbc->sync_mode != WB_SYNC_NONE) { if (PageWriteback(page)) { ret = flush_write_bio(epd); - BUG_ON(ret < 0); + if (ret < 0) { + unlock_page(page); + done = 1; + break; + } } wait_on_page_writeback(page); } -- 2.21.0