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;