Re: [libvirt] [PATCHv2 29/62] qemu: alias: Generate QDEV name of the block backend for disks

2018-08-16 Thread Ján Tomko

On Mon, Aug 13, 2018 at 06:00:03PM +0200, Peter Krempa wrote:

When we stop using -drive qemu stops reporting it in some of the monitor
commands. To allow referring the disk frontends and the corresponding


referring to


block backends we need to know these names. Unfortunately different
buses require different names.

Signed-off-by: Peter Krempa 
---
src/qemu/qemu_alias.c   | 86 +++--
src/qemu/qemu_alias.h   |  3 +-
src/qemu/qemu_hotplug.c |  2 +-
3 files changed, 65 insertions(+), 26 deletions(-)



Reviewed-by: Ján Tomko 

Jano


signature.asc
Description: Digital signature
--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list

[libvirt] [PATCHv2 29/62] qemu: alias: Generate QDEV name of the block backend for disks

2018-08-13 Thread Peter Krempa
When we stop using -drive qemu stops reporting it in some of the monitor
commands. To allow referring the disk frontends and the corresponding
block backends we need to know these names. Unfortunately different
buses require different names.

Signed-off-by: Peter Krempa 
---
 src/qemu/qemu_alias.c   | 86 +++--
 src/qemu/qemu_alias.h   |  3 +-
 src/qemu/qemu_hotplug.c |  2 +-
 3 files changed, 65 insertions(+), 26 deletions(-)

diff --git a/src/qemu/qemu_alias.c b/src/qemu/qemu_alias.c
index 80d9b6cf46..e66a8a5c1d 100644
--- a/src/qemu/qemu_alias.c
+++ b/src/qemu/qemu_alias.c
@@ -175,44 +175,82 @@ qemuAssignDeviceControllerAlias(virDomainDefPtr domainDef,
 }


-/* Our custom -drive naming scheme used with id= */
 int
 qemuAssignDeviceDiskAlias(virDomainDefPtr def,
-  virDomainDiskDefPtr disk)
+  virDomainDiskDefPtr disk,
+  virQEMUCapsPtr qemuCaps)
 {
+qemuDomainDiskPrivatePtr diskPriv = QEMU_DOMAIN_DISK_PRIVATE(disk);
 const char *prefix = virDomainDiskBusTypeToString(disk->bus);
 int controllerModel = -1;

 if (disk->info.alias)
 return 0;

-if (disk->info.type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_DRIVE) {
-if (disk->bus == VIR_DOMAIN_DISK_BUS_SCSI) {
-controllerModel = qemuDomainFindSCSIControllerModel(def,
->info);
-if (controllerModel < 0)
+if (!disk->info.alias) {
+if (disk->info.type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_DRIVE) {
+if (disk->bus == VIR_DOMAIN_DISK_BUS_SCSI) {
+controllerModel = qemuDomainFindSCSIControllerModel(def,
+
>info);
+if (controllerModel < 0)
+return -1;
+}
+
+if (disk->bus != VIR_DOMAIN_DISK_BUS_SCSI ||
+controllerModel == VIR_DOMAIN_CONTROLLER_MODEL_SCSI_LSILOGIC) {
+if (virAsprintf(>info.alias, "%s%d-%d-%d", prefix,
+disk->info.addr.drive.controller,
+disk->info.addr.drive.bus,
+disk->info.addr.drive.unit) < 0)
+return -1;
+} else {
+if (virAsprintf(>info.alias, "%s%d-%d-%d-%d", prefix,
+disk->info.addr.drive.controller,
+disk->info.addr.drive.bus,
+disk->info.addr.drive.target,
+disk->info.addr.drive.unit) < 0)
+return -1;
+}
+} else {
+int idx = virDiskNameToIndex(disk->dst);
+if (virAsprintf(>info.alias, "%s-disk%d", prefix, idx) < 0)
 return -1;
 }
+}

-if (disk->bus != VIR_DOMAIN_DISK_BUS_SCSI ||
-controllerModel == VIR_DOMAIN_CONTROLLER_MODEL_SCSI_LSILOGIC) {
-if (virAsprintf(>info.alias, "%s%d-%d-%d", prefix,
-disk->info.addr.drive.controller,
-disk->info.addr.drive.bus,
-disk->info.addr.drive.unit) < 0)
+/* For -blockdev we need to know the QDEV ids of the block backend of the
+ * disk. The QDEV id used by qemu is based on the alias so we generate them
+ * here. */
+if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_BLOCKDEV)) {
+switch ((virDomainDiskBus) disk->bus) {
+case VIR_DOMAIN_DISK_BUS_FDC:
+case VIR_DOMAIN_DISK_BUS_IDE:
+case VIR_DOMAIN_DISK_BUS_SATA:
+case VIR_DOMAIN_DISK_BUS_SCSI:
+if (VIR_STRDUP(diskPriv->backendQomName, disk->info.alias) < 0)
 return -1;
-} else {
-if (virAsprintf(>info.alias, "%s%d-%d-%d-%d", prefix,
-disk->info.addr.drive.controller,
-disk->info.addr.drive.bus,
-disk->info.addr.drive.target,
-disk->info.addr.drive.unit) < 0)
+break;
+
+case VIR_DOMAIN_DISK_BUS_VIRTIO:
+if (virAsprintf(>backendQomName,
+"/machine/peripheral/%s/virtio-backend",
+disk->info.alias) < 0)
 return -1;
+break;
+
+case VIR_DOMAIN_DISK_BUS_USB:
+if (virAsprintf(>backendQomName,
+"/machine/peripheral/%s/%s.0/legacy[0]",
+disk->info.alias, disk->info.alias) < 0)
+return -1;
+break;
+
+case VIR_DOMAIN_DISK_BUS_XEN:
+case VIR_DOMAIN_DISK_BUS_UML:
+case VIR_DOMAIN_DISK_BUS_SD:
+case VIR_DOMAIN_DISK_BUS_LAST:
+break;
 }
-} else {
-int idx = virDiskNameToIndex(disk->dst);
-if