
Avoid filling more pages than max_pages in fuse_fill_write_pages(), which leads to data loss. This causes the fuse xfstests generic/522 test case to fail. Signed-off-by: Baokun Li <libaokun1@huawei.com> --- fs/fuse/file.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/fs/fuse/file.c b/fs/fuse/file.c index 23c09556b211..989e19bdc3a0 100644 --- a/fs/fuse/file.c +++ b/fs/fuse/file.c @@ -1222,6 +1222,7 @@ static ssize_t fuse_fill_write_pages(struct fuse_io_args *ia, struct fuse_args_pages *ap = &ia->ap; struct fuse_conn *fc = get_fuse_conn(mapping->host); unsigned offset = pos & (PAGE_SIZE - 1); + unsigned int nr_pages = 0; size_t count = 0; unsigned int num; int err; @@ -1270,6 +1271,7 @@ static ssize_t fuse_fill_write_pages(struct fuse_io_args *ia, ap->descs[ap->num_folios].offset = folio_offset; ap->descs[ap->num_folios].length = tmp; ap->num_folios++; + nr_pages += 1 << folio_order(folio); count += tmp; pos += tmp; @@ -1292,6 +1294,8 @@ static ssize_t fuse_fill_write_pages(struct fuse_io_args *ia, break; if (offset != 0) break; + if (nr_pages >= max_pages) + break; } return count > 0 ? count : err; -- 2.46.1