Il 16/09/2014 14:02, Alexey Kardashevskiy ha scritto: > I am having problems when migrate a guest via libvirt like this: > > virsh migrate --live --persistent --undefinesource --copy-storage-all > --verbose --desturi qemu+ssh://legkvm/system --domain chig1 > > The XML used to create the guest is at the end of this mail. > > I see NBD FLUSH command after the destination QEMU received EOF for > migration stream and this produces a crash in qcow2_co_flush_to_os() as > s->lock is false or s->l2_table_cache is NULL. >
Max, Kevin, could the fix be something like this? diff --git a/block/qcow2.c b/block/qcow2.c index 0daf25c..e7459ea 100644 --- a/block/qcow2.c +++ b/block/qcow2.c @@ -1442,6 +1442,7 @@ static void qcow2_invalidate_cache(BlockDriverState *bs, Error **errp) memcpy(&aes_decrypt_key, &s->aes_decrypt_key, sizeof(aes_decrypt_key)); } + qemu_co_mutex_lock(&s->lock); qcow2_close(bs); bdrv_invalidate_cache(bs->file, &local_err); @@ -1455,6 +1456,7 @@ static void qcow2_invalidate_cache(BlockDriverState *bs, Error **errp) ret = qcow2_open(bs, options, flags, &local_err); QDECREF(options); + qemu_co_mutex_unlock(&s->lock); if (local_err) { error_setg(errp, "Could not reopen qcow2 layer: %s", error_get_pretty(local_err)); On top of this, *_invalidate_cache needs to be marked as coroutine_fn. Paolo