Re: [PATCH 5.15] fuse: Fix race condition in writethrough path A race
From: Miklos Szeredi
Date: Tue Oct 14 2025 - 12:15:39 EST
On Tue, 14 Oct 2025 at 14:43, Miklos Szeredi <miklos@xxxxxxxxxx> wrote:
> Will try the idea of marking folios writeback for the duration of the write.
Attaching a test patch, minimally tested.
Guangming, can you please test if this fixes the cache corruption?
Thanks,
Miklos
diff --git a/fs/fuse/file.c b/fs/fuse/file.c
index 905726ac3a7a..2f12a501df9d 100644
--- a/fs/fuse/file.c
+++ b/fs/fuse/file.c
@@ -1121,9 +1121,6 @@ static ssize_t fuse_send_write_pages(struct fuse_io_args *ia,
bool short_write;
int err;
- for (i = 0; i < ap->num_folios; i++)
- folio_wait_writeback(ap->folios[i]);
-
fuse_write_args_fill(ia, ff, pos, count);
ia->write.in.flags = fuse_write_flags(iocb);
if (fm->fc->handle_killpriv_v2 && !capable(CAP_FSETID))
@@ -1153,6 +1150,8 @@ static ssize_t fuse_send_write_pages(struct fuse_io_args *ia,
}
if (ia->write.folio_locked && (i == ap->num_folios - 1))
folio_unlock(folio);
+ else
+ folio_end_writeback_no_dropbehind(folio);
folio_put(folio);
}
@@ -1232,6 +1231,8 @@ static ssize_t fuse_fill_write_pages(struct fuse_io_args *ia,
folio_mark_uptodate(folio);
if (folio_test_uptodate(folio)) {
+ folio_wait_writeback(folio);
+ folio_start_writeback(folio);
folio_unlock(folio);
} else {
ia->write.folio_locked = true;