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

fuse: refactor fuse_fill_write_pages()



Refactor the logic in fuse_fill_write_pages() for copying out write
data. This will make the future change for supporting large folios for
writes easier. No functional changes.

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>
Reviewed-by: default avatarBernd Schubert <bschubert@ddn.com>
Signed-off-by: default avatarMiklos Szeredi <mszeredi@redhat.com>
parent 3568a956
Loading
Loading
Loading
Loading
+10 −12
Original line number Diff line number Diff line
@@ -1132,21 +1132,21 @@ 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;
	int err;
	unsigned int num;
	int err = 0;

	num = min(iov_iter_count(ii), fc->max_write);
	num = min(num, max_pages << PAGE_SHIFT);

	ap->args.in_pages = true;
	ap->descs[0].offset = offset;

	do {
	while (num) {
		size_t tmp;
		struct folio *folio;
		pgoff_t index = pos >> PAGE_SHIFT;
		size_t bytes = min_t(size_t, PAGE_SIZE - offset,
				     iov_iter_count(ii));

		bytes = min_t(size_t, bytes, fc->max_write - count);
		unsigned bytes = min(PAGE_SIZE - offset, num);

 again:
		folio = __filemap_get_folio(mapping, index, FGP_WRITEBEGIN,
@@ -1178,14 +1178,13 @@ static ssize_t fuse_fill_write_pages(struct fuse_io_args *ia,
			goto again;
		}

		err = 0;
		ap->folios[ap->num_folios] = folio;
		ap->descs[ap->num_folios].length = tmp;
		ap->num_folios++;
		nr_pages++;

		count += tmp;
		pos += tmp;
		num -= tmp;
		offset += tmp;
		if (offset == PAGE_SIZE)
			offset = 0;
@@ -1200,10 +1199,9 @@ static ssize_t fuse_fill_write_pages(struct fuse_io_args *ia,
			ia->write.folio_locked = true;
			break;
		}
		if (!fc->big_writes)
		if (!fc->big_writes || offset != 0)
			break;
	} while (iov_iter_count(ii) && count < fc->max_write &&
		 nr_pages < max_pages && offset == 0);
	}

	return count > 0 ? count : err;
}