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

Trond Myklebust
2021-06-28T19:09:40Z

On Mon, 2021-06-28 at 13:39 -0400, Dave Wysochanski wrote:
> 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;

This code path can clearly fail too. Why can we not fix this code to
allow it to return that reported error so that we can handle the
failure case in nfs_readpage() instead of dead-ending here?

> +
> +               nfs_pageio_complete_read(&desc.pgio);
>         }
>  }
>

--
Trond Myklebust
Linux NFS client maintainer, Hammerspace
trond.myklebust@hammerspace.com