From nobody Thu May 15 07:01:45 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) client-ip=209.132.183.28; envelope-from=libvir-list-bounces@redhat.com; helo=mx1.redhat.com; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=pass(p=none dis=none) header.from=redhat.com Return-Path: Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by mx.zohomail.com with SMTPS id 1527868294871871.6167419408082; Fri, 1 Jun 2018 08:51:34 -0700 (PDT) Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 51E6D309D050; Fri, 1 Jun 2018 15:51:32 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.21]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 778DE60C4E; Fri, 1 Jun 2018 15:51:31 +0000 (UTC) Received: from lists01.pubmisc.prod.ext.phx2.redhat.com (lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33]) by colo-mx.corp.redhat.com (Postfix) with ESMTP id 4F7324CA83; Fri, 1 Jun 2018 15:51:30 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.rdu2.redhat.com [10.11.54.4]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id w51FpRQw010607 for ; Fri, 1 Jun 2018 11:51:27 -0400 Received: by smtp.corp.redhat.com (Postfix) id ACE702026DFD; Fri, 1 Jun 2018 15:51:27 +0000 (UTC) Received: from angien.brq.redhat.com (unknown [10.43.2.136]) by smtp.corp.redhat.com (Postfix) with ESMTP id 51F5F2026DEF for ; Fri, 1 Jun 2018 15:51:27 +0000 (UTC) From: Peter Krempa To: libvir-list@redhat.com Date: Fri, 1 Jun 2018 17:51:06 +0200 Message-Id: In-Reply-To: References: In-Reply-To: References: X-Scanned-By: MIMEDefang 2.78 on 10.11.54.4 X-loop: libvir-list@redhat.com Subject: [libvirt] [PATCH 3/9] qemu: Reuse qemuBlockStorageSourceAttachApply in disk hotplug 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-Scanned-By: MIMEDefang 2.79 on 10.5.11.12 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.48]); Fri, 01 Jun 2018 15:51:34 +0000 (UTC) X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" Create a new "Prepare" function and move the drive add code into the new helpers. This will eventually allow to simplify and unify the attaching code for use with blockdev at the same time as providing compatibility with older qemus. Signed-off-by: Peter Krempa Reviewed-by: J=EF=BF=BDn Tomko --- src/qemu/qemu_block.c | 18 ++++++++++++++++++ src/qemu/qemu_block.h | 4 ++++ src/qemu/qemu_command.c | 29 ++++++++++++++++++++++++++++- src/qemu/qemu_command.h | 8 ++++---- src/qemu/qemu_hotplug.c | 26 +++++++++----------------- 5 files changed, 63 insertions(+), 22 deletions(-) diff --git a/src/qemu/qemu_block.c b/src/qemu/qemu_block.c index 85176925c9..73aab9d73a 100644 --- a/src/qemu/qemu_block.c +++ b/src/qemu/qemu_block.c @@ -24,9 +24,12 @@ #include "viralloc.h" #include "virstring.h" +#include "virlog.h" #define VIR_FROM_THIS VIR_FROM_QEMU +VIR_LOG_INIT("qemu.qemu_block"); + /* qemu declares the buffer for node names as a 32 byte array */ static const size_t qemuBlockNodeNameBufSize =3D 32; @@ -1482,6 +1485,8 @@ qemuBlockStorageSourceAttachDataFree(qemuBlockStorage= SourceAttachDataPtr data) virJSONValueFree(data->storageProps); virJSONValueFree(data->formatProps); + VIR_FREE(data->driveCmd); + VIR_FREE(data->driveAlias); VIR_FREE(data); } @@ -1563,6 +1568,13 @@ qemuBlockStorageSourceAttachApply(qemuMonitorPtr mon, data->formatAttached =3D true; } + if (data->driveCmd) { + if (qemuMonitorAddDrive(mon, data->driveCmd) < 0) + return -1; + + data->driveAdded =3D true; + } + return 0; } @@ -1591,6 +1603,12 @@ qemuBlockStorageSourceAttachRollback(qemuMonitorPtr = mon, if (data->storageAttached) ignore_value(qemuMonitorBlockdevDel(mon, data->storageNodeName)); + if (data->driveAdded) { + if (qemuMonitorDriveDel(mon, data->driveAlias) < 0) + VIR_WARN("Unable to remove drive %s (%s) after failed " + "qemuMonitorAddDevice", data->driveAlias, data->drive= Cmd); + } + virErrorRestore(&orig_err); } diff --git a/src/qemu/qemu_block.h b/src/qemu/qemu_block.h index bbaf9ec0f1..5c7791ee72 100644 --- a/src/qemu/qemu_block.h +++ b/src/qemu/qemu_block.h @@ -78,6 +78,10 @@ struct qemuBlockStorageSourceAttachData { virJSONValuePtr formatProps; const char *formatNodeName; bool formatAttached; + + char *driveCmd; + char *driveAlias; + bool driveAdded; }; diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 484ac261b0..84bb857507 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -1639,7 +1639,7 @@ qemuBuildDiskFrontendAttributes(virDomainDiskDefPtr d= isk, } -char * +static char * qemuBuildDriveStr(virDomainDiskDefPtr disk, bool bootable, virQEMUCapsPtr qemuCaps) @@ -10436,3 +10436,30 @@ qemuBuildHotpluggableCPUProps(const virDomainVcpuD= ef *vcpu) virJSONValueFree(ret); return NULL; } + + +/** + * qemuBuildStorageSourceAttachPrepareDrive: + * @disk: disk object to prepare + * @qemuCaps: qemu capabilities object + * + * Prepare qemuBlockStorageSourceAttachDataPtr for use with the old approa= ch + * using -drive/drive_add. See qemuBlockStorageSourceAttachPrepareBlockdev. + */ +qemuBlockStorageSourceAttachDataPtr +qemuBuildStorageSourceAttachPrepareDrive(virDomainDiskDefPtr disk, + virQEMUCapsPtr qemuCaps) +{ + qemuBlockStorageSourceAttachDataPtr data =3D NULL; + + if (VIR_ALLOC(data) < 0) + return NULL; + + if (!(data->driveCmd =3D qemuBuildDriveStr(disk, false, qemuCaps)) || + !(data->driveAlias =3D qemuAliasDiskDriveFromDisk(disk))) { + qemuBlockStorageSourceAttachDataFree(data); + return NULL; + } + + return data; +} diff --git a/src/qemu/qemu_command.h b/src/qemu/qemu_command.h index b7580b4796..04f6245bc7 100644 --- a/src/qemu/qemu_command.h +++ b/src/qemu/qemu_command.h @@ -28,6 +28,7 @@ # include "domain_conf.h" # include "vircommand.h" # include "capabilities.h" +# include "qemu_block.h" # include "qemu_conf.h" # include "qemu_domain.h" # include "qemu_domain_address.h" @@ -102,10 +103,9 @@ char *qemuBuildNicDevStr(virDomainDefPtr def, char *qemuDeviceDriveHostAlias(virDomainDiskDefPtr disk); -/* Both legacy & current support */ -char *qemuBuildDriveStr(virDomainDiskDefPtr disk, - bool bootable, - virQEMUCapsPtr qemuCaps); +qemuBlockStorageSourceAttachDataPtr +qemuBuildStorageSourceAttachPrepareDrive(virDomainDiskDefPtr disk, + virQEMUCapsPtr qemuCaps); /* Current, best practice */ char *qemuBuildDriveDevStr(const virDomainDef *def, diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c index 62fb652093..ece9a82562 100644 --- a/src/qemu/qemu_hotplug.c +++ b/src/qemu/qemu_hotplug.c @@ -35,6 +35,7 @@ #include "qemu_interface.h" #include "qemu_process.h" #include "qemu_security.h" +#include "qemu_block.h" #include "domain_audit.h" #include "netdev_bandwidth_conf.h" #include "domain_nwfilter.h" @@ -390,15 +391,13 @@ qemuDomainAttachDiskGeneric(virQEMUDriverPtr driver, { int ret =3D -1; qemuDomainObjPrivatePtr priv =3D vm->privateData; + qemuBlockStorageSourceAttachDataPtr data =3D NULL; virErrorPtr orig_err; char *devstr =3D NULL; - char *drivestr =3D NULL; - char *drivealias =3D NULL; char *unmanagedPrmgrAlias =3D NULL; char *managedPrmgrAlias =3D NULL; char *encobjAlias =3D NULL; char *secobjAlias =3D NULL; - bool driveAdded =3D false; virQEMUDriverConfigPtr cfg =3D virQEMUDriverGetConfig(driver); virJSONValuePtr secobjProps =3D NULL; virJSONValuePtr encobjProps =3D NULL; @@ -439,14 +438,11 @@ qemuDomainAttachDiskGeneric(virQEMUDriverPtr driver, !(unmanagedPrmgrProps =3D qemuBuildPRManagerInfoProps(disk->src))) goto error; - if (disk->src->haveTLS =3D=3D VIR_TRISTATE_BOOL_YES && - qemuDomainAddDiskSrcTLSObject(driver, vm, disk->src) < 0) - goto error; - - if (!(drivestr =3D qemuBuildDriveStr(disk, false, priv->qemuCaps))) + if (!(data =3D qemuBuildStorageSourceAttachPrepareDrive(disk, priv->qe= muCaps))) goto error; - if (!(drivealias =3D qemuAliasDiskDriveFromDisk(disk))) + if (disk->src->haveTLS =3D=3D VIR_TRISTATE_BOOL_YES && + qemuDomainAddDiskSrcTLSObject(driver, vm, disk->src) < 0) goto error; if (!(devstr =3D qemuBuildDriveDevStr(vm->def, disk, 0, priv->qemuCaps= ))) @@ -473,9 +469,8 @@ qemuDomainAttachDiskGeneric(virQEMUDriverPtr driver, qemuMonitorAddObject(priv->mon, &unmanagedPrmgrProps, &unmanagedPr= mgrAlias) < 0) goto exit_monitor; - if (qemuMonitorAddDrive(priv->mon, drivestr) < 0) + if (qemuBlockStorageSourceAttachApply(priv->mon, data) < 0) goto exit_monitor; - driveAdded =3D true; if (qemuMonitorAddDevice(priv->mon, devstr) < 0) goto exit_monitor; @@ -491,6 +486,7 @@ qemuDomainAttachDiskGeneric(virQEMUDriverPtr driver, ret =3D 0; cleanup: + qemuBlockStorageSourceAttachDataFree(data); virJSONValueFree(managedPrmgrProps); virJSONValueFree(unmanagedPrmgrProps); virJSONValueFree(encobjProps); @@ -500,18 +496,14 @@ qemuDomainAttachDiskGeneric(virQEMUDriverPtr driver, VIR_FREE(unmanagedPrmgrAlias); VIR_FREE(secobjAlias); VIR_FREE(encobjAlias); - VIR_FREE(drivealias); - VIR_FREE(drivestr); VIR_FREE(devstr); virObjectUnref(cfg); return ret; exit_monitor: + qemuBlockStorageSourceAttachRollback(priv->mon, data); + virErrorPreserveLast(&orig_err); - if (driveAdded && qemuMonitorDriveDel(priv->mon, drivealias) < 0) { - VIR_WARN("Unable to remove drive %s (%s) after failed " - "qemuMonitorAddDevice", drivealias, drivestr); - } if (secobjAlias) ignore_value(qemuMonitorDelObject(priv->mon, secobjAlias)); if (encobjAlias) --=20 2.16.2 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list