From: David Howells <dhowells@redhat.com>
To: "Matthew Wilcox (Oracle)" <willy@infradead.org>
Cc: Jeff Layton <jlayton@kernel.org>,
Dominique Martinet <asmadeus@codewreck.org>,
kafs-testing@auristor.com, dhowells@redhat.com,
Jeff Layton <jlayton@kernel.org>,
Ilya Dryomov <idryomov@gmail.com>,
Dominique Martinet <asmadeus@codewreck.org>,
linux-fsdevel@vger.kernel.org, linux-cachefs@redhat.com,
v9fs-developer@lists.sourceforge.net,
linux-afs@lists.infradead.org, ceph-devel@vger.kernel.org,
linux-cifs@vger.kernel.org, linux-nfs@vger.kernel.org,
devel@lists.orangefs.org, linux-mm@kvack.org,
linux-kernel@vger.kernel.org
Subject: [PATCH v4 3/5] folio: Add replacements for page_endio()
Date: Tue, 09 Nov 2021 21:27:44 +0000 [thread overview]
Message-ID: <163649326420.309189.6029879848780568728.stgit@warthog.procyon.org.uk> (raw)
In-Reply-To: <163649323416.309189.4637503793406396694.stgit@warthog.procyon.org.uk>
Add three functions to replace page_endio():
(1) folio_end_read(). End a read to a folio.
(2) folio_end_write(). End a write from a folio.
(3) folio_endio(). A switcher that does one or the other of the above.
Change page_endio() to just call folio_endio(). Note that the parameter
order is switched so that the folio_endio() stub doesn't have to shuffle
the params around, but can rather just test and jump.
Signed-off-by: David Howells <dhowells@redhat.com>
Tested-by: Jeff Layton <jlayton@kernel.org>
Tested-by: Dominique Martinet <asmadeus@codewreck.org>
Tested-by: kafs-testing@auristor.com
Link: https://lore.kernel.org/r/1088663.1635955216@warthog.procyon.org.uk/
---
include/linux/pagemap.h | 9 ++++++-
mm/filemap.c | 64 ++++++++++++++++++++++++++++++++---------------
2 files changed, 51 insertions(+), 22 deletions(-)
diff --git a/include/linux/pagemap.h b/include/linux/pagemap.h
index 1a0c646eb6ff..fd90544bb3e4 100644
--- a/include/linux/pagemap.h
+++ b/include/linux/pagemap.h
@@ -895,7 +895,14 @@ static inline int __must_check write_one_page(struct page *page)
int __set_page_dirty_nobuffers(struct page *page);
int __set_page_dirty_no_writeback(struct page *page);
-void page_endio(struct page *page, bool is_write, int err);
+void folio_end_read(struct folio *folio, int err);
+void folio_end_write(struct folio *folio, int err);
+void folio_endio(struct folio *folio, int err, bool is_write);
+
+static inline void page_endio(struct page *page, bool is_write, int err)
+{
+ folio_endio(page_folio(page), err, is_write);
+}
void folio_end_private_2(struct folio *folio);
void folio_wait_private_2(struct folio *folio);
diff --git a/mm/filemap.c b/mm/filemap.c
index daa0e23a6ee6..841e87b2d6ab 100644
--- a/mm/filemap.c
+++ b/mm/filemap.c
@@ -1612,33 +1612,55 @@ void folio_end_writeback(struct folio *folio)
}
EXPORT_SYMBOL(folio_end_writeback);
-/*
- * After completing I/O on a page, call this routine to update the page
- * flags appropriately
+/**
+ * folio_end_read - Update the state of a folio after a read
+ * @folio: The folio to update
+ * @err: The error code (or 0) to apply
*/
-void page_endio(struct page *page, bool is_write, int err)
+void folio_end_read(struct folio *folio, int err)
{
- if (!is_write) {
- if (!err) {
- SetPageUptodate(page);
- } else {
- ClearPageUptodate(page);
- SetPageError(page);
- }
- unlock_page(page);
+ if (!err) {
+ folio_mark_uptodate(folio);
} else {
- if (err) {
- struct address_space *mapping;
+ folio_clear_uptodate(folio);
+ folio_set_error(folio);
+ }
+ folio_unlock(folio);
+}
+EXPORT_SYMBOL_GPL(folio_end_read);
- SetPageError(page);
- mapping = page_mapping(page);
- if (mapping)
- mapping_set_error(mapping, err);
- }
- end_page_writeback(page);
+/**
+ * folio_end_write - Update the state of a folio after a write
+ * @folio: The folio to update
+ * @err: The error code (or 0) to apply
+ */
+void folio_end_write(struct folio *folio, int err)
+{
+ if (err) {
+ struct address_space *mapping = folio_mapping(folio);
+
+ folio_set_error(folio);
+ if (mapping)
+ mapping_set_error(mapping, err);
}
+ folio_end_writeback(folio);
+}
+EXPORT_SYMBOL_GPL(folio_end_write);
+
+/**
+ * folio_endio - Update the state of a folio after a read or write
+ * @folio: The folio to update
+ * @err: The error code (or 0) to apply
+ * @is_write: True if this was a write
+ */
+void folio_endio(struct folio *folio, int err, bool is_write)
+{
+ if (is_write)
+ folio_end_write(folio, err);
+ else
+ folio_end_read(folio, err);
}
-EXPORT_SYMBOL_GPL(page_endio);
+EXPORT_SYMBOL_GPL(folio_endio);
/**
* __folio_lock - Get a lock on the folio, assuming we need to sleep to get it.
next prev parent reply other threads:[~2021-11-09 21:31 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-11-09 21:27 [PATCH v4 0/5] netfs, 9p, afs, ceph: Support folios, at least partially David Howells
2021-11-09 21:27 ` [PATCH v4 1/5] folio: Add a function to change the private data attached to a folio David Howells
2021-11-09 21:27 ` [PATCH v4 2/5] folio: Add a function to get the host inode for " David Howells
2021-11-09 21:27 ` David Howells [this message]
2021-11-09 21:28 ` [PATCH v4 4/5] netfs, 9p, afs, ceph: Use folios David Howells
2021-11-09 21:28 ` [PATCH v4 5/5] afs: Use folios in directory handling David Howells
2021-11-10 13:33 ` [PATCH v4 0/5] netfs, 9p, afs, ceph: Support folios, at least partially Jeff Layton
2021-11-10 15:18 ` Marc Dionne
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=163649326420.309189.6029879848780568728.stgit@warthog.procyon.org.uk \
--to=dhowells@redhat.com \
--cc=asmadeus@codewreck.org \
--cc=ceph-devel@vger.kernel.org \
--cc=devel@lists.orangefs.org \
--cc=idryomov@gmail.com \
--cc=jlayton@kernel.org \
--cc=kafs-testing@auristor.com \
--cc=linux-afs@lists.infradead.org \
--cc=linux-cachefs@redhat.com \
--cc=linux-cifs@vger.kernel.org \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=linux-nfs@vger.kernel.org \
--cc=v9fs-developer@lists.sourceforge.net \
--cc=willy@infradead.org \
/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.