[libvirt] [PATCH v3 3/9] qemuMigrationDriveMirror: Pass disk format to qemu

John Ferlan jferlan at redhat.com
Fri May 29 11:29:18 UTC 2015



On 05/26/2015 09:01 AM, Michal Privoznik wrote:
> When playing with disk migration lately, I've noticed this warning in
> domain logs:
> 
> WARNING: Image format was not specified for 'nbd://masina:49153/drive-virtio-disk0' and probing guessed raw.
>          Automatically detecting the format is dangerous for raw images, write operations on block 0 will be restricted.
>          Specify the 'raw' format explicitly to remove the restrictions.
> 
> So I started digging into qemu source code to see what has triggered
> the warning. I'd expect qemu to know formats of guest's disks since we
> tell them on command line. This lead me to qmp_drive_mirror() where
> the following can be found:
> 
>     if (!has_format) {
>         format = mode == NEW_IMAGE_MODE_EXISTING ? NULL : bs->drv->format_name;
>     }
> 
> So, format is automatically initialized from the disk iff mode !=
> "existing". Unfortunately, in migration we are tied to use this mode
> (NBD doesn't support creating new images). Therefore the only way to
> avoid this warning is to pass format. The format that libvirt thinks
> should be in sync with qemu anyway.
> 
> Signed-off-by: Michal Privoznik <mprivozn at redhat.com>
> ---
>  src/qemu/qemu_migration.c | 6 +++++-
>  1 file changed, 5 insertions(+), 1 deletion(-)
> 
> diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c
> index 32c43f3..279b43f 100644
> --- a/src/qemu/qemu_migration.c
> +++ b/src/qemu/qemu_migration.c
> @@ -1943,6 +1943,7 @@ qemuMigrationDriveMirror(virQEMUDriverPtr driver,
>      for (i = 0; i < vm->def->ndisks; i++) {
>          virDomainDiskDefPtr disk = vm->def->disks[i];
>          qemuDomainDiskPrivatePtr diskPriv = QEMU_DOMAIN_DISK_PRIVATE(disk);
> +        const char *format;

format is not initialized here...

>          int mon_ret;
>  
>          /* skip shared, RO and source-less disks */
> @@ -1950,6 +1951,9 @@ qemuMigrationDriveMirror(virQEMUDriverPtr driver,
>              !virDomainDiskGetSource(disk))
>              continue;
>  
> +        if (disk->src->format > 0)
> +            format = virStorageFileFormatTypeToString(disk->src->format);

then only initialized if src->format > 0

Also this should be VIR_STORAGE_FILE_NONE instead of 0

> +
>          VIR_FREE(diskAlias);
>          VIR_FREE(nbd_dest);
>          if ((virAsprintf(&diskAlias, "%s%s",
> @@ -1967,7 +1971,7 @@ qemuMigrationDriveMirror(virQEMUDriverPtr driver,
>          }
>  
>          mon_ret = qemuMonitorDriveMirror(priv->mon, diskAlias, nbd_dest,
> -                                         NULL, speed, 0, 0, mirror_flags);
> +                                         format, speed, 0, 0, mirror_flags);

Then used here...  My compiler balked...

Initializing to NULL worked...

ACK with that change.

John
>  
>          if (qemuDomainObjExitMonitor(driver, vm) < 0 || mon_ret < 0) {
>              qemuBlockJobSyncEnd(driver, vm, disk, NULL);
> 




More information about the libvir-list mailing list