]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
netfs: Fix writeback error handling
authorDavid Howells <dhowells@redhat.com>
Thu, 25 Jun 2026 14:06:31 +0000 (15:06 +0100)
committerChristian Brauner <brauner@kernel.org>
Wed, 1 Jul 2026 13:26:30 +0000 (15:26 +0200)
Fix the error handling in writeback_iter() loop.  If an error occurs,
writeback_iter() needs to be called again with *error set to the error so
that it can clean up iteration state.  Further, the current folio needs
unlocking and redirtying.

Fixes: 288ace2f57c9 ("netfs: New writeback implementation")
Link: https://sashiko.dev/#/patchset/20260619140646.2633762-1-dhowells%40redhat.com
Signed-off-by: David Howells <dhowells@redhat.com>
Link: https://patch.msgid.link/20260625140640.3116900-14-dhowells@redhat.com
cc: Paulo Alcantara <pc@manguebit.org>
cc: Matthew Wilcox <willy@infradead.org>
cc: netfs@lists.linux.dev
cc: linux-fsdevel@vger.kernel.org
Signed-off-by: Christian Brauner (Amutable) <brauner@kernel.org>
fs/netfs/write_issue.c

index 3b363ce12f3f73efda42ac909390f0e679c10b82..3682896c3fdf0d5debfd4840fa2d48c8f6e1e1e6 100644 (file)
@@ -582,8 +582,6 @@ int netfs_writepages(struct address_space *mapping,
                }
 
                error = netfs_write_folio(wreq, wbc, folio);
-               if (error < 0)
-                       break;
        } while ((folio = writeback_iter(mapping, wbc, folio, &error)));
 
        netfs_end_issue_write(wreq);
@@ -594,7 +592,14 @@ int netfs_writepages(struct address_space *mapping,
        return error;
 
 couldnt_start:
-       netfs_kill_dirty_pages(mapping, wbc, folio);
+       if (error == -ENOMEM) {
+               folio_redirty_for_writepage(wbc, folio);
+               folio_unlock(folio);
+               folio = writeback_iter(mapping, wbc, folio, &error);
+               WARN_ON_ONCE(folio != NULL);
+       } else {
+               netfs_kill_dirty_pages(mapping, wbc, folio);
+       }
 out:
        netfs_wb_end(ictx);
        _leave(" = %d", error);