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:
* @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;
}

View File

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

View 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;