On 22/11/30 05:35PM, Jan Kara wrote: > Hello, > > this patch series modifies ext4 so that we stop using ext4_writepage() for > writeout of ordered data during transaction commit (through > generic_writepages() from jbd2_journal_submit_inode_data_buffers()). Instead we > directly call ext4_writepages() from the > ext4_journal_submit_inode_data_buffers(). Hello Jan, Do you think we should add a WARN_ON_ONCE() or something in ext4_do_writepages() function where we might try to start a transaction at [J]. Since we can now enter into ext4_do_writepages() from two places: 1. writeback 2. jbd2_journal_commit_transaction() mpage_submit_page mpage_prepare_extent_to_map ext4_do_writepages ext4_normal_submit_inode_data_buffers ext4_journal_submit_inode_data_buffers journal_submit_data_buffers jbd2_journal_commit_transaction kjournald2 So IIUC, we will call mpage_submit_page() in the first call to mpage_prepare_extent_to_map() [1] itself. That may set mpd->scanned_until_end = 1 at the end of it. So then we should never enter into the while loop where we start a journal txn. But can it ever happen that we ever into this while loop for writing out pages for journal_submit_data_buffers()? ext4_do_writepages() { <...> mpd->do_map = 0; mpd->scanned_until_end = 0; mpd->io_submit.io_end = ext4_init_io_end(inode, GFP_KERNEL); <...> [1] ret = mpage_prepare_extent_to_map(mpd); /* Unlock pages we didn't use */ mpage_release_unused_pages(mpd, false); /* Submit prepared bio */ ext4_io_submit(&mpd->io_submit); ext4_put_io_end_defer(mpd->io_submit.io_end); mpd->io_submit.io_end = NULL; <...> while (!mpd->scanned_until_end && wbc->nr_to_write > 0) { /* For each extent of pages we use new io_end */ mpd->io_submit.io_end = ext4_init_io_end(inode, GFP_KERNEL); <....> BUG_ON(ext4_should_journal_data(inode)); needed_blocks = ext4_da_writepages_trans_blocks(inode); /* start a new transaction */ [J] handle = ext4_journal_start_with_reserve(inode, EXT4_HT_WRITE_PAGE, needed_blocks, rsv_blocks); <...> mpd->do_map = 1; trace_ext4_da_write_pages(inode, mpd->first_page, wbc); [2] ret = mpage_prepare_extent_to_map(mpd); if (!ret && mpd->map.m_len) ret = mpage_map_and_submit_extent(handle, mpd, &give_up_on_write); <...> } <...> } -ritesh