From nobody Wed Feb 11 10:15:07 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of redhat.com designates 209.132.183.39 as permitted sender) client-ip=209.132.183.39; envelope-from=libvir-list-bounces@redhat.com; helo=mx6-phx2.redhat.com; Authentication-Results: mx.zoho.com; spf=pass (zoho.com: domain of redhat.com designates 209.132.183.39 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; Return-Path: Received: from mx6-phx2.redhat.com (mx6-phx2.redhat.com [209.132.183.39]) by mx.zohomail.com with SMTPS id 1489596039822451.94976541361586; Wed, 15 Mar 2017 09:40:39 -0700 (PDT) Received: from lists01.pubmisc.prod.ext.phx2.redhat.com (lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33]) by mx6-phx2.redhat.com (8.14.4/8.14.4) with ESMTP id v2FGbD2o023675; Wed, 15 Mar 2017 12:37:13 -0400 Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id v2FGbAjd025101 for ; Wed, 15 Mar 2017 12:37:10 -0400 Received: from angien.brq.redhat.com (dhcp129-47.brq.redhat.com [10.34.129.47]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id v2FGafIb000870; Wed, 15 Mar 2017 12:37:09 -0400 From: Peter Krempa To: libvir-list@redhat.com Date: Wed, 15 Mar 2017 17:37:35 +0100 Message-Id: <441e75c3fc4a970902f2586fbe9519d487cac1ee.1489595335.git.pkrempa@redhat.com> In-Reply-To: References: In-Reply-To: References: X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-loop: libvir-list@redhat.com Cc: Peter Krempa Subject: [libvirt] [PATCH 23/23] qemu: block: Add code to detect node names when necessary X-BeenThere: libvir-list@redhat.com X-Mailman-Version: 2.1.12 Precedence: junk List-Id: Development discussions about the libvirt library & tools List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Sender: libvir-list-bounces@redhat.com Errors-To: libvir-list-bounces@redhat.com X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" Detect the node names when setting block threshold and when reconnecting or when they are cleared when a block job finishes. This operation will become a no-op once we fully support node names. --- src/qemu/qemu_block.c | 98 ++++++++++++++++++++++++++++++++++++++++++++= ++++ src/qemu/qemu_block.h | 4 ++ src/qemu/qemu_blockjob.c | 2 + src/qemu/qemu_driver.c | 5 +++ src/qemu/qemu_process.c | 4 ++ 5 files changed, 113 insertions(+) diff --git a/src/qemu/qemu_block.c b/src/qemu/qemu_block.c index 91c04ab7f..ebf11ceb6 100644 --- a/src/qemu/qemu_block.c +++ b/src/qemu/qemu_block.c @@ -278,3 +278,101 @@ qemuBlockNodeNameGetBackingChain(virJSONValuePtr json) return ret; } + + +static void +qemuBlockDiskClearDetectedNodes(virDomainDiskDefPtr disk) +{ + virStorageSourcePtr next =3D disk->src; + + while (next) { + VIR_FREE(next->nodeformat); + VIR_FREE(next->nodebacking); + + next =3D next->backingStore; + } +} + + +static int +qemuBlockDiskDetectNodes(virDomainDiskDefPtr disk, + const char *parentnode, + virHashTablePtr table) +{ + qemuBlockNodeNameBackingChainDataPtr entry =3D NULL; + virStorageSourcePtr src =3D disk->src; + + /* don't attempt the detection if the top level already has node names= */ + if (!parentnode || src->nodeformat || src->nodebacking) + return 0; + + while (src && parentnode) { + if (!(entry =3D virHashLookup(table, parentnode))) + break; + + if (src->nodeformat || src->nodebacking) { + if (STRNEQ_NULLABLE(src->nodeformat, entry->nodeformat) || + STRNEQ_NULLABLE(src->nodebacking, entry->nodestorage)) + goto error; + + break; + } else { + if (VIR_STRDUP(src->nodeformat, entry->nodeformat) < 0 || + VIR_STRDUP(src->nodebacking, entry->nodestorage) < 0) + goto error; + } + + parentnode =3D entry->nodebacking; + src =3D src->backingStore; + } + + return 0; + + error: + qemuBlockDiskClearDetectedNodes(disk); + return -1; +} + + +int +qemuBlockNodeNamesDetect(virQEMUDriverPtr driver, + virDomainObjPtr vm) +{ + virHashTablePtr disktable =3D NULL; + virHashTablePtr nodenametable =3D NULL; + virJSONValuePtr data =3D NULL; + virDomainDiskDefPtr disk; + struct qemuDomainDiskInfo *info; + size_t i; + int ret =3D -1; + + qemuDomainObjEnterMonitor(driver, vm); + + disktable =3D qemuMonitorGetBlockInfo(qemuDomainGetMonitor(vm)); + data =3D qemuMonitorQueryNamedBlockNodes(qemuDomainGetMonitor(vm)); + + if (qemuDomainObjExitMonitor(driver, vm) < 0 || !data || !disktable) + goto cleanup; + + if (!(nodenametable =3D qemuBlockNodeNameGetBackingChain(data))) + goto cleanup; + + for (i =3D 0; i < vm->def->ndisks; i++) { + disk =3D vm->def->disks[i]; + + if (!(info =3D virHashLookup(disktable, disk->info.alias))) + continue; + + if (qemuBlockDiskDetectNodes(disk, info->nodename, nodenametable) = < 0) + goto cleanup; + } + + ret =3D 0; + + cleanup: + virJSONValueFree(data); + virHashFree(nodenametable); + virHashFree(disktable); + + return ret; +} diff --git a/src/qemu/qemu_block.h b/src/qemu/qemu_block.h index 26f5ae062..56f4a74dd 100644 --- a/src/qemu/qemu_block.h +++ b/src/qemu/qemu_block.h @@ -44,4 +44,8 @@ struct qemuBlockNodeNameBackingChainData { virHashTablePtr qemuBlockNodeNameGetBackingChain(virJSONValuePtr data); +int +qemuBlockNodeNamesDetect(virQEMUDriverPtr driver, + virDomainObjPtr vm); + #endif /* __QEMU_BLOCK_H__ */ diff --git a/src/qemu/qemu_blockjob.c b/src/qemu/qemu_blockjob.c index 985fae1e9..0601e68da 100644 --- a/src/qemu/qemu_blockjob.c +++ b/src/qemu/qemu_blockjob.c @@ -24,6 +24,7 @@ #include "internal.h" #include "qemu_blockjob.h" +#include "qemu_block.h" #include "qemu_domain.h" #include "conf/domain_conf.h" @@ -166,6 +167,7 @@ qemuBlockJobEventProcess(virQEMUDriverPtr driver, disk->mirrorJob =3D VIR_DOMAIN_BLOCK_JOB_TYPE_UNKNOWN; ignore_value(qemuDomainDetermineDiskChain(driver, vm, disk, true, true)); + ignore_value(qemuBlockNodeNamesDetect(driver, vm)); diskPriv->blockjob =3D false; break; diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index d8e3ddf57..22cf866cd 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -46,6 +46,7 @@ #include "qemu_driver.h" #include "qemu_agent.h" #include "qemu_alias.h" +#include "qemu_block.h" #include "qemu_conf.h" #include "qemu_capabilities.h" #include "qemu_command.h" @@ -20333,6 +20334,10 @@ qemuDomainSetBlockThreshold(virDomainPtr dom, if (!(src =3D qemuDomainGetStorageSourceByDevstr(dev, vm->def))) goto endjob; + if (!src->nodebacking && + qemuBlockNodeNamesDetect(driver, vm) < 0) + goto endjob; + if (!src->nodebacking) { virReportError(VIR_ERR_OPERATION_UNSUPPORTED, _("threshold currently can't be set for block devic= e '%s'"), diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index d40deea10..d8626d410 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -35,6 +35,7 @@ #include "qemu_process.h" #include "qemu_processpriv.h" #include "qemu_alias.h" +#include "qemu_block.h" #include "qemu_domain.h" #include "qemu_domain_address.h" #include "qemu_cgroup.h" @@ -3474,6 +3475,9 @@ qemuProcessReconnect(void *opaque) if (qemuProcessRefreshDisks(driver, obj, QEMU_ASYNC_JOB_NONE) < 0) goto error; + if (qemuBlockNodeNamesDetect(driver, obj) < 0) + goto error; + if (qemuRefreshVirtioChannelState(driver, obj, QEMU_ASYNC_JOB_NONE) < = 0) goto error; --=20 2.12.0 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list