Commit c91440c8 authored by Joanne Koong's avatar Joanne Koong Committed by Miklos Szeredi
Browse files

fuse: support large folios for stores



Add support for folios larger than one page size for stores.
Also change variable naming from "this_num" to "nr_bytes".

Signed-off-by: default avatarJoanne Koong <joannelkoong@gmail.com>
Reviewed-by: default avatarJosef Bacik <josef@toxicpanda.com>
Reviewed-by: default avatarJeff Layton <jlayton@kernel.org>
Signed-off-by: default avatarMiklos Szeredi <mszeredi@redhat.com>
parent cacc0645
Loading
Loading
Loading
Loading
+12 −7
Original line number Diff line number Diff line
@@ -1788,18 +1788,23 @@ static int fuse_notify_store(struct fuse_conn *fc, unsigned int size,
	num = outarg.size;
	while (num) {
		struct folio *folio;
		unsigned int this_num;
		unsigned int folio_offset;
		unsigned int nr_bytes;
		unsigned int nr_pages;

		folio = filemap_grab_folio(mapping, index);
		err = PTR_ERR(folio);
		if (IS_ERR(folio))
			goto out_iput;

		this_num = min_t(unsigned, num, folio_size(folio) - offset);
		err = fuse_copy_folio(cs, &folio, offset, this_num, 0);
		folio_offset = ((index - folio->index) << PAGE_SHIFT) + offset;
		nr_bytes = min_t(unsigned, num, folio_size(folio) - folio_offset);
		nr_pages = (offset + nr_bytes + PAGE_SIZE - 1) >> PAGE_SHIFT;

		err = fuse_copy_folio(cs, &folio, folio_offset, nr_bytes, 0);
		if (!folio_test_uptodate(folio) && !err && offset == 0 &&
		    (this_num == folio_size(folio) || file_size == end)) {
			folio_zero_segment(folio, this_num, folio_size(folio));
		    (nr_bytes == folio_size(folio) || file_size == end)) {
			folio_zero_segment(folio, nr_bytes, folio_size(folio));
			folio_mark_uptodate(folio);
		}
		folio_unlock(folio);
@@ -1808,9 +1813,9 @@ static int fuse_notify_store(struct fuse_conn *fc, unsigned int size,
		if (err)
			goto out_iput;

		num -= this_num;
		num -= nr_bytes;
		offset = 0;
		index++;
		index += nr_pages;
	}

	err = 0;