qcow2: Remove request from in-flight list after error

If we complete a request with a failure we need to remove it from the list of
requests that are in flight. If we don't do it, the next time the same AIOCB is
used for a cluster allocation it will create a loop in the list and qemu will
hang in an endless loop.

Signed-off-by: Kevin Wolf <kwolf@redhat.com>
Signed-off-by: Aurelien Jarno <aurelien@aurel32.net>
This commit is contained in:
Kevin Wolf 2010-04-06 15:30:14 +02:00 committed by Aurelien Jarno
parent 171e3d6b99
commit c644db3d53
2 changed files with 6 additions and 1 deletions

View File

@ -811,6 +811,7 @@ int qcow2_alloc_cluster_offset(BlockDriverState *bs, uint64_t offset,
cluster_offset = qcow2_alloc_clusters(bs, nb_clusters * s->cluster_size); cluster_offset = qcow2_alloc_clusters(bs, nb_clusters * s->cluster_size);
if (cluster_offset < 0) { if (cluster_offset < 0) {
QLIST_REMOVE(m, next_in_flight);
return cluster_offset; return cluster_offset;
} }

View File

@ -625,11 +625,15 @@ static void qcow_aio_write_cb(void *opaque, int ret)
qcow_aio_write_cb, acb); qcow_aio_write_cb, acb);
if (acb->hd_aiocb == NULL) { if (acb->hd_aiocb == NULL) {
ret = -EIO; ret = -EIO;
goto done; goto fail;
} }
return; return;
fail:
if (acb->l2meta.nb_clusters != 0) {
QLIST_REMOVE(&acb->l2meta, next_in_flight);
}
done: done:
if (acb->qiov->niov > 1) if (acb->qiov->niov > 1)
qemu_vfree(acb->orig_buf); qemu_vfree(acb->orig_buf);