iov: Update parameter usage in iov_(to|from)_buf()
iov_to_buf() has an 'offset' parameter, iov_from_buf() hasn't. This patch adds the missing parameter to iov_from_buf(). It also renames the 'offset' parameter to 'iov_off' to emphasize it's the offset into the iovec and not the buffer. Signed-off-by: Hannes Reinecke <hare@suse.de> Acked-by: Alexander Graf <agraf@suse.de> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
This commit is contained in:
parent
5afc8b3de9
commit
348e7b8dcd
@ -657,7 +657,7 @@ static ssize_t virtio_net_receive(VLANClientState *nc, const uint8_t *buf, size_
|
||||
|
||||
/* copy in packet. ugh */
|
||||
len = iov_from_buf(sg, elem.in_num,
|
||||
buf + offset, size - offset);
|
||||
buf + offset, 0, size - offset);
|
||||
total += len;
|
||||
offset += len;
|
||||
/* If buffers can't be merged, at this point we
|
||||
|
@ -103,7 +103,7 @@ static size_t write_to_port(VirtIOSerialPort *port,
|
||||
}
|
||||
|
||||
len = iov_from_buf(elem.in_sg, elem.in_num,
|
||||
buf + offset, size - offset);
|
||||
buf + offset, 0, size - offset);
|
||||
offset += len;
|
||||
|
||||
virtqueue_push(vq, &elem, len);
|
||||
|
69
iov.c
69
iov.c
@ -14,56 +14,61 @@
|
||||
|
||||
#include "iov.h"
|
||||
|
||||
size_t iov_from_buf(struct iovec *iov, unsigned int iovcnt,
|
||||
const void *buf, size_t size)
|
||||
size_t iov_from_buf(struct iovec *iov, unsigned int iov_cnt,
|
||||
const void *buf, size_t iov_off, size_t size)
|
||||
{
|
||||
size_t offset;
|
||||
size_t iovec_off, buf_off;
|
||||
unsigned int i;
|
||||
|
||||
offset = 0;
|
||||
for (i = 0; offset < size && i < iovcnt; i++) {
|
||||
size_t len;
|
||||
|
||||
len = MIN(iov[i].iov_len, size - offset);
|
||||
|
||||
memcpy(iov[i].iov_base, buf + offset, len);
|
||||
offset += len;
|
||||
}
|
||||
return offset;
|
||||
}
|
||||
|
||||
size_t iov_to_buf(const struct iovec *iov, const unsigned int iovcnt,
|
||||
void *buf, size_t offset, size_t size)
|
||||
{
|
||||
uint8_t *ptr;
|
||||
size_t iov_off, buf_off;
|
||||
unsigned int i;
|
||||
|
||||
ptr = buf;
|
||||
iov_off = 0;
|
||||
iovec_off = 0;
|
||||
buf_off = 0;
|
||||
for (i = 0; i < iovcnt && size; i++) {
|
||||
if (offset < (iov_off + iov[i].iov_len)) {
|
||||
size_t len = MIN((iov_off + iov[i].iov_len) - offset , size);
|
||||
for (i = 0; i < iov_cnt && size; i++) {
|
||||
if (iov_off < (iovec_off + iov[i].iov_len)) {
|
||||
size_t len = MIN((iovec_off + iov[i].iov_len) - iov_off, size);
|
||||
|
||||
memcpy(ptr + buf_off, iov[i].iov_base + (offset - iov_off), len);
|
||||
memcpy(iov[i].iov_base + (iov_off - iovec_off), buf + buf_off, len);
|
||||
|
||||
buf_off += len;
|
||||
offset += len;
|
||||
iov_off += len;
|
||||
size -= len;
|
||||
}
|
||||
iov_off += iov[i].iov_len;
|
||||
iovec_off += iov[i].iov_len;
|
||||
}
|
||||
return buf_off;
|
||||
}
|
||||
|
||||
size_t iov_size(const struct iovec *iov, const unsigned int iovcnt)
|
||||
size_t iov_to_buf(const struct iovec *iov, const unsigned int iov_cnt,
|
||||
void *buf, size_t iov_off, size_t size)
|
||||
{
|
||||
uint8_t *ptr;
|
||||
size_t iovec_off, buf_off;
|
||||
unsigned int i;
|
||||
|
||||
ptr = buf;
|
||||
iovec_off = 0;
|
||||
buf_off = 0;
|
||||
for (i = 0; i < iov_cnt && size; i++) {
|
||||
if (iov_off < (iovec_off + iov[i].iov_len)) {
|
||||
size_t len = MIN((iovec_off + iov[i].iov_len) - iov_off , size);
|
||||
|
||||
memcpy(ptr + buf_off, iov[i].iov_base + (iov_off - iovec_off), len);
|
||||
|
||||
buf_off += len;
|
||||
iov_off += len;
|
||||
size -= len;
|
||||
}
|
||||
iovec_off += iov[i].iov_len;
|
||||
}
|
||||
return buf_off;
|
||||
}
|
||||
|
||||
size_t iov_size(const struct iovec *iov, const unsigned int iov_cnt)
|
||||
{
|
||||
size_t len;
|
||||
unsigned int i;
|
||||
|
||||
len = 0;
|
||||
for (i = 0; i < iovcnt; i++) {
|
||||
for (i = 0; i < iov_cnt; i++) {
|
||||
len += iov[i].iov_len;
|
||||
}
|
||||
return len;
|
||||
|
10
iov.h
10
iov.h
@ -12,8 +12,8 @@
|
||||
|
||||
#include "qemu-common.h"
|
||||
|
||||
size_t iov_from_buf(struct iovec *iov, unsigned int iovcnt,
|
||||
const void *buf, size_t size);
|
||||
size_t iov_to_buf(const struct iovec *iov, const unsigned int iovcnt,
|
||||
void *buf, size_t offset, size_t size);
|
||||
size_t iov_size(const struct iovec *iov, const unsigned int iovcnt);
|
||||
size_t iov_from_buf(struct iovec *iov, unsigned int iov_cnt,
|
||||
const void *buf, size_t iov_off, size_t size);
|
||||
size_t iov_to_buf(const struct iovec *iov, const unsigned int iov_cnt,
|
||||
void *buf, size_t iov_off, size_t size);
|
||||
size_t iov_size(const struct iovec *iov, const unsigned int iov_cnt);
|
||||
|
Loading…
Reference in New Issue
Block a user