From: Al Viro Date: Thu, 8 Oct 2015 21:47:44 +0000 (-0400) Subject: pvfs_bufmap_copy_from_iovec(): don't rely upon size being equal to iov_iter_count... X-Git-Url: https://git.karo-electronics.de/?a=commitdiff_plain;h=34204fde4c877cb33d8ec0df09f38333f570cc84;p=linux-beck.git pvfs_bufmap_copy_from_iovec(): don't rely upon size being equal to iov_iter_count(iter) Signed-off-by: Al Viro Signed-off-by: Mike Marshall --- diff --git a/fs/orangefs/pvfs2-bufmap.c b/fs/orangefs/pvfs2-bufmap.c index 843883035214..dacf42bee196 100644 --- a/fs/orangefs/pvfs2-bufmap.c +++ b/fs/orangefs/pvfs2-bufmap.c @@ -512,26 +512,25 @@ int pvfs_bufmap_copy_from_iovec(struct pvfs2_bufmap *bufmap, int buffer_index, size_t size) { - struct pvfs_bufmap_desc *to; - struct page *page; - size_t copied; + struct pvfs_bufmap_desc *to = &bufmap->desc_array[buffer_index]; int i; gossip_debug(GOSSIP_BUFMAP_DEBUG, - "%s: buffer_index:%d: size:%lu:\n", + "%s: buffer_index:%d: size:%zu:\n", __func__, buffer_index, size); - to = &bufmap->desc_array[buffer_index]; for (i = 0; size; i++) { - page = to->page_array[i]; - copied = copy_page_from_iter(page, 0, PAGE_SIZE, iter); - size -= copied; - if ((copied == 0) && (size)) - break; + struct page *page = to->page_array[i]; + size_t n = size; + if (n > PAGE_SIZE) + n = PAGE_SIZE; + n = copy_page_from_iter(page, 0, n, iter); + if (!n) + return -EFAULT; + size -= n; } - - return size ? -EFAULT : 0; + return 0; }