mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-02-22 11:22:23 +00:00
qemu: don't strip audio elements with user config present
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. Reviewed-by: Michal Privoznik <mprivozn@redhat.com> Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
This commit is contained in:
parent
557f96d224
commit
9b43ec60af
@ -3507,55 +3507,15 @@ qemuDomainDefSuggestDefaultAudioBackend(virQEMUDriver *driver,
|
||||
}
|
||||
|
||||
static int
|
||||
qemuDomainDefClearDefaultAudioBackend(virQEMUDriver *driver,
|
||||
virDomainDef *def)
|
||||
{
|
||||
bool addAudio;
|
||||
int audioBackend;
|
||||
int audioSDLDriver;
|
||||
virDomainAudioDef *audio;
|
||||
|
||||
if (def->naudios != 1) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (qemuDomainDefSuggestDefaultAudioBackend(driver,
|
||||
def,
|
||||
&addAudio,
|
||||
&audioBackend,
|
||||
&audioSDLDriver) < 0)
|
||||
return -1;
|
||||
|
||||
if (!addAudio)
|
||||
return 0;
|
||||
|
||||
audio = def->audios[0];
|
||||
if (audio->type != audioBackend)
|
||||
return 0;
|
||||
|
||||
if (audio->type == VIR_DOMAIN_AUDIO_TYPE_SDL &&
|
||||
audio->backend.sdl.driver != audioSDLDriver)
|
||||
return 0;
|
||||
|
||||
virDomainAudioDefFree(audio);
|
||||
g_free(def->audios);
|
||||
def->naudios = 0;
|
||||
def->audios = NULL;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
qemuDomainDefAddDefaultAudioBackend(virQEMUDriver *driver,
|
||||
virDomainDef *def)
|
||||
qemuDomainDefCreateDefaultAudioBackend(virQEMUDriver *driver,
|
||||
virDomainDef *def,
|
||||
virDomainAudioDef **audioout)
|
||||
{
|
||||
bool addAudio;
|
||||
int audioBackend;
|
||||
int audioSDLDriver;
|
||||
|
||||
if (def->naudios > 0) {
|
||||
return 0;
|
||||
}
|
||||
*audioout = NULL;
|
||||
|
||||
if (qemuDomainDefSuggestDefaultAudioBackend(driver,
|
||||
def,
|
||||
@ -3570,12 +3530,60 @@ qemuDomainDefAddDefaultAudioBackend(virQEMUDriver *driver,
|
||||
audio->type = audioBackend;
|
||||
audio->id = 1;
|
||||
|
||||
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 (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);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
qemuDomainDefAddDefaultAudioBackend(virQEMUDriver *driver,
|
||||
virDomainDef *def)
|
||||
{
|
||||
virDomainAudioDef *audio;
|
||||
|
||||
if (def->naudios > 0) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (qemuDomainDefCreateDefaultAudioBackend(driver, def, &audio) < 0)
|
||||
return -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;
|
||||
|
Loading…
x
Reference in New Issue
Block a user