From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([208.118.235.92]:60676) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TGJ6F-0002BF-5B for qemu-devel@nongnu.org; Mon, 24 Sep 2012 20:34:08 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1TGJ6D-0002uA-Vk for qemu-devel@nongnu.org; Mon, 24 Sep 2012 20:34:07 -0400 Received: from mail-ob0-f173.google.com ([209.85.214.173]:40255) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TGJ6D-0002tr-Qm for qemu-devel@nongnu.org; Mon, 24 Sep 2012 20:34:05 -0400 Received: by obbta14 with SMTP id ta14so5649765obb.4 for ; Mon, 24 Sep 2012 17:34:04 -0700 (PDT) From: Anthony Liguori In-Reply-To: References: Date: Mon, 24 Sep 2012 19:34:00 -0500 Message-ID: <87d31b0wlj.fsf@codemonkey.ws> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Subject: Re: [Qemu-devel] [PATCH 03/14] iov: add iov_cpy List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: "Michael S. Tsirkin" , qemu-devel@nongnu.org, Jason Wang , stefanha@linux.vnet.ibm.com, aurelien@aurel32.net "Michael S. Tsirkin" writes: > Add API to copy part of iovec safely. > > Signed-off-by: Michael S. Tsirkin > --- > iov.c | 23 +++++++++++++++++++++++ > iov.h | 9 +++++++++ > 2 files changed, 32 insertions(+) > > diff --git a/iov.c b/iov.c > index c6a66f0..0dfcb28 100644 > --- a/iov.c > +++ b/iov.c > @@ -228,3 +228,26 @@ void iov_hexdump(const struct iovec *iov, const unsigned int iov_cnt, > fprintf(fp, "\n"); > } > } > + > +unsigned iov_cpy(struct iovec *dst_iov, unsigned int dst_iov_cnt, > + const struct iovec *iov, unsigned int iov_cnt, > + size_t offset, size_t bytes) I think the readability f the cde wuld be imprved if yu added the missing 'o' to iov_cpy. Otherwise: Reviewed-by: Anthony Liguori Regards, Anthony Liguori > +{ > + size_t len; > + unsigned int i, j; > + for (i = 0, j = 0; i < iov_cnt && j < dst_iov_cnt && bytes; i++) { > + if (offset >= iov[i].iov_len) { > + offset -= iov[i].iov_len; > + continue; > + } > + len = MIN(bytes, iov[i].iov_len - offset); > + > + dst_iov[j].iov_base = iov[i].iov_base + offset; > + dst_iov[j].iov_len = len; > + j++; > + bytes -= len; > + offset = 0; > + } > + assert(offset == 0); > + return j; > +} > diff --git a/iov.h b/iov.h > index a73569f..f0daefa 100644 > --- a/iov.h > +++ b/iov.h > @@ -86,3 +86,12 @@ ssize_t iov_send_recv(int sockfd, struct iovec *iov, unsigned iov_cnt, > */ > void iov_hexdump(const struct iovec *iov, const unsigned int iov_cnt, > FILE *fp, const char *prefix, size_t limit); > + > +/* > + * Partial copy of vector from iov to dst_iov (data is not copied). > + * dst_iov overlaps iov at a specified offset. > + * size of dst_iov is at most bytes. Actual size is returned. > + */ > +size_t iov_cpy(struct iovec *dst_iov, unsigned int dst_iov_cnt, > + const struct iovec *iov, unsigned int iov_cnt, > + size_t offset, size_t bytes); > -- > MST