Commit c7d57ab1 authored by Al Viro's avatar Al Viro
Browse files

hugetlbfs: copy_page_to_iter() can deal with compound pages



... since April 2021

Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent f0f6b614
Loading
Loading
Loading
Loading
+1 −30
Original line number Diff line number Diff line
@@ -284,35 +284,6 @@ hugetlb_get_unmapped_area(struct file *file, unsigned long addr,
}
#endif

static size_t
hugetlbfs_read_actor(struct page *page, unsigned long offset,
			struct iov_iter *to, unsigned long size)
{
	size_t copied = 0;
	int i, chunksize;

	/* Find which 4k chunk and offset with in that chunk */
	i = offset >> PAGE_SHIFT;
	offset = offset & ~PAGE_MASK;

	while (size) {
		size_t n;
		chunksize = PAGE_SIZE;
		if (offset)
			chunksize -= offset;
		if (chunksize > size)
			chunksize = size;
		n = copy_page_to_iter(&page[i], offset, chunksize, to);
		copied += n;
		if (n != chunksize)
			return copied;
		offset = 0;
		size -= chunksize;
		i++;
	}
	return copied;
}

/*
 * Support for read() - Find the page attached to f_mapping and copy out the
 * data. Its *very* similar to generic_file_buffered_read(), we can't use that
@@ -363,7 +334,7 @@ static ssize_t hugetlbfs_read_iter(struct kiocb *iocb, struct iov_iter *to)
			/*
			 * We have the page, copy it to user space buffer.
			 */
			copied = hugetlbfs_read_actor(page, offset, to, nr);
			copied = copy_page_to_iter(page, offset, nr, to);
			put_page(page);
		}
		offset += copied;