]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
NFS: Don't call generic_error_remove_page() while holding locks
authorTrond Myklebust <trondmy@gmail.com>
Sun, 7 Apr 2019 17:59:03 +0000 (13:59 -0400)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 8 Nov 2023 10:21:06 +0000 (11:21 +0100)
[ Upstream commit 22876f540bdf19af9e4fca893ce02ba7ee65ebcc ]

The NFS read code can trigger writeback while holding the page lock.
If an error then triggers a call to nfs_write_error_remove_page(),
we can deadlock.

Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
fs/nfs/write.c

index 010733c8bdcd395a4532aa7f9f36ffc4dbe90f17..1b5791d5537a30c263afd087a14fe0a71b9cdad2 100644 (file)
@@ -587,9 +587,8 @@ try_again:
 
 static void nfs_write_error_remove_page(struct nfs_page *req)
 {
+       SetPageError(req->wb_page);
        nfs_end_page_writeback(req);
-       generic_error_remove_page(page_file_mapping(req->wb_page),
-                                 req->wb_page);
        nfs_release_request(req);
 }