[PATCH 4/4] NFS: Fix fscache read from NFS after cache error

Dave Wysochanski
2021-06-28T17:39:13Z

Earlier commits refactored some NFS read code and removed
nfs_readpage_async(), but neglected to properly fixup
nfs_readpage_from_fscache_complete(). The code path is
only hit when something unusual occurs with the cachefiles
backing filesystem, such as an IO error or while a cookie
is being invalidated.

Signed-off-by: Dave Wysochanski <dwysocha@redhat.com>
---
fs/nfs/fscache.c | 14 ++++++++++++--
1 file changed, 12 insertions(+), 2 deletions(-)

diff --git a/fs/nfs/fscache.c b/fs/nfs/fscache.c
index c4c021c6ebbd..d308cb7e1dd4 100644
--- a/fs/nfs/fscache.c
+++ b/fs/nfs/fscache.c
@@ -381,15 +381,25 @@ static void nfs_readpage_from_fscache_complete(struct page *page,
void *context,
int error)
{
+ struct nfs_readdesc desc;
+ struct inode *inode = page->mapping->host;
+
dfprintk(FSCACHE,
"NFS: readpage_from_fscache_complete (0x%p/0x%p/%d)\n",
page, context, error);

- /* if the read completes with an error, we just unlock the page and let
- * the VM reissue the readpage */
if (!error) {
SetPageUptodate(page);
unlock_page(page);
+ } else {
+ desc.ctx = context;
+ nfs_pageio_init_read(&desc.pgio, inode, false,
+ &nfs_async_read_completion_ops);
+ error = readpage_async_filler(&desc, page);
+ if (error)
+ return;
+
+ nfs_pageio_complete_read(&desc.pgio);
}
}

--
1.8.3.1