mirror of https://gitee.com/openkylin/qemu.git
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:
parent
171e3d6b99
commit
c644db3d53
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Loading…
Reference in New Issue