From nobody Sat May 4 16:03:04 2024 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 Return-Path: Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by mx.zohomail.com with SMTPS id 1502783613289657.4365877536355; Tue, 15 Aug 2017 00:53:33 -0700 (PDT) Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.phx2.redhat.com [10.5.11.13]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 51DD02C96ED; Tue, 15 Aug 2017 07:53:27 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.20]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 2043F60601; Tue, 15 Aug 2017 07:53:27 +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 C1CFB180B467; Tue, 15 Aug 2017 07:53:26 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id v7F7r5gh017746 for ; Tue, 15 Aug 2017 03:53:05 -0400 Received: by smtp.corp.redhat.com (Postfix) id E5CE7600CD; Tue, 15 Aug 2017 07:53:05 +0000 (UTC) Received: from moe.brq.redhat.com (unknown [10.43.2.192]) by smtp.corp.redhat.com (Postfix) with ESMTP id 6DBE0600CA for ; Tue, 15 Aug 2017 07:53:05 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 51DD02C96ED Authentication-Results: ext-mx05.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx05.extmail.prod.ext.phx2.redhat.com; spf=fail smtp.mailfrom=libvir-list-bounces@redhat.com From: Michal Privoznik To: libvir-list@redhat.com Date: Tue, 15 Aug 2017 09:53:00 +0200 Message-Id: In-Reply-To: References: In-Reply-To: References: X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11 X-loop: libvir-list@redhat.com Subject: [libvirt] [PATCH v2 1/2] qemu: Introduce and use qemuDomainRemoveInactiveJob 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.13 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.29]); Tue, 15 Aug 2017 07:53:27 +0000 (UTC) X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" At some places we either already have synchronous job or we just released it. Also, some APIs might want to use this code without having to release their job. Anyway, the job acquire code is moved out to qemuDomainRemoveInactiveJob so that qemuDomainRemoveInactive does just what it promises. Signed-off-by: Michal Privoznik Reviewed-by: John Ferlan --- src/qemu/qemu_domain.c | 36 +++++++++++++++++++++++++++--------- src/qemu/qemu_domain.h | 3 +++ src/qemu/qemu_driver.c | 26 +++++++++++++------------- src/qemu/qemu_migration.c | 10 +++++----- src/qemu/qemu_process.c | 10 +++++----- 5 files changed, 53 insertions(+), 32 deletions(-) diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index 40608554c..2b19f841c 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -5187,14 +5187,16 @@ qemuDomainSnapshotDiscardAllMetadata(virQEMUDriverP= tr driver, return rem.err; } =20 -/* + +/** + * qemuDomainRemoveInactive: + * * The caller must hold a lock the vm. */ void qemuDomainRemoveInactive(virQEMUDriverPtr driver, virDomainObjPtr vm) { - bool haveJob =3D true; char *snapDir; virQEMUDriverConfigPtr cfg; =20 @@ -5205,9 +5207,6 @@ qemuDomainRemoveInactive(virQEMUDriverPtr driver, =20 cfg =3D virQEMUDriverGetConfig(driver); =20 - if (qemuDomainObjBeginJob(driver, vm, QEMU_JOB_MODIFY) < 0) - haveJob =3D false; - /* Remove any snapshot metadata prior to removing the domain */ if (qemuDomainSnapshotDiscardAllMetadata(driver, vm) < 0) { VIR_WARN("unable to remove all snapshots for domain %s", @@ -5240,13 +5239,32 @@ qemuDomainRemoveInactive(virQEMUDriverPtr driver, */ virObjectLock(vm); virObjectUnref(cfg); - - if (haveJob) - qemuDomainObjEndJob(driver, vm); - virObjectUnref(vm); } =20 + +/** + * qemuDomainRemoveInactiveJob: + * + * Just like qemuDomainRemoveInactive but it tries to grab a + * QEMU_JOB_MODIFY before. If it doesn't succeed in grabbing the + * job the control carries with qemuDomainRemoveInactive though. + */ +void +qemuDomainRemoveInactiveJob(virQEMUDriverPtr driver, + virDomainObjPtr vm) +{ + bool haveJob; + + haveJob =3D qemuDomainObjBeginJob(driver, vm, QEMU_JOB_MODIFY) >=3D 0; + + qemuDomainRemoveInactive(driver, vm); + + if (haveJob) + qemuDomainObjEndJob(driver, vm); +} + + void qemuDomainSetFakeReboot(virQEMUDriverPtr driver, virDomainObjPtr vm, diff --git a/src/qemu/qemu_domain.h b/src/qemu/qemu_domain.h index 4c9050aff..f93b09b69 100644 --- a/src/qemu/qemu_domain.h +++ b/src/qemu/qemu_domain.h @@ -611,6 +611,9 @@ int qemuDomainSnapshotDiscardAllMetadata(virQEMUDriverP= tr driver, void qemuDomainRemoveInactive(virQEMUDriverPtr driver, virDomainObjPtr vm); =20 +void qemuDomainRemoveInactiveJob(virQEMUDriverPtr driver, + virDomainObjPtr vm); + void qemuDomainSetFakeReboot(virQEMUDriverPtr driver, virDomainObjPtr vm, bool value); diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index e9f07c6e7..94c9c003f 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -1779,7 +1779,7 @@ static virDomainPtr qemuDomainCreateXML(virConnectPtr= conn, def =3D NULL; =20 if (qemuProcessBeginJob(driver, vm, VIR_DOMAIN_JOB_OPERATION_START) < = 0) { - qemuDomainRemoveInactive(driver, vm); + qemuDomainRemoveInactiveJob(driver, vm); goto cleanup; } =20 @@ -1789,7 +1789,7 @@ static virDomainPtr qemuDomainCreateXML(virConnectPtr= conn, start_flags) < 0) { virDomainAuditStart(vm, "booted", false); qemuProcessEndJob(driver, vm); - qemuDomainRemoveInactive(driver, vm); + qemuDomainRemoveInactiveJob(driver, vm); goto cleanup; } =20 @@ -2259,9 +2259,9 @@ qemuDomainDestroyFlags(virDomainPtr dom, =20 ret =3D 0; endjob: - qemuDomainObjEndJob(driver, vm); if (ret =3D=3D 0) qemuDomainRemoveInactive(driver, vm); + qemuDomainObjEndJob(driver, vm); =20 cleanup: virDomainObjEndAPI(&vm); @@ -3396,7 +3396,7 @@ qemuDomainSaveInternal(virQEMUDriverPtr driver, virDo= mainPtr dom, } qemuDomainObjEndAsyncJob(driver, vm); if (ret =3D=3D 0) - qemuDomainRemoveInactive(driver, vm); + qemuDomainRemoveInactiveJob(driver, vm); =20 cleanup: virObjectUnref(cookie); @@ -3916,7 +3916,7 @@ qemuDomainCoreDumpWithFormat(virDomainPtr dom, =20 qemuDomainObjEndAsyncJob(driver, vm); if (ret =3D=3D 0 && flags & VIR_DUMP_CRASH) - qemuDomainRemoveInactive(driver, vm); + qemuDomainRemoveInactiveJob(driver, vm); =20 cleanup: virDomainObjEndAPI(&vm); @@ -4227,7 +4227,7 @@ processGuestPanicEvent(virQEMUDriverPtr driver, endjob: qemuDomainObjEndAsyncJob(driver, vm); if (removeInactive) - qemuDomainRemoveInactive(driver, vm); + qemuDomainRemoveInactiveJob(driver, vm); =20 cleanup: virObjectUnref(cfg); @@ -4729,8 +4729,8 @@ processMonitorEOFEvent(virQEMUDriverPtr driver, qemuDomainEventQueue(driver, event); =20 endjob: - qemuDomainObjEndJob(driver, vm); qemuDomainRemoveInactive(driver, vm); + qemuDomainObjEndJob(driver, vm); } =20 =20 @@ -6680,7 +6680,7 @@ qemuDomainRestoreFlags(virConnectPtr conn, VIR_FREE(xmlout); virFileWrapperFdFree(wrapperFd); if (vm && ret < 0) - qemuDomainRemoveInactive(driver, vm); + qemuDomainRemoveInactiveJob(driver, vm); virDomainObjEndAPI(&vm); virNWFilterUnlockFilterUpdates(); return ret; @@ -7263,7 +7263,7 @@ qemuDomainDefineXMLFlags(virConnectPtr conn, /* Brand new domain. Remove it */ VIR_INFO("Deleting domain '%s'", vm->def->name); vm->persistent =3D 0; - qemuDomainRemoveInactive(driver, vm); + qemuDomainRemoveInactiveJob(driver, vm); } goto cleanup; } @@ -7396,7 +7396,7 @@ qemuDomainUndefineFlags(virDomainPtr dom, */ vm->persistent =3D 0; if (!virDomainObjIsActive(vm)) - qemuDomainRemoveInactive(driver, vm); + qemuDomainRemoveInactiveJob(driver, vm); =20 ret =3D 0; =20 @@ -15591,8 +15591,8 @@ qemuDomainRevertToSnapshot(virDomainSnapshotPtr sna= pshot, } =20 if (qemuDomainSnapshotRevertInactive(driver, vm, snap) < 0) { + qemuDomainRemoveInactive(driver, vm); qemuProcessEndJob(driver, vm); - qemuDomainRemoveInactive(driver, vm); goto cleanup; } if (config) @@ -15613,8 +15613,8 @@ qemuDomainRevertToSnapshot(virDomainSnapshotPtr sna= pshot, start_flags); virDomainAuditStart(vm, "from-snapshot", rc >=3D 0); if (rc < 0) { - qemuProcessEndJob(driver, vm); qemuDomainRemoveInactive(driver, vm); + qemuProcessEndJob(driver, vm); goto cleanup; } detail =3D VIR_DOMAIN_EVENT_STARTED_FROM_SNAPSHOT; @@ -15957,8 +15957,8 @@ static virDomainPtr qemuDomainQemuAttach(virConnect= Ptr conn, if (qemuProcessAttach(conn, driver, vm, pid, pidfile, monConfig, monJSON) < 0) { monConfig =3D NULL; - qemuDomainObjEndJob(driver, vm); qemuDomainRemoveInactive(driver, vm); + qemuDomainObjEndJob(driver, vm); goto cleanup; } =20 diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c index 056c051b3..b1f613430 100644 --- a/src/qemu/qemu_migration.c +++ b/src/qemu/qemu_migration.c @@ -2850,7 +2850,7 @@ qemuMigrationPrepareAny(virQEMUDriverPtr driver, virPortAllocatorRelease(driver->migrationPorts, priv->nbdPort); priv->nbdPort =3D 0; virDomainObjRemoveTransientDef(vm); - qemuDomainRemoveInactive(driver, vm); + qemuDomainRemoveInactiveJob(driver, vm); } qemuMigrationParamsClear(&migParams); virDomainObjEndAPI(&vm); @@ -3291,7 +3291,7 @@ qemuMigrationConfirm(virConnectPtr conn, virDomainDeleteConfig(cfg->configDir, cfg->autostartDir, vm); vm->persistent =3D 0; } - qemuDomainRemoveInactive(driver, vm); + qemuDomainRemoveInactiveJob(driver, vm); } =20 cleanup: @@ -4867,7 +4867,7 @@ qemuMigrationPerformJob(virQEMUDriverPtr driver, virDomainDeleteConfig(cfg->configDir, cfg->autostartDir, vm); vm->persistent =3D 0; } - qemuDomainRemoveInactive(driver, vm); + qemuDomainRemoveInactiveJob(driver, vm); } =20 if (orig_err) { @@ -4947,7 +4947,7 @@ qemuMigrationPerformPhase(virQEMUDriverPtr driver, } =20 if (!virDomainObjIsActive(vm)) - qemuDomainRemoveInactive(driver, vm); + qemuDomainRemoveInactiveJob(driver, vm); =20 cleanup: virDomainObjEndAPI(&vm); @@ -5388,7 +5388,7 @@ qemuMigrationFinish(virQEMUDriverPtr driver, =20 qemuMigrationJobFinish(driver, vm); if (!virDomainObjIsActive(vm)) - qemuDomainRemoveInactive(driver, vm); + qemuDomainRemoveInactiveJob(driver, vm); =20 cleanup: VIR_FREE(jobInfo); diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index fed2bc588..b86ef3757 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -6652,10 +6652,10 @@ qemuProcessAutoDestroy(virDomainObjPtr dom, VIR_DOMAIN_EVENT_STOPPED, VIR_DOMAIN_EVENT_STOPPED_DESTROYED); =20 - qemuDomainObjEndJob(driver, dom); - qemuDomainRemoveInactive(driver, dom); =20 + qemuDomainObjEndJob(driver, dom); + qemuDomainEventQueue(driver, event); =20 cleanup: @@ -6987,10 +6987,10 @@ qemuProcessReconnect(void *opaque) driver->inhibitCallback(true, driver->inhibitOpaque); =20 cleanup: - if (jobStarted) - qemuDomainObjEndJob(driver, obj); if (!virDomainObjIsActive(obj)) qemuDomainRemoveInactive(driver, obj); + if (jobStarted) + qemuDomainObjEndJob(driver, obj); virDomainObjEndAPI(&obj); virObjectUnref(conn); virObjectUnref(cfg); @@ -7065,7 +7065,7 @@ qemuProcessReconnectHelper(virDomainObjPtr obj, */ qemuProcessStop(src->driver, obj, VIR_DOMAIN_SHUTOFF_FAILED, QEMU_ASYNC_JOB_NONE, 0); - qemuDomainRemoveInactive(src->driver, obj); + qemuDomainRemoveInactiveJob(src->driver, obj); =20 virDomainObjEndAPI(&obj); virNWFilterUnlockFilterUpdates(); --=20 2.13.0 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list From nobody Sat May 4 16:03:04 2024 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 Return-Path: Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by mx.zohomail.com with SMTPS id 1502783616438213.5238959376195; Tue, 15 Aug 2017 00:53:36 -0700 (PDT) Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 55D97C0546DD; Tue, 15 Aug 2017 07:53:33 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.20]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 22D1D600CC; Tue, 15 Aug 2017 07:53:33 +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 C40E1180B467; Tue, 15 Aug 2017 07:53:32 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id v7F7r69w017753 for ; Tue, 15 Aug 2017 03:53:06 -0400 Received: by smtp.corp.redhat.com (Postfix) id D8812600CE; Tue, 15 Aug 2017 07:53:06 +0000 (UTC) Received: from moe.brq.redhat.com (unknown [10.43.2.192]) by smtp.corp.redhat.com (Postfix) with ESMTP id 60A47600CA for ; Tue, 15 Aug 2017 07:53:06 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 55D97C0546DD Authentication-Results: ext-mx08.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx08.extmail.prod.ext.phx2.redhat.com; spf=fail smtp.mailfrom=libvir-list-bounces@redhat.com From: Michal Privoznik To: libvir-list@redhat.com Date: Tue, 15 Aug 2017 09:53:01 +0200 Message-Id: <73439aa847353aafe3a408f70859041a1ac7ffb6.1502783456.git.mprivozn@redhat.com> In-Reply-To: References: In-Reply-To: References: X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11 X-loop: libvir-list@redhat.com Subject: [libvirt] [PATCH v2 2/2] qemuDomainUndefineFlags: Grab QEMU_JOB_MODIFY 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.11 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.32]); Tue, 15 Aug 2017 07:53:33 +0000 (UTC) X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" This API is definitely modifying state of @vm. Therefore it should grab a job. Signed-off-by: Michal Privoznik Reviewed-by: John Ferlan --- src/qemu/qemu_driver.c | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 94c9c003f..3f7909c21 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -7325,10 +7325,13 @@ qemuDomainUndefineFlags(virDomainPtr dom, if (virDomainUndefineFlagsEnsureACL(dom->conn, vm->def) < 0) goto cleanup; =20 + if (qemuDomainObjBeginJob(driver, vm, QEMU_JOB_MODIFY) < 0) + goto cleanup; + if (!vm->persistent) { virReportError(VIR_ERR_OPERATION_INVALID, "%s", _("cannot undefine transient domain")); - goto cleanup; + goto endjob; } =20 if (!virDomainObjIsActive(vm) && @@ -7338,15 +7341,15 @@ qemuDomainUndefineFlags(virDomainPtr dom, _("cannot delete inactive domain with %d " "snapshots"), nsnapshots); - goto cleanup; + goto endjob; } if (qemuDomainSnapshotDiscardAllMetadata(driver, vm) < 0) - goto cleanup; + goto endjob; } =20 name =3D qemuDomainManagedSavePath(driver, vm); if (name =3D=3D NULL) - goto cleanup; + goto endjob; =20 if (virFileExists(name)) { if (flags & VIR_DOMAIN_UNDEFINE_MANAGED_SAVE) { @@ -7354,13 +7357,13 @@ qemuDomainUndefineFlags(virDomainPtr dom, virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("Failed to remove domain managed " "save image")); - goto cleanup; + goto endjob; } } else { virReportError(VIR_ERR_OPERATION_INVALID, "%s", _("Refusing to undefine while domain managed " "save image exists")); - goto cleanup; + goto endjob; } } =20 @@ -7372,17 +7375,17 @@ qemuDomainUndefineFlags(virDomainPtr dom, virReportSystemError(errno, _("failed to remove nvram: %s"), vm->def->os.loader->nvram); - goto cleanup; + goto endjob; } } else if (!(flags & VIR_DOMAIN_UNDEFINE_KEEP_NVRAM)) { virReportError(VIR_ERR_OPERATION_INVALID, "%s", _("cannot delete inactive domain with nvram")); - goto cleanup; + goto endjob; } } =20 if (virDomainDeleteConfig(cfg->configDir, cfg->autostartDir, vm) < 0) - goto cleanup; + goto endjob; =20 event =3D virDomainEventLifecycleNewFromObj(vm, VIR_DOMAIN_EVENT_UNDEFINED, @@ -7396,9 +7399,11 @@ qemuDomainUndefineFlags(virDomainPtr dom, */ vm->persistent =3D 0; if (!virDomainObjIsActive(vm)) - qemuDomainRemoveInactiveJob(driver, vm); + qemuDomainRemoveInactive(driver, vm); =20 ret =3D 0; + endjob: + qemuDomainObjEndJob(driver, vm); =20 cleanup: VIR_FREE(name); --=20 2.13.0 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list