On Thu, 22 Aug 2024 at 15:14, Miklos Szeredi <miklos@xxxxxxxxxx> wrote: > > > What I don't understand is how this results in the -EIO that Jürg > > > reported. > > > > I'm not really familiar with this code but it seems `folio_end_read()` > > uses xor to update the `PG_uptodate` flag. So if it was already set, it > > will incorrectly clear the `PG_uptodate` set, which I guess triggers > > the issue. Untested patch attached. Could you please try this? Thanks, Miklos
diff --git a/fs/fuse/dev.c b/fs/fuse/dev.c index 1f1d8a023d35..7cc4f8c9b896 100644 --- a/fs/fuse/dev.c +++ b/fs/fuse/dev.c @@ -789,7 +789,6 @@ static int fuse_check_folio(struct folio *folio) (folio->flags & PAGE_FLAGS_CHECK_AT_PREP & ~(1 << PG_locked | 1 << PG_referenced | - 1 << PG_uptodate | 1 << PG_lru | 1 << PG_active | 1 << PG_workingset | @@ -834,9 +833,7 @@ static int fuse_try_move_page(struct fuse_copy_state *cs, struct page **pagep) newfolio = page_folio(buf->page); - if (!folio_test_uptodate(newfolio)) - folio_mark_uptodate(newfolio); - + folio_clear_uptodate(newfolio); folio_clear_mappedtodisk(newfolio); if (fuse_check_folio(newfolio) != 0)