diff --git a/fs/orangefs/file.c b/fs/orangefs/file.c index feb1764c2f80..92a0974f0743 100644 --- a/fs/orangefs/file.c +++ b/fs/orangefs/file.c @@ -89,7 +89,8 @@ static int postcopy_buffers(struct pvfs2_bufmap *bufmap, iov_iter_init(&iter, READ, vec, nr_segs, total_size); ret = pvfs_bufmap_copy_to_iovec(bufmap, &iter, - buffer_index); + buffer_index, + total_size); if (ret < 0) gossip_err("%s: Failed to copy-out buffers. Please make sure that the pvfs2-client is running (%ld)\n", __func__, diff --git a/fs/orangefs/pvfs2-bufmap.c b/fs/orangefs/pvfs2-bufmap.c index 9d0392a3e824..843883035214 100644 --- a/fs/orangefs/pvfs2-bufmap.c +++ b/fs/orangefs/pvfs2-bufmap.c @@ -542,25 +542,26 @@ int pvfs_bufmap_copy_from_iovec(struct pvfs2_bufmap *bufmap, */ int pvfs_bufmap_copy_to_iovec(struct pvfs2_bufmap *bufmap, struct iov_iter *iter, - int buffer_index) + int buffer_index, + size_t size) { - struct pvfs_bufmap_desc *from; - struct page *page; + struct pvfs_bufmap_desc *from = &bufmap->desc_array[buffer_index]; int i; - size_t written; gossip_debug(GOSSIP_BUFMAP_DEBUG, - "%s: buffer_index:%d: iov_iter_count(iter):%lu:\n", - __func__, buffer_index, iov_iter_count(iter)); + "%s: buffer_index:%d: size:%zu:\n", + __func__, buffer_index, size); - from = &bufmap->desc_array[buffer_index]; - for (i = 0; iov_iter_count(iter); i++) { - page = from->page_array[i]; - written = copy_page_to_iter(page, 0, PAGE_SIZE, iter); - if ((written == 0) && (iov_iter_count(iter))) - break; + for (i = 0; size; i++) { + struct page *page = from->page_array[i]; + size_t n = size; + if (n > PAGE_SIZE) + n = PAGE_SIZE; + n = copy_page_to_iter(page, 0, n, iter); + if (!n) + return -EFAULT; + size -= n; } - - return iov_iter_count(iter) ? -EFAULT : 0; + return 0; } diff --git a/fs/orangefs/pvfs2-bufmap.h b/fs/orangefs/pvfs2-bufmap.h index a0f84c045d73..d1aedb52a877 100644 --- a/fs/orangefs/pvfs2-bufmap.h +++ b/fs/orangefs/pvfs2-bufmap.h @@ -49,7 +49,8 @@ int pvfs_bufmap_copy_from_iovec(struct pvfs2_bufmap *bufmap, int pvfs_bufmap_copy_to_iovec(struct pvfs2_bufmap *bufmap, struct iov_iter *iter, - int buffer_index); + int buffer_index, + size_t size); size_t pvfs_bufmap_copy_to_user_task_iovec(struct task_struct *tsk, struct iovec *iovec,