[libvirt] [PATCH] qemu: blockCopy: Allow shallow block copy into a raw image

Shanzhi Yu shyu at redhat.com
Tue Apr 28 04:08:32 UTC 2015



On 04/27/2015 11:38 PM, Peter Krempa wrote:
> On Mon, Apr 27, 2015 at 22:11:40 +0800, Shanzhi Yu wrote:
>>
>> On 04/27/2015 08:01 PM, Peter Krempa wrote:
>>> The documentation states that for shallow block copy the image has to
>>> have the same guest visible content as backing file of the current
>>> image. This condition can be achieved also with a raw file (or a qcow
>>> without a backing file) so remove the condition that would disallow it.
>>>
>>> (This patch additionally fixes crash described in
>>>  https://bugzilla.redhat.com/show_bug.cgi?id=1215569 since it removes
>>>  the code)
>>> ---
>>>  src/qemu/qemu_driver.c | 10 ----------
>>>  1 file changed, 10 deletions(-)
>>>
>>> diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
>>> index 70bf7aa..f979d33 100644
>>> --- a/src/qemu/qemu_driver.c
>>> +++ b/src/qemu/qemu_driver.c
>>> @@ -16815,16 +16815,6 @@ qemuDomainBlockCopyCommon(virDomainObjPtr vm,
>>>      if (qemuDomainDetermineDiskChain(driver, vm, disk, false, true) < 0)
>>>          goto endjob;
>>>
>>> -    if ((flags & VIR_DOMAIN_BLOCK_COPY_SHALLOW) &&
>>> -        mirror->format == VIR_STORAGE_FILE_RAW &&
>>> -        disk->src->backingStore->path) {
>>> -        virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
>>> -                       _("disk '%s' has backing file, so raw shallow copy "
>>> -                         "is not possible"),
>>> -                       disk->dst);
>>> -        goto endjob;
>>> -    }
>>> -
>> Although a shallow blockcopy of file without backing file is
>> semantically correct, but still feel a little weird.
>> And, a shallow blockcommit of file without backing file will failed with
>> error
>> "error: invalid argument: top '/var/lib/libvirt/images/raw.img' in chain
>> for 'vda' has no backing file"
>>
>> Should libvirt post error when try a shallow blockcopy of file without
>> backing file, just as shallow blockcommit?
> I cannot reproduce the error above, could you please post steps to do
> that? or perhaps debug log from libvirt?

It is easy to reproduce. Suppose live guest xml looks like:

# virsh dumpxml vm1|grep disk -A 8
    <disk type='file' device='disk'>
      <driver name='qemu' type='qcow2'/>
      <source file='/var/lib/libvirt/images/raw.1430143276'/>
      <backingStore type='file' index='1'>
        <format type='raw'/>
        <source file='/var/lib/libvirt/images/raw.img'/>
        <backingStore/>
      </backingStore>
      <target dev='vda' bus='virtio'/>
      <alias name='virtio-disk0'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x03'
function='0x0'/>
    </disk>

Then try a shallow blockcommit of file has no backing file

# virsh blockcommit vm1 vda --top vda[1] --shallow
error: invalid argument: top '/var/lib/libvirt/images/raw.img' in chain
for 'vda' has no backing file


>
> When copying from a single layer image with the --shallow flag I'm able
> to successfully copy both into a raw and a qcow2 file.

I also can do it.
But a shallow block copy of file which has backing file into a raw  file
does not make any sense, right?

>>>      /* Prepare the destination file.  */
>>>      /* XXX Allow non-file mirror destinations */
>>>      if (!virStorageSourceIsLocalStorage(mirror)) {
> Peter

-- 
Regards
shyu




More information about the libvir-list mailing list