From: Dave Wysochanski <dwysocha@redhat.com>
To: Trond Myklebust <trondmy@hammerspace.com>,
Anna Schumaker <anna.schumaker@netapp.com>
Cc: linux-nfs@vger.kernel.org
Subject: [PATCH 09/10] NFS: Update releasepage to handle new fscache kiocb IO API
Date: Thu, 28 Jan 2021 09:55:07 -0500 [thread overview]
Message-ID: <1611845708-6752-10-git-send-email-dwysocha@redhat.com> (raw)
In-Reply-To: <1611845708-6752-1-git-send-email-dwysocha@redhat.com>
When using the new fscache kiocb IO API, netfs callers should
no longer use fscache_maybe_release_page() in releasepage, but
instead should just wait PG_fscache as needed. The PG_fscache
page bit now means the page is being written to the cache.
Signed-off-by: Dave Wysochanski <dwysocha@redhat.com>
---
fs/nfs/file.c | 11 +++++++++--
fs/nfs/fscache.c | 24 ------------------------
fs/nfs/fscache.h | 5 -----
fs/nfs/write.c | 10 ++++------
4 files changed, 13 insertions(+), 37 deletions(-)
diff --git a/fs/nfs/file.c b/fs/nfs/file.c
index ebcaa164db5f..9e41745c3faf 100644
--- a/fs/nfs/file.c
+++ b/fs/nfs/file.c
@@ -431,8 +431,15 @@ static int nfs_release_page(struct page *page, gfp_t gfp)
/* If PagePrivate() is set, then the page is not freeable */
if (PagePrivate(page))
- return 0;
- return nfs_fscache_release_page(page, gfp);
+ return false;
+
+ if (PageFsCache(page)) {
+ if (!(gfp & __GFP_DIRECT_RECLAIM) || !(gfp & __GFP_FS))
+ return false;
+ wait_on_page_fscache(page);
+ }
+
+ return true;
}
static void nfs_check_dirty_writeback(struct page *page,
diff --git a/fs/nfs/fscache.c b/fs/nfs/fscache.c
index 2ff631da62ec..dd8cf3cfed0a 100644
--- a/fs/nfs/fscache.c
+++ b/fs/nfs/fscache.c
@@ -332,30 +332,6 @@ void nfs_fscache_open_file(struct inode *inode, struct file *filp)
EXPORT_SYMBOL_GPL(nfs_fscache_open_file);
/*
- * Release the caching state associated with a page, if the page isn't busy
- * interacting with the cache.
- * - Returns true (can release page) or false (page busy).
- */
-int nfs_fscache_release_page(struct page *page, gfp_t gfp)
-{
- if (PageFsCache(page)) {
- struct fscache_cookie *cookie = nfs_i_fscache(page->mapping->host);
-
- BUG_ON(!cookie);
- dfprintk(FSCACHE, "NFS: fscache releasepage (0x%p/0x%p/0x%p)\n",
- cookie, page, NFS_I(page->mapping->host));
-
- if (!fscache_maybe_release_page(cookie, page, gfp))
- return 0;
-
- nfs_inc_fscache_stats(page->mapping->host,
- NFSIOS_FSCACHE_PAGES_UNCACHED);
- }
-
- return 1;
-}
-
-/*
* Release the caching state associated with a page if undergoing complete page
* invalidation.
*/
diff --git a/fs/nfs/fscache.h b/fs/nfs/fscache.h
index faccf4549d55..9f8b1f8e69f3 100644
--- a/fs/nfs/fscache.h
+++ b/fs/nfs/fscache.h
@@ -94,7 +94,6 @@ struct nfs_fscache_inode_auxdata {
extern void nfs_fscache_open_file(struct inode *, struct file *);
extern void __nfs_fscache_invalidate_page(struct page *, struct inode *);
-extern int nfs_fscache_release_page(struct page *, gfp_t);
extern int nfs_readpage_from_fscache(struct file *file,
struct page *page,
struct nfs_readdesc *desc);
@@ -163,10 +162,6 @@ static inline void nfs_fscache_clear_inode(struct inode *inode) {}
static inline void nfs_fscache_open_file(struct inode *inode,
struct file *filp) {}
-static inline int nfs_fscache_release_page(struct page *page, gfp_t gfp)
-{
- return 1; /* True: may release page */
-}
static inline void nfs_fscache_invalidate_page(struct page *page,
struct inode *inode) {}
static inline void nfs_fscache_wait_on_page_write(struct nfs_inode *nfsi,
diff --git a/fs/nfs/write.c b/fs/nfs/write.c
index 639c34fec04a..156508fb6730 100644
--- a/fs/nfs/write.c
+++ b/fs/nfs/write.c
@@ -2102,17 +2102,15 @@ int nfs_migrate_page(struct address_space *mapping, struct page *newpage,
struct page *page, enum migrate_mode mode)
{
/*
- * If PagePrivate is set, then the page is currently associated with
- * an in-progress read or write request. Don't try to migrate it.
+ * If PagePrivate or PageFsCache is set, then the page is currently
+ * associated with an in-progress read or write request. Don't try
+ * to migrate it.
*
* FIXME: we could do this in principle, but we'll need a way to ensure
* that we can safely release the inode reference while holding
* the page lock.
*/
- if (PagePrivate(page))
- return -EBUSY;
-
- if (!nfs_fscache_release_page(page, GFP_KERNEL))
+ if (PagePrivate(page) || PageFsCache(page))
return -EBUSY;
return migrate_page(mapping, newpage, page, mode);
--
1.8.3.1
next prev parent reply other threads:[~2021-01-28 14:58 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-01-28 14:54 [PATCH 00/10] Convert NFS fscache read paths to netfs API Dave Wysochanski
2021-01-28 14:54 ` [PATCH 01/10] NFS: Clean up nfs_readpage() and nfs_readpages() Dave Wysochanski
2021-01-28 14:55 ` [PATCH 02/10] NFS: In nfs_readpage() only increment NFSIOS_READPAGES when read succeeds Dave Wysochanski
2021-01-28 14:55 ` [PATCH 03/10] NFS: Refactor nfs_readpage() and nfs_readpage_async() to use nfs_readdesc Dave Wysochanski
2021-01-28 14:55 ` [PATCH 04/10] NFS: Call readpage_async_filler() from nfs_readpage_async() Dave Wysochanski
2021-01-28 14:55 ` [PATCH 05/10] NFS: Add nfs_pageio_complete_read() and remove nfs_readpage_async() Dave Wysochanski
2021-01-28 14:55 ` [PATCH 06/10] NFS: Allow internal use of read structs and functions Dave Wysochanski
2021-02-05 13:47 ` David Wysochanski
2021-02-05 16:24 ` Anna Schumaker
2021-01-28 14:55 ` [PATCH 07/10] NFS: Convert to the netfs API and nfs_readpage to use netfs_readpage Dave Wysochanski
2021-01-28 14:55 ` [PATCH 08/10] NFS: Convert readpages to readahead and use netfs_readahead for fscache Dave Wysochanski
2021-01-28 14:55 ` Dave Wysochanski [this message]
2021-01-28 14:55 ` [PATCH 10/10] NFS: update various invalidation code paths for new IO API Dave Wysochanski
2021-02-01 2:15 ` [PATCH 00/10] Convert NFS fscache read paths to netfs API David Wysochanski
2021-02-01 14:30 ` Anna Schumaker
2021-02-02 12:19 ` David Wysochanski
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=1611845708-6752-10-git-send-email-dwysocha@redhat.com \
--to=dwysocha@redhat.com \
--cc=anna.schumaker@netapp.com \
--cc=linux-nfs@vger.kernel.org \
--cc=trondmy@hammerspace.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