struct buffer_head *page_bufs = NULL;
        struct inode *inode = page->mapping->host;
        struct ext4_io_submit io_submit;
-       bool keep_towrite = false;
 
        if (unlikely(ext4_forced_shutdown(EXT4_SB(inode->i_sb)))) {
                folio_invalidate(folio, 0, folio_size(folio));
                        unlock_page(page);
                        return 0;
                }
-               keep_towrite = true;
        }
 
        if (PageChecked(page) && ext4_should_journal_data(inode))
                unlock_page(page);
                return -ENOMEM;
        }
-       ret = ext4_bio_write_page(&io_submit, page, len, keep_towrite);
+       ret = ext4_bio_write_page(&io_submit, page, len);
        ext4_io_submit(&io_submit);
        /* Drop io_end reference we got from init */
        ext4_put_io_end_defer(io_submit.io_end);
                len = size & ~PAGE_MASK;
        else
                len = PAGE_SIZE;
-       err = ext4_bio_write_page(&mpd->io_submit, page, len, false);
+       err = ext4_bio_write_page(&mpd->io_submit, page, len);
        if (!err)
                mpd->wbc->nr_to_write--;
        mpd->first_page++;
 
 
 int ext4_bio_write_page(struct ext4_io_submit *io,
                        struct page *page,
-                       int len,
-                       bool keep_towrite)
+                       int len)
 {
        struct page *bounce_page = NULL;
        struct inode *inode = page->mapping->host;
        int nr_submitted = 0;
        int nr_to_submit = 0;
        struct writeback_control *wbc = io->io_wbc;
+       bool keep_towrite = false;
 
        BUG_ON(!PageLocked(page));
        BUG_ON(PageWriteback(page));
 
-       if (keep_towrite)
-               set_page_writeback_keepwrite(page);
-       else
-               set_page_writeback(page);
        ClearPageError(page);
 
        /*
                        if (!buffer_mapped(bh))
                                clear_buffer_dirty(bh);
                        /*
-                        * Keeping dirty some buffer we cannot write? Make
-                        * sure to redirty the page. This happens e.g. when
-                        * doing writeout for transaction commit.
+                        * Keeping dirty some buffer we cannot write? Make sure
+                        * to redirty the page and keep TOWRITE tag so that
+                        * racing WB_SYNC_ALL writeback does not skip the page.
+                        * This happens e.g. when doing writeout for
+                        * transaction commit.
                         */
-                       if (buffer_dirty(bh) && !PageDirty(page))
-                               redirty_page_for_writepage(wbc, page);
+                       if (buffer_dirty(bh)) {
+                               if (!PageDirty(page))
+                                       redirty_page_for_writepage(wbc, page);
+                               keep_towrite = true;
+                       }
                        if (io->io_bio)
                                ext4_io_submit(io);
                        continue;
                nr_to_submit++;
        } while ((bh = bh->b_this_page) != head);
 
+       /* Nothing to submit? Just unlock the page... */
+       if (!nr_to_submit)
+               goto unlock;
+
        bh = head = page_buffers(page);
 
        /*
                }
        }
 
+       if (keep_towrite)
+               set_page_writeback_keepwrite(page);
+       else
+               set_page_writeback(page);
+
        /* Now submit buffers to write */
        do {
                if (!buffer_async_write(bh))
                                 bounce_page ? bounce_page : page, bh);
                nr_submitted++;
        } while ((bh = bh->b_this_page) != head);
-
 unlock:
        unlock_page(page);
-       /* Nothing submitted - we have to end page writeback */
-       if (!nr_submitted)
-               end_page_writeback(page);
        return ret;
 }