[Devel] [PATCH VZ10 2/2] fs/fuse: redirty folio on -ENOMEM in fuse_writepages_fill()

Liu Kui kui.liu at virtuozzo.com
Mon Apr 20 10:13:03 MSK 2026


When fuse_writepages_fill() fails with -ENOMEM, the folio is incorrectly
left in a clean state even though it is still being tagged dirty in the
xarray. Since -ENOMEM is non-fatal, the VFS layer may retry writeback
later, but this inconsistency can cause the folio to never be written back,
leading to silent data loss from the application's perspective.

Signed-off-by: Liu Kui <kui.liu at virtuozzo.com>
---
 fs/fuse/file.c | 13 +++++++------
 1 file changed, 7 insertions(+), 6 deletions(-)

diff --git a/fs/fuse/file.c b/fs/fuse/file.c
index b84aac13bfc9..edea59ee4839 100644
--- a/fs/fuse/file.c
+++ b/fs/fuse/file.c
@@ -2724,13 +2724,11 @@ static int fuse_writepages_fill(struct folio *folio,
 	int err;
 	int check_for_blocked = 0;
 
-	if (!wpa && test_bit(FUSE_I_INVAL_FILES, &fi->state)) {
-		unlock_page(&folio->page);
-		return -EIO;
-	}
+	err = -EIO;
+	if (unlikely(!wpa && test_bit(FUSE_I_INVAL_FILES, &fi->state)))
+		goto out_unlock;
 
 	if (!data->ff) {
-		err = -EIO;
 		data->ff = fuse_write_file_get(fi);
 		if (!data->ff)
 			goto out_unlock;
@@ -2743,8 +2741,10 @@ static int fuse_writepages_fill(struct folio *folio,
 
 	err = -ENOMEM;
 	tmp_folio = folio_alloc(GFP_NOFS | __GFP_HIGHMEM, 0);
-	if (!tmp_folio)
+	if (!tmp_folio) {
+		folio_redirty_for_writepage(wbc, folio);
 		goto out_unlock;
+	}
 
 	/*
 	 * The page must not be redirtied until the writeout is completed
@@ -2764,6 +2764,7 @@ static int fuse_writepages_fill(struct folio *folio,
 		wpa = fuse_writepage_args_setup(folio, data->ff);
 		if (!wpa) {
 			folio_put(tmp_folio);
+			folio_redirty_for_writepage(wbc, folio);
 			goto out_unlock;
 		}
 		fuse_file_get(wpa->ia.ff);
-- 
2.39.5 (Apple Git-154)



More information about the Devel mailing list