From: "Matthew Wilcox (Oracle)" <willy@infradead.org>
To: linux-fsdevel@vger.kernel.org, Andrew Morton <akpm@linux-foundation.org>
Cc: "Matthew Wilcox (Oracle)" <willy@infradead.org>,
Bob Peterson <rpeterso@redhat.com>,
Andreas Gruenbacher <agruenba@redhat.com>,
cluster-devel@redhat.com, Hannes Reinecke <hare@suse.com>,
Luis Chamberlain <mcgrof@kernel.org>
Subject: [PATCH 6/6] buffer: Make block_write_full_page() handle large folios correctly
Date: Wed, 17 May 2023 04:24:42 +0100 [thread overview]
Message-ID: <20230517032442.1135379-7-willy@infradead.org> (raw)
In-Reply-To: <20230517032442.1135379-1-willy@infradead.org>
Keep the interface as struct page, but work entirely on the folio
internally. Removes several PAGE_SIZE assumptions and removes
some references to page->index and page->mapping.
Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org>
---
fs/buffer.c | 22 ++++++++++------------
1 file changed, 10 insertions(+), 12 deletions(-)
diff --git a/fs/buffer.c b/fs/buffer.c
index 4d518df50fab..d8c2c000676b 100644
--- a/fs/buffer.c
+++ b/fs/buffer.c
@@ -2678,33 +2678,31 @@ int block_write_full_page(struct page *page, get_block_t *get_block,
struct writeback_control *wbc)
{
struct folio *folio = page_folio(page);
- struct inode * const inode = page->mapping->host;
+ struct inode * const inode = folio->mapping->host;
loff_t i_size = i_size_read(inode);
- const pgoff_t end_index = i_size >> PAGE_SHIFT;
- unsigned offset;
- /* Is the page fully inside i_size? */
- if (page->index < end_index)
+ /* Is the folio fully inside i_size? */
+ if (folio_pos(folio) + folio_size(folio) <= i_size)
return __block_write_full_folio(inode, folio, get_block, wbc,
end_buffer_async_write);
- /* Is the page fully outside i_size? (truncate in progress) */
- offset = i_size & (PAGE_SIZE-1);
- if (page->index >= end_index+1 || !offset) {
+ /* Is the folio fully outside i_size? (truncate in progress) */
+ if (folio_pos(folio) > i_size) {
folio_unlock(folio);
return 0; /* don't care */
}
/*
- * The page straddles i_size. It must be zeroed out on each and every
+ * The folio straddles i_size. It must be zeroed out on each and every
* writepage invocation because it may be mmapped. "A file is mapped
* in multiples of the page size. For a file that is not a multiple of
- * the page size, the remaining memory is zeroed when mapped, and
+ * the page size, the remaining memory is zeroed when mapped, and
* writes to that region are not written out to the file."
*/
- zero_user_segment(page, offset, PAGE_SIZE);
+ folio_zero_segment(folio, offset_in_folio(folio, i_size),
+ folio_size(folio));
return __block_write_full_folio(inode, folio, get_block, wbc,
- end_buffer_async_write);
+ end_buffer_async_write);
}
EXPORT_SYMBOL(block_write_full_page);
--
2.39.2
next prev parent reply other threads:[~2023-05-17 3:25 UTC|newest]
Thread overview: 18+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-05-17 3:24 [PATCH 0/6] gfs2/buffer folio changes Matthew Wilcox (Oracle)
2023-05-17 3:24 ` [PATCH 1/6] gfs2: Use a folio inside gfs2_jdata_writepage() Matthew Wilcox (Oracle)
2023-05-17 3:24 ` [PATCH 2/6] gfs2: Pass a folio to __gfs2_jdata_write_folio() Matthew Wilcox (Oracle)
2023-05-17 3:24 ` [PATCH 3/6] gfs2: Convert gfs2_write_jdata_page() to gfs2_write_jdata_folio() Matthew Wilcox (Oracle)
2023-06-03 9:34 ` Andreas Gruenbacher
2023-06-04 3:35 ` Matthew Wilcox
2023-06-04 7:27 ` Andreas Gruenbacher
2023-05-17 3:24 ` [PATCH 4/6] buffer: Convert __block_write_full_page() to __block_write_full_folio() Matthew Wilcox (Oracle)
[not found] ` <CGME20230517144703eucas1p1550db888e29fc5b182c202f24adddb87@eucas1p1.samsung.com>
2023-05-17 14:47 ` Pankaj Raghav
2023-05-17 15:43 ` Matthew Wilcox
2023-05-17 3:24 ` [PATCH 5/6] gfs2: Support ludicrously large folios in gfs2_trans_add_databufs() Matthew Wilcox (Oracle)
2023-05-23 12:46 ` Andreas Gruenbacher
2023-05-23 13:37 ` Matthew Wilcox
2023-06-03 9:46 ` Andreas Gruenbacher
2023-05-17 3:24 ` Matthew Wilcox (Oracle) [this message]
2023-05-17 18:06 ` [PATCH 0/6] gfs2/buffer folio changes Bob Peterson
2023-06-02 12:30 ` Bob Peterson
2023-06-02 13:25 ` Bob Peterson
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=20230517032442.1135379-7-willy@infradead.org \
--to=willy@infradead.org \
--cc=agruenba@redhat.com \
--cc=akpm@linux-foundation.org \
--cc=cluster-devel@redhat.com \
--cc=hare@suse.com \
--cc=linux-fsdevel@vger.kernel.org \
--cc=mcgrof@kernel.org \
--cc=rpeterso@redhat.com \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).