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 |