[libvirt] [PATCH 2/2] Introduce and use virDomainDiskZeroSource
Michal Privoznik
mprivozn at redhat.com
Fri Mar 31 13:37:17 UTC 2017
On 03/31/2017 03:23 PM, Peter Krempa wrote:
> On Fri, Mar 31, 2017 at 15:03:35 +0200, Michal Privoznik wrote:
>> On 03/31/2017 02:18 PM, Peter Krempa wrote:
>>> On Fri, Mar 31, 2017 at 13:13:51 +0200, Michal Privoznik wrote:
>>>> Currently, if we want to zero out disk source (e,g, due to
>>>> startupPolicy when starting up a domain) we use
>>>> virDomainDiskSetSource(disk, NULL). This works well for file
>>>> based storage (storage type file, dir, or block). But it doesn't
>>>> work at all for other types like volume and network.
>>>>
>>>> So imagine that you have a domain that has a CDROM configured
>>>> which source is a volume from an inactive pool. Because it is
>>>> startupPolicy='optional', the CDROM is empty when the domain
>>>> starts. However, the source element is not cleared out in the
>>>> status XML and thus when the daemon restarts and tries to
>>>> reconnect to the domain it refreshes the disks (which fails - the
>>>> storage pool is still not running) and thus the domain is killed.
>>>>
>>>> Signed-off-by: Michal Privoznik <mprivozn at redhat.com>
>>>> ---
>>>> src/conf/domain_conf.c | 23 +++++++++++++++++++++++
>>>> src/conf/domain_conf.h | 1 +
>>>> src/libvirt_private.syms | 1 +
>>>> src/qemu/qemu_domain.c | 2 +-
>>>> src/qemu/qemu_process.c | 2 +-
>>>> src/vmx/vmx.c | 6 +++---
>>>> src/xenconfig/xen_xm.c | 2 +-
>>>> 7 files changed, 31 insertions(+), 6 deletions(-)
>
> [...]
>
>>>> + break;
>>>> + case VIR_STORAGE_TYPE_VOLUME:
>>>> + virStorageSourcePoolDefFree(def->src->srcpool);
>>>> + def->src->srcpool = NULL;
>>>> + break;
>>>> + case VIR_STORAGE_TYPE_NONE:
>>>> + case VIR_STORAGE_TYPE_LAST:
>>>> + break;
>>>> + }
>>>
>>> You also should reset the disk type. I'm not sure though wether setting
>>> it to "NONE" is a good idea. "FILE" might be safer.
>>
>> This doesn't sound fair. If the original disk was type of volume, why it
>> should all of a sudden be reported as type of file?
>
> Well, yes. As said it's the safest option. E.g. the following XML which
> would be a result of the code above does not pass schema validation:
>
> <disk type='network' device='cdrom'>
> <driver name='qemu' type='raw'/>
> <target dev='hda' bus='ide'/>
> <readonly/>
> <address type='drive' controller='0' bus='0' target='0' unit='0'/>
> </disk>
>
> Is it fault of the schema being broken? Perhaps yes. I didn't really
> think about it.
Yes, it's the schema which is broken. Our schema should accept that any
disk with device='cdrom' can lack <source/> element regardless of its
type. The same goes for floppy disks.
>
> Also. Since the disk is empty the source really does not mater. The need
> to keep is a historical artifact which will require a lot of
> refactoring.
>
>
>> If we are afraid of other areas of the code failing or being unprepared for,
>> I say have them fail so that they can be fixed.
>
> I'm not sure whether this approach is correct. You are saying we should
> introduce regressions?
No. If they are broken now, that is not what I call a regression.
>
> The problem here is that while libvirt models the "type" as being part
> of the disk, it in fact is part of the source itself. The qemu driver
> will probably be mostly prepared for this, but I'd rather not risk it.
>
> Certaily not during the freeze, such shenanigans are certainly NOT safe
> for the freeze.
>
Fair enough. I don't care that much about this. I care more about fixing
the bug and getting the fix in for the release. If adding the one line
is a requisite I can live with that. Will post v2 soon then.
BTW: just to be clear - you're okay with 1/2 being pushed as is, right?
Michal
More information about the libvir-list
mailing list