]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
qemuDomainDiskLookupByNodename: Lookup also backup 'store' nodenames
authorPeter Krempa <pkrempa@redhat.com>
Mon, 7 Dec 2020 11:38:43 +0000 (12:38 +0100)
committerPeter Krempa <pkrempa@redhat.com>
Tue, 8 Dec 2020 14:12:34 +0000 (15:12 +0100)
Nodename may be asociated to a disk backup job, add support to looking
up in that chain too. This is specifically useful for the
BLOCK_WRITE_THRESHOLD event which can be registered for any nodename.

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
src/qemu/qemu_domain.c
src/qemu/qemu_domain.h
src/qemu/qemu_process.c

index 13559ae0d60a3cc81dcc8ffeb0d422845c4389c4..78256e9cf2dfb0ff0d223a4ae3f33cceac2acde5 100644 (file)
@@ -9895,6 +9895,7 @@ qemuDomainGetHostdevPath(virDomainHostdevDefPtr dev,
 /**
  * qemuDomainDiskLookupByNodename:
  * @def: domain definition to look for the disk
+ * @backupdef: definition of the backup job of the domain (optional)
  * @nodename: block backend node name to find
  * @src: filled with the specific backing store element if provided
  *
@@ -9904,6 +9905,7 @@ qemuDomainGetHostdevPath(virDomainHostdevDefPtr dev,
  */
 virDomainDiskDefPtr
 qemuDomainDiskLookupByNodename(virDomainDefPtr def,
+                               virDomainBackupDefPtr backupdef,
                                const char *nodename,
                                virStorageSourcePtr *src)
 {
@@ -9924,6 +9926,16 @@ qemuDomainDiskLookupByNodename(virDomainDefPtr def,
             return domdisk;
     }
 
+    if (backupdef) {
+        for (i = 0; i < backupdef->ndisks; i++) {
+            virDomainBackupDiskDefPtr backupdisk = backupdef->disks + i;
+
+            if (backupdisk->store &&
+                (*src = virStorageSourceFindByNodeName(backupdisk->store, nodename)))
+                return virDomainDiskByTarget(def, backupdisk->name);
+        }
+    }
+
     return NULL;
 }
 
index 9e870ff1e23b17db17894ec1d037d0c9f5131cec..32f358688211f6fcc16c843756f449aa0cc68020 100644 (file)
@@ -912,6 +912,7 @@ int qemuDomainGetHostdevPath(virDomainHostdevDefPtr dev,
                              int *perms);
 
 virDomainDiskDefPtr qemuDomainDiskLookupByNodename(virDomainDefPtr def,
+                                                   virDomainBackupDefPtr backupdef,
                                                    const char *nodename,
                                                    virStorageSourcePtr *src);
 
index e0b42ee2c92109552d9ab36d6149f412151516c8..5a37c52d127bf6087f47bc82ed8c43d3086c16c3 100644 (file)
@@ -879,7 +879,7 @@ qemuProcessHandleIOError(qemuMonitorPtr mon G_GNUC_UNUSED,
     if (diskAlias)
         disk = qemuProcessFindDomainDiskByAliasOrQOM(vm, diskAlias, NULL);
     else if (nodename)
-        disk = qemuDomainDiskLookupByNodename(vm->def, nodename, NULL);
+        disk = qemuDomainDiskLookupByNodename(vm->def, NULL, nodename, NULL);
     else
         disk = NULL;
 
@@ -1483,6 +1483,7 @@ qemuProcessHandleBlockThreshold(qemuMonitorPtr mon G_GNUC_UNUSED,
                                 unsigned long long excess,
                                 void *opaque)
 {
+    qemuDomainObjPrivatePtr priv;
     virQEMUDriverPtr driver = opaque;
     virObjectEventPtr eventSource = NULL;
     virObjectEventPtr eventDevice = NULL;
@@ -1492,11 +1493,13 @@ qemuProcessHandleBlockThreshold(qemuMonitorPtr mon G_GNUC_UNUSED,
 
     virObjectLock(vm);
 
+    priv  = vm->privateData;
+
     VIR_DEBUG("BLOCK_WRITE_THRESHOLD event for block node '%s' in domain %p %s:"
               "threshold '%llu' exceeded by '%llu'",
               nodename, vm, vm->def->name, threshold, excess);
 
-    if ((disk = qemuDomainDiskLookupByNodename(vm->def, nodename, &src))) {
+    if ((disk = qemuDomainDiskLookupByNodename(vm->def, priv->backup, nodename, &src))) {
         if (virStorageSourceIsLocalStorage(src))
             path = src->path;