| From e0340f16a08d031de54ed91d26f57c9a966a776a Mon Sep 17 00:00:00 2001 |
| From: Dave Wysochanski <dwysocha@redhat.com> |
| Date: Tue, 29 Jun 2021 05:11:28 -0400 |
| Subject: NFS: Ensure nfs_readpage returns promptly when internal error occurs |
| |
| From: Dave Wysochanski <dwysocha@redhat.com> |
| |
| commit e0340f16a08d031de54ed91d26f57c9a966a776a upstream. |
| |
| A previous refactoring of nfs_readpage() might end up calling |
| wait_on_page_locked_killable() even if readpage_async_filler() failed |
| with an internal error and pg_error was non-zero (for example, if |
| nfs_create_request() failed). In the case of an internal error, |
| skip over wait_on_page_locked_killable() as this is only needed |
| when the read is sent and an error occurs during completion handling. |
| |
| Signed-off-by: Dave Wysochanski <dwysocha@redhat.com> |
| Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| fs/nfs/read.c | 6 +++--- |
| 1 file changed, 3 insertions(+), 3 deletions(-) |
| |
| --- a/fs/nfs/read.c |
| +++ b/fs/nfs/read.c |
| @@ -374,10 +374,10 @@ int nfs_readpage(struct file *file, stru |
| &nfs_async_read_completion_ops); |
| |
| ret = readpage_async_filler(&desc, page); |
| + if (ret) |
| + goto out; |
| |
| - if (!ret) |
| - nfs_pageio_complete_read(&desc.pgio, inode); |
| - |
| + nfs_pageio_complete_read(&desc.pgio, inode); |
| ret = desc.pgio.pg_error < 0 ? desc.pgio.pg_error : 0; |
| if (!ret) { |
| ret = wait_on_page_locked_killable(page); |