* Data may be placed either in a user or kernel buffer.
*/
ssize_t pvfs2_inode_read(struct inode *inode,
- char __user *buf,
- size_t count,
+ struct iov_iter *iter,
loff_t *offset,
loff_t readahead_size)
{
struct pvfs2_inode_s *pvfs2_inode = PVFS2_I(inode);
+ size_t count = iov_iter_count(iter);
size_t bufmap_size;
- struct iovec vec;
- struct iov_iter iter;
ssize_t ret = -EINVAL;
g_pvfs2_stats.reads++;
- vec.iov_base = buf;
- vec.iov_len = count;
-
bufmap_size = pvfs_bufmap_size_query();
if (count > bufmap_size) {
gossip_debug(GOSSIP_FILE_DEBUG,
count,
llu(*offset));
- iov_iter_init(&iter, READ, &vec, 1, count);
- ret = wait_for_direct_io(PVFS_IO_READ, inode, offset, &iter,
+ ret = wait_for_direct_io(PVFS_IO_READ, inode, offset, iter,
count, readahead_size);
if (ret > 0)
*offset += ret;
static int read_one_page(struct page *page)
{
- void *page_data;
int ret;
int max_block;
ssize_t bytes_read = 0;
struct inode *inode = page->mapping->host;
const __u32 blocksize = PAGE_CACHE_SIZE; /* inode->i_blksize */
const __u32 blockbits = PAGE_CACHE_SHIFT; /* inode->i_blkbits */
+ struct iov_iter to;
+ struct bio_vec bv = {.bv_page = page, .bv_len = PAGE_SIZE};
+
+ iov_iter_bvec(&to, ITER_BVEC | READ, &bv, 1, PAGE_SIZE);
gossip_debug(GOSSIP_INODE_DEBUG,
"pvfs2_readpage called with page %p\n",
page);
- page_data = pvfs2_kmap(page);
max_block = ((inode->i_size / blocksize) + 1);
loff_t blockptr_offset = (((loff_t) page->index) << blockbits);
bytes_read = pvfs2_inode_read(inode,
- (char __user *) page_data,
- blocksize,
+ &to,
&blockptr_offset,
inode->i_size);
}
- /* only zero remaining unread portions of the page data */
- if (bytes_read > 0)
- memset(page_data + bytes_read, 0, blocksize - bytes_read);
- else
- memset(page_data, 0, blocksize);
+ /* this will only zero remaining unread portions of the page data */
+ iov_iter_zero(~0U, &to);
/* takes care of potential aliasing */
flush_dcache_page(page);
if (bytes_read < 0) {
ClearPageError(page);
ret = 0;
}
- pvfs2_kunmap(page);
/* unlock the page after the ->readpage() routine completes */
unlock_page(page);
return ret;