cachefiles: Fix unset error when calling netfs_prepare_write_failed()
From: David Howells
Date: Wed Sep 30 2026 - 08:49:36 EST
Fix cachefiles to set subreq->error before calling
netfs_prepare_write_failed() otherwise netfslib will try (and fail) to
retry the subrequest (it shouldn't retry writes to the cache, but rather
abandon them). This causes it to hang waiting for the request to complete.
Reported-by: Marc Dionne <marc.dionne@xxxxxxxxxxxx>
Fixes: 1a9fe4b6e787 ("cachefiles: Don't rely on backing fs storage map for most use cases")
Signed-off-by: David Howells <dhowells@xxxxxxxxxx>
Tested-by: Marc Dionne <marc.dionne@xxxxxxxxxxxx>
cc: Paulo Alcantara <pc@xxxxxxxxxxxxx>
cc: Matthew Wilcox <willy@xxxxxxxxxxxxx>
cc: linux-cifs@xxxxxxxxxxxxxxx
cc: netfs@xxxxxxxxxxxxxxx
cc: linux-fsdevel@xxxxxxxxxxxxxxx
---
fs/cachefiles/io.c | 2 ++
fs/netfs/write_issue.c | 1 +
2 files changed, 3 insertions(+)
diff --git a/fs/cachefiles/io.c b/fs/cachefiles/io.c
index 4f547d97356e..d05059822288 100644
--- a/fs/cachefiles/io.c
+++ b/fs/cachefiles/io.c
@@ -528,10 +528,12 @@ static void cachefiles_prepare_write_subreq(struct netfs_io_subrequest *subreq)
if (!cachefiles_cres_file(cres)) {
if (!fscache_wait_for_operation(cres, FSCACHE_WANT_WRITE)) {
+ subreq->error = -ENOBUFS;
trace_netfs_sreq(subreq, netfs_sreq_trace_cache_waitfail);
return netfs_prepare_write_failed(subreq);
}
if (!cachefiles_cres_file(cres)) {
+ subreq->error = -ENOBUFS;
trace_netfs_sreq(subreq, netfs_sreq_trace_cache_nofile);
return netfs_prepare_write_failed(subreq);
}
diff --git a/fs/netfs/write_issue.c b/fs/netfs/write_issue.c
index 9de73c0edad2..b255a1167bb1 100644
--- a/fs/netfs/write_issue.c
+++ b/fs/netfs/write_issue.c
@@ -148,6 +148,7 @@ struct netfs_io_request *netfs_create_write_req(struct address_space *mapping,
*/
void netfs_prepare_write_failed(struct netfs_io_subrequest *subreq)
{
+ WARN_ON_ONCE(!subreq->error);
__set_bit(NETFS_SREQ_FAILED, &subreq->flags);
trace_netfs_sreq(subreq, netfs_sreq_trace_prep_failed);
}