All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jan Kara <jack@suse.cz>
To: Ted Tso <tytso@mit.edu>
Cc: <linux-ext4@vger.kernel.org>,
	Christoph Hellwig <hch@infradead.org>, Jan Kara <jack@suse.cz>
Subject: [PATCH 5/9] ext4: Add support for writepages calls that cannot map blocks
Date: Wed, 30 Nov 2022 17:35:56 +0100	[thread overview]
Message-ID: <20221130163608.29034-5-jack@suse.cz> (raw)
In-Reply-To: <20221130162435.2324-1-jack@suse.cz>

Add support for calls to ext4_writepages() than cannot map blocks. These
will be issued from jbd2 transaction commit code.

Signed-off-by: Jan Kara <jack@suse.cz>
---
 fs/ext4/inode.c | 47 +++++++++++++++++++++++++++++++++++++++--------
 1 file changed, 39 insertions(+), 8 deletions(-)

diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c
index 43eb175d0c1c..1cde20eb6500 100644
--- a/fs/ext4/inode.c
+++ b/fs/ext4/inode.c
@@ -1557,6 +1557,7 @@ struct mpage_da_data {
 	struct ext4_map_blocks map;
 	struct ext4_io_submit io_submit;	/* IO submission data */
 	unsigned int do_map:1;
+	unsigned int can_map:1;	/* Can writepages call map blocks? */
 	unsigned int scanned_until_end:1;
 };
 
@@ -2549,6 +2550,19 @@ static int ext4_da_writepages_trans_blocks(struct inode *inode)
 				MAX_WRITEPAGES_EXTENT_LEN + bpp - 1, bpp);
 }
 
+/* Return true if the page needs to be written as part of transaction commit */
+static bool ext4_page_nomap_can_writeout(struct page *page)
+{
+	struct buffer_head *bh, *head;
+
+	bh = head = page_buffers(page);
+	do {
+		if (buffer_dirty(bh) && buffer_mapped(bh) && !buffer_delay(bh))
+			return true;
+	} while ((bh = bh->b_this_page) != head);
+	return false;
+}
+
 /*
  * mpage_prepare_extent_to_map - find & lock contiguous range of dirty pages
  * 				 and underlying extent to map
@@ -2651,14 +2665,30 @@ static int mpage_prepare_extent_to_map(struct mpage_da_data *mpd)
 			if (mpd->map.m_len == 0)
 				mpd->first_page = page->index;
 			mpd->next_page = page->index + 1;
-			/* Add all dirty buffers to mpd */
-			lblk = ((ext4_lblk_t)page->index) <<
-				(PAGE_SHIFT - blkbits);
-			head = page_buffers(page);
-			err = mpage_process_page_bufs(mpd, head, head, lblk);
-			if (err <= 0)
-				goto out;
-			err = 0;
+			/*
+			 * Writeout for transaction commit where we cannot
+			 * modify metadata is simple. Just submit the page.
+			 */
+			if (!mpd->can_map) {
+				if (ext4_page_nomap_can_writeout(page)) {
+					err = mpage_submit_page(mpd, page);
+					if (err < 0)
+						goto out;
+				} else {
+					unlock_page(page);
+					mpd->first_page++;
+				}
+			} else {
+				/* Add all dirty buffers to mpd */
+				lblk = ((ext4_lblk_t)page->index) <<
+					(PAGE_SHIFT - blkbits);
+				head = page_buffers(page);
+				err = mpage_process_page_bufs(mpd, head, head,
+							      lblk);
+				if (err <= 0)
+					goto out;
+				err = 0;
+			}
 			left--;
 		}
 		pagevec_release(&pvec);
@@ -2778,6 +2808,7 @@ static int ext4_writepages(struct address_space *mapping,
 	 */
 	mpd.do_map = 0;
 	mpd.scanned_until_end = 0;
+	mpd.can_map = 1;
 	mpd.io_submit.io_end = ext4_init_io_end(inode, GFP_KERNEL);
 	if (!mpd.io_submit.io_end) {
 		ret = -ENOMEM;
-- 
2.35.3


  parent reply	other threads:[~2022-11-30 16:36 UTC|newest]

Thread overview: 28+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-11-30 16:35 [PATCH 0/9] ext4: Stop using ext4_writepage() for writeout of ordered data Jan Kara
2022-11-30 16:35 ` [PATCH 1/9] ext4: Handle redirtying in ext4_bio_write_page() Jan Kara
2022-12-01  8:57   ` Ritesh Harjani (IBM)
2022-11-30 16:35 ` [PATCH 2/9] ext4: Move keep_towrite handling to ext4_bio_write_page() Jan Kara
2022-12-01  9:13   ` Ritesh Harjani (IBM)
2022-11-30 16:35 ` [PATCH 3/9] ext4: Remove nr_submitted from ext4_bio_write_page() Jan Kara
2022-12-01  9:14   ` Ritesh Harjani (IBM)
2022-11-30 16:35 ` [PATCH 4/9] ext4: Drop pointless IO submission " Jan Kara
2022-12-01  7:06   ` Ritesh Harjani (IBM)
2022-12-01 10:35     ` Jan Kara
2022-12-01 13:40       ` Ritesh Harjani (IBM)
2022-11-30 16:35 ` Jan Kara [this message]
2022-12-01 11:13   ` [PATCH 5/9] ext4: Add support for writepages calls that cannot map blocks Ritesh Harjani (IBM)
2022-12-01 11:50     ` Jan Kara
2022-12-01 13:28       ` Ritesh Harjani (IBM)
2022-11-30 16:35 ` [PATCH 6/9] ext4: Provide ext4_do_writepages() Jan Kara
2022-12-01 11:15   ` Ritesh Harjani (IBM)
2022-11-30 16:35 ` [PATCH 7/9] ext4: Move percpu_rwsem protection into ext4_writepages() Jan Kara
2022-12-01 11:16   ` Ritesh Harjani (IBM)
2022-11-30 16:35 ` [PATCH 8/9] ext4: Switch to using ext4_do_writepages() for ordered data writeout Jan Kara
2022-12-01 11:17   ` Ritesh Harjani (IBM)
2022-11-30 16:36 ` [PATCH 9/9] ext4: Remove ordered data support from ext4_writepage() Jan Kara
2022-12-01 11:21   ` Ritesh Harjani (IBM)
2022-12-01 13:36     ` Ritesh Harjani (IBM)
2022-12-01 14:11       ` Jan Kara
2022-12-01 14:25         ` Christoph Hellwig
2022-12-01 11:42 ` [PATCH 0/9] ext4: Stop using ext4_writepage() for writeout of ordered data Ritesh Harjani (IBM)
2022-12-01 11:55   ` Jan Kara

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20221130163608.29034-5-jack@suse.cz \
    --to=jack@suse.cz \
    --cc=hch@infradead.org \
    --cc=linux-ext4@vger.kernel.org \
    --cc=tytso@mit.edu \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.