1
0

qemuDomainDiskLookupByNodename: Lookup also backup 'store' nodenames

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>
This commit is contained in:
Peter Krempa 2020-12-07 12:38:43 +01:00
parent 047b45f359
commit c1720b9ac7
3 changed files with 18 additions and 2 deletions

View File

@ -9895,6 +9895,7 @@ qemuDomainGetHostdevPath(virDomainHostdevDefPtr dev,
/** /**
* qemuDomainDiskLookupByNodename: * qemuDomainDiskLookupByNodename:
* @def: domain definition to look for the disk * @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 * @nodename: block backend node name to find
* @src: filled with the specific backing store element if provided * @src: filled with the specific backing store element if provided
* *
@ -9904,6 +9905,7 @@ qemuDomainGetHostdevPath(virDomainHostdevDefPtr dev,
*/ */
virDomainDiskDefPtr virDomainDiskDefPtr
qemuDomainDiskLookupByNodename(virDomainDefPtr def, qemuDomainDiskLookupByNodename(virDomainDefPtr def,
virDomainBackupDefPtr backupdef,
const char *nodename, const char *nodename,
virStorageSourcePtr *src) virStorageSourcePtr *src)
{ {
@ -9924,6 +9926,16 @@ qemuDomainDiskLookupByNodename(virDomainDefPtr def,
return domdisk; 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; return NULL;
} }

View File

@ -912,6 +912,7 @@ int qemuDomainGetHostdevPath(virDomainHostdevDefPtr dev,
int *perms); int *perms);
virDomainDiskDefPtr qemuDomainDiskLookupByNodename(virDomainDefPtr def, virDomainDiskDefPtr qemuDomainDiskLookupByNodename(virDomainDefPtr def,
virDomainBackupDefPtr backupdef,
const char *nodename, const char *nodename,
virStorageSourcePtr *src); virStorageSourcePtr *src);

View File

@ -879,7 +879,7 @@ qemuProcessHandleIOError(qemuMonitorPtr mon G_GNUC_UNUSED,
if (diskAlias) if (diskAlias)
disk = qemuProcessFindDomainDiskByAliasOrQOM(vm, diskAlias, NULL); disk = qemuProcessFindDomainDiskByAliasOrQOM(vm, diskAlias, NULL);
else if (nodename) else if (nodename)
disk = qemuDomainDiskLookupByNodename(vm->def, nodename, NULL); disk = qemuDomainDiskLookupByNodename(vm->def, NULL, nodename, NULL);
else else
disk = NULL; disk = NULL;
@ -1483,6 +1483,7 @@ qemuProcessHandleBlockThreshold(qemuMonitorPtr mon G_GNUC_UNUSED,
unsigned long long excess, unsigned long long excess,
void *opaque) void *opaque)
{ {
qemuDomainObjPrivatePtr priv;
virQEMUDriverPtr driver = opaque; virQEMUDriverPtr driver = opaque;
virObjectEventPtr eventSource = NULL; virObjectEventPtr eventSource = NULL;
virObjectEventPtr eventDevice = NULL; virObjectEventPtr eventDevice = NULL;
@ -1492,11 +1493,13 @@ qemuProcessHandleBlockThreshold(qemuMonitorPtr mon G_GNUC_UNUSED,
virObjectLock(vm); virObjectLock(vm);
priv = vm->privateData;
VIR_DEBUG("BLOCK_WRITE_THRESHOLD event for block node '%s' in domain %p %s:" VIR_DEBUG("BLOCK_WRITE_THRESHOLD event for block node '%s' in domain %p %s:"
"threshold '%llu' exceeded by '%llu'", "threshold '%llu' exceeded by '%llu'",
nodename, vm, vm->def->name, threshold, excess); 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)) if (virStorageSourceIsLocalStorage(src))
path = src->path; path = src->path;