diff options
author | Trond Myklebust <trond.myklebust@hammerspace.com> | 2019-02-13 10:39:39 -0500 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2019-09-06 10:22:23 +0200 |
commit | b5891b624b9a5d3dd65b6c5a6601480bcb1a3dc3 (patch) | |
tree | 414e3fc825c4b1c989da32f2e803e550613341fe /fs/nfs/write.c | |
parent | 812de6dee596e10d46ce3d7dc4736fa288218117 (diff) |
NFS: Pass error information to the pgio error cleanup routine
[ Upstream commit df3accb849607a86278a37c35e6b313635ccc48b ]
Allow the caller to pass error information when cleaning up a failed
I/O request so that we can conditionally take action to cancel the
request altogether if the error turned out to be fatal.
Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
Diffstat (limited to 'fs/nfs/write.c')
-rw-r--r-- | fs/nfs/write.c | 11 |
1 files changed, 9 insertions, 2 deletions
diff --git a/fs/nfs/write.c b/fs/nfs/write.c index 51d0b7913c04..5ab997912d8d 100644 --- a/fs/nfs/write.c +++ b/fs/nfs/write.c @@ -1394,20 +1394,27 @@ static void nfs_redirty_request(struct nfs_page *req) nfs_release_request(req); } -static void nfs_async_write_error(struct list_head *head) +static void nfs_async_write_error(struct list_head *head, int error) { struct nfs_page *req; while (!list_empty(head)) { req = nfs_list_entry(head->next); nfs_list_remove_request(req); + if (nfs_error_is_fatal(error)) { + nfs_context_set_write_error(req->wb_context, error); + if (nfs_error_is_fatal_on_server(error)) { + nfs_write_error_remove_page(req); + continue; + } + } nfs_redirty_request(req); } } static void nfs_async_write_reschedule_io(struct nfs_pgio_header *hdr) { - nfs_async_write_error(&hdr->pages); + nfs_async_write_error(&hdr->pages, 0); filemap_fdatawrite_range(hdr->inode->i_mapping, hdr->args.offset, hdr->args.offset + hdr->args.count - 1); } |