To support backwards live migration we must strip the default added
audio element, however, we are too aggressive in doing so. We are only
comparing a couple of attributes for equality, so risk stripping config
that was user customized. To improve this we need to a deep comparison
of the audio config.
Signed-off-by: Daniel P. Berrangé <berrange(a)redhat.com>
---
src/qemu/qemu_domain.c | 72 +++++++++++++++++++++++-------------------
1 file changed, 40 insertions(+), 32 deletions(-)
diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
index fb203bc830..ef0a08d405 100644
--- a/src/qemu/qemu_domain.c
+++ b/src/qemu/qemu_domain.c
@@ -3507,17 +3507,15 @@ qemuDomainDefSuggestDefaultAudioBackend(virQEMUDriver *driver,
}
static int
-qemuDomainDefClearDefaultAudioBackend(virQEMUDriver *driver,
- virDomainDef *def)
+qemuDomainDefCreateDefaultAudioBackend(virQEMUDriver *driver,
+ virDomainDef *def,
+ virDomainAudioDef **audioout)
{
bool addAudio;
int audioBackend;
int audioSDLDriver;
- virDomainAudioDef *audio;
- if (def->naudios != 1) {
- return 0;
- }
+ *audioout = NULL;
if (qemuDomainDefSuggestDefaultAudioBackend(driver,
def,
@@ -3526,21 +3524,45 @@ qemuDomainDefClearDefaultAudioBackend(virQEMUDriver *driver,
&audioSDLDriver) < 0)
return -1;
- if (!addAudio)
- return 0;
+ if (addAudio) {
+ virDomainAudioDef *audio = g_new0(virDomainAudioDef, 1);
+
+ audio->type = audioBackend;
+ audio->id = 1;
- audio = def->audios[0];
- if (audio->type != audioBackend)
+ if (audioBackend == VIR_DOMAIN_AUDIO_TYPE_SDL)
+ audio->backend.sdl.driver = audioSDLDriver;
+
+ *audioout = audio;
+ }
+
+ return 0;
+}
+
+
+static int
+qemuDomainDefClearDefaultAudioBackend(virQEMUDriver *driver,
+ virDomainDef *def)
+{
+ virDomainAudioDef *audio = NULL;
+
+ if (def->naudios != 1) {
return 0;
+ }
- if (audio->type == VIR_DOMAIN_AUDIO_TYPE_SDL &&
- audio->backend.sdl.driver != audioSDLDriver)
+ if (qemuDomainDefCreateDefaultAudioBackend(driver, def, &audio) < 0)
+ return -1;
+
+ if (!audio)
return 0;
+ if (virDomainAudioIsEqual(def->audios[0], audio)) {
+ virDomainAudioDefFree(def->audios[0]);
+ g_free(def->audios);
+ def->naudios = 0;
+ def->audios = NULL;
+ }
virDomainAudioDefFree(audio);
- g_free(def->audios);
- def->naudios = 0;
- def->audios = NULL;
return 0;
}
@@ -3549,33 +3571,19 @@ static int
qemuDomainDefAddDefaultAudioBackend(virQEMUDriver *driver,
virDomainDef *def)
{
- bool addAudio;
- int audioBackend;
- int audioSDLDriver;
+ virDomainAudioDef *audio;
if (def->naudios > 0) {
return 0;
}
- if (qemuDomainDefSuggestDefaultAudioBackend(driver,
- def,
- &addAudio,
- &audioBackend,
- &audioSDLDriver) < 0)
+ if (qemuDomainDefCreateDefaultAudioBackend(driver, def, &audio) < 0)
return -1;
- if (addAudio) {
- virDomainAudioDef *audio = g_new0(virDomainAudioDef, 1);
-
- audio->type = audioBackend;
- audio->id = 1;
-
+ if (audio) {
def->naudios = 1;
def->audios = g_new0(virDomainAudioDef *, def->naudios);
def->audios[0] = audio;
-
- if (audioBackend == VIR_DOMAIN_AUDIO_TYPE_SDL)
- audio->backend.sdl.driver = audioSDLDriver;
}
return 0;
--
2.31.1