Commit 249aa745fb133be47d3fea1cdecec55af7589919
1 parent
28c699a2
qemu iovec: keep track of total size, allow partial copies (Gerd Hoffman)
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com> Signed-off-by: Anthony Liguori <aliguori@us.ibm.com> git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@6448 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
3 changed files
with
14 additions
and
6 deletions
block.c
| ... | ... | @@ -1265,7 +1265,7 @@ static void bdrv_aio_rw_vector_cb(void *opaque, int ret) |
| 1265 | 1265 | VectorTranslationState *s = opaque; |
| 1266 | 1266 | |
| 1267 | 1267 | if (!s->is_write) { |
| 1268 | - qemu_iovec_from_buffer(s->iov, s->bounce); | |
| 1268 | + qemu_iovec_from_buffer(s->iov, s->bounce, s->iov->size); | |
| 1269 | 1269 | } |
| 1270 | 1270 | qemu_free(s->bounce); |
| 1271 | 1271 | s->this_aiocb->cb(s->this_aiocb->opaque, ret); | ... | ... |
cutils.c
| ... | ... | @@ -109,6 +109,7 @@ void qemu_iovec_init(QEMUIOVector *qiov, int alloc_hint) |
| 109 | 109 | qiov->iov = qemu_malloc(alloc_hint * sizeof(struct iovec)); |
| 110 | 110 | qiov->niov = 0; |
| 111 | 111 | qiov->nalloc = alloc_hint; |
| 112 | + qiov->size = 0; | |
| 112 | 113 | } |
| 113 | 114 | |
| 114 | 115 | void qemu_iovec_add(QEMUIOVector *qiov, void *base, size_t len) |
| ... | ... | @@ -119,6 +120,7 @@ void qemu_iovec_add(QEMUIOVector *qiov, void *base, size_t len) |
| 119 | 120 | } |
| 120 | 121 | qiov->iov[qiov->niov].iov_base = base; |
| 121 | 122 | qiov->iov[qiov->niov].iov_len = len; |
| 123 | + qiov->size += len; | |
| 122 | 124 | ++qiov->niov; |
| 123 | 125 | } |
| 124 | 126 | |
| ... | ... | @@ -138,13 +140,18 @@ void qemu_iovec_to_buffer(QEMUIOVector *qiov, void *buf) |
| 138 | 140 | } |
| 139 | 141 | } |
| 140 | 142 | |
| 141 | -void qemu_iovec_from_buffer(QEMUIOVector *qiov, const void *buf) | |
| 143 | +void qemu_iovec_from_buffer(QEMUIOVector *qiov, const void *buf, size_t count) | |
| 142 | 144 | { |
| 143 | 145 | const uint8_t *p = (const uint8_t *)buf; |
| 146 | + size_t copy; | |
| 144 | 147 | int i; |
| 145 | 148 | |
| 146 | - for (i = 0; i < qiov->niov; ++i) { | |
| 147 | - memcpy(qiov->iov[i].iov_base, p, qiov->iov[i].iov_len); | |
| 148 | - p += qiov->iov[i].iov_len; | |
| 149 | + for (i = 0; i < qiov->niov && count; ++i) { | |
| 150 | + copy = count; | |
| 151 | + if (copy > qiov->iov[i].iov_len) | |
| 152 | + copy = qiov->iov[i].iov_len; | |
| 153 | + memcpy(qiov->iov[i].iov_base, p, copy); | |
| 154 | + p += copy; | |
| 155 | + count -= copy; | |
| 149 | 156 | } |
| 150 | 157 | } | ... | ... |
qemu-common.h
| ... | ... | @@ -195,13 +195,14 @@ typedef struct QEMUIOVector { |
| 195 | 195 | struct iovec *iov; |
| 196 | 196 | int niov; |
| 197 | 197 | int nalloc; |
| 198 | + size_t size; | |
| 198 | 199 | } QEMUIOVector; |
| 199 | 200 | |
| 200 | 201 | void qemu_iovec_init(QEMUIOVector *qiov, int alloc_hint); |
| 201 | 202 | void qemu_iovec_add(QEMUIOVector *qiov, void *base, size_t len); |
| 202 | 203 | void qemu_iovec_destroy(QEMUIOVector *qiov); |
| 203 | 204 | void qemu_iovec_to_buffer(QEMUIOVector *qiov, void *buf); |
| 204 | -void qemu_iovec_from_buffer(QEMUIOVector *qiov, const void *buf); | |
| 205 | +void qemu_iovec_from_buffer(QEMUIOVector *qiov, const void *buf, size_t count); | |
| 205 | 206 | |
| 206 | 207 | #endif /* dyngen-exec.h hack */ |
| 207 | 208 | ... | ... |