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,7 +1265,7 @@ static void bdrv_aio_rw_vector_cb(void *opaque, int ret) | ||
| 1265 | VectorTranslationState *s = opaque; | 1265 | VectorTranslationState *s = opaque; |
| 1266 | 1266 | ||
| 1267 | if (!s->is_write) { | 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 | qemu_free(s->bounce); | 1270 | qemu_free(s->bounce); |
| 1271 | s->this_aiocb->cb(s->this_aiocb->opaque, ret); | 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,6 +109,7 @@ void qemu_iovec_init(QEMUIOVector *qiov, int alloc_hint) | ||
| 109 | qiov->iov = qemu_malloc(alloc_hint * sizeof(struct iovec)); | 109 | qiov->iov = qemu_malloc(alloc_hint * sizeof(struct iovec)); |
| 110 | qiov->niov = 0; | 110 | qiov->niov = 0; |
| 111 | qiov->nalloc = alloc_hint; | 111 | qiov->nalloc = alloc_hint; |
| 112 | + qiov->size = 0; | ||
| 112 | } | 113 | } |
| 113 | 114 | ||
| 114 | void qemu_iovec_add(QEMUIOVector *qiov, void *base, size_t len) | 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,6 +120,7 @@ void qemu_iovec_add(QEMUIOVector *qiov, void *base, size_t len) | ||
| 119 | } | 120 | } |
| 120 | qiov->iov[qiov->niov].iov_base = base; | 121 | qiov->iov[qiov->niov].iov_base = base; |
| 121 | qiov->iov[qiov->niov].iov_len = len; | 122 | qiov->iov[qiov->niov].iov_len = len; |
| 123 | + qiov->size += len; | ||
| 122 | ++qiov->niov; | 124 | ++qiov->niov; |
| 123 | } | 125 | } |
| 124 | 126 | ||
| @@ -138,13 +140,18 @@ void qemu_iovec_to_buffer(QEMUIOVector *qiov, void *buf) | @@ -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 | const uint8_t *p = (const uint8_t *)buf; | 145 | const uint8_t *p = (const uint8_t *)buf; |
| 146 | + size_t copy; | ||
| 144 | int i; | 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,13 +195,14 @@ typedef struct QEMUIOVector { | ||
| 195 | struct iovec *iov; | 195 | struct iovec *iov; |
| 196 | int niov; | 196 | int niov; |
| 197 | int nalloc; | 197 | int nalloc; |
| 198 | + size_t size; | ||
| 198 | } QEMUIOVector; | 199 | } QEMUIOVector; |
| 199 | 200 | ||
| 200 | void qemu_iovec_init(QEMUIOVector *qiov, int alloc_hint); | 201 | void qemu_iovec_init(QEMUIOVector *qiov, int alloc_hint); |
| 201 | void qemu_iovec_add(QEMUIOVector *qiov, void *base, size_t len); | 202 | void qemu_iovec_add(QEMUIOVector *qiov, void *base, size_t len); |
| 202 | void qemu_iovec_destroy(QEMUIOVector *qiov); | 203 | void qemu_iovec_destroy(QEMUIOVector *qiov); |
| 203 | void qemu_iovec_to_buffer(QEMUIOVector *qiov, void *buf); | 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 | #endif /* dyngen-exec.h hack */ | 207 | #endif /* dyngen-exec.h hack */ |
| 207 | 208 |