From nobody Fri Dec 19 20:18:19 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of redhat.com designates 207.211.31.81 as permitted sender) client-ip=207.211.31.81; envelope-from=libvir-list-bounces@redhat.com; helo=us-smtp-delivery-1.mimecast.com; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 207.211.31.81 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1592241051; cv=none; d=zohomail.com; s=zohoarc; b=mQkxpoIpZ2wAXg/Zhp0+ZPOBkV8Kc1e7Xbcp+ZsfWUSHVv4J6250HKcrrLDfPwQs6iPa9ym1/6b/wH4DJ2QuHEugxk1ygfn7eB+3smWunvpm19DM5+IT8hErKQKe2XQ8Jn6JDqRKz7/eMk7oFA1lAkJyuwxnEIHcwTEIoDFlddA= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1592241051; h=Content-Type:Content-Transfer-Encoding:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=V8wKSia20I0wSaDWIpAi9ghJo3cxHzVz3v6/z6HIbUs=; b=jocwN2Oai0vu8s+z2CwyUN4vPVj8/ykPDN8tzTCY6lrm5xlr8VcJAt4/y8VroySaf9wqIfs4ddlx7lwFYrACjGmCae7b8O/igdEnflQeoKY8HVDLUlMkW5rxxxwkjHi4AWT9WQwKM0pP5sNGsb5w3GEYtWGbAZhp7FqCS3tgj7A= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 207.211.31.81 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=pass header.from= (p=none dis=none) header.from= Return-Path: Received: from us-smtp-delivery-1.mimecast.com (us-smtp-2.mimecast.com [207.211.31.81]) by mx.zohomail.com with SMTPS id 1592241051757636.0561961509308; Mon, 15 Jun 2020 10:10:51 -0700 (PDT) Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-323-BzpyDl6JMw2lWtjMKAJCNw-1; Mon, 15 Jun 2020 13:10:46 -0400 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 mimecast-mx01.redhat.com (Postfix) with ESMTPS id 31C6210059D0; Mon, 15 Jun 2020 17:10:39 +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 0674F7CAA8; Mon, 15 Jun 2020 17:10:39 +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 B73111809561; Mon, 15 Jun 2020 17:10:38 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx07.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id 05FHARDU004659 for ; Mon, 15 Jun 2020 13:10:27 -0400 Received: by smtp.corp.redhat.com (Postfix) id 70269100164D; Mon, 15 Jun 2020 17:10:27 +0000 (UTC) Received: from speedmetal.redhat.com (unknown [10.40.208.90]) by smtp.corp.redhat.com (Postfix) with ESMTP id DD0341001901 for ; Mon, 15 Jun 2020 17:10:26 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1592241050; h=from:from:sender:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:list-id:list-help: list-unsubscribe:list-subscribe:list-post; bh=V8wKSia20I0wSaDWIpAi9ghJo3cxHzVz3v6/z6HIbUs=; b=HntLyG3arWzvCGalcNoK8rjjqdQM9zbvyy1U/Fu4u1qrCxXxH1Gow8AMSM8iy2/cKXAQrC dEjmfI9v/5fvs5RNuCfwaB2xuefi4Go1e+4GZz3frL+ekhkJr6fQkfQUKGXVQdw3Pspl9Y UAVdzDrHb5HI0ivzhQvpKCJ4HFfII8M= X-MC-Unique: BzpyDl6JMw2lWtjMKAJCNw-1 From: Peter Krempa To: libvir-list@redhat.com Subject: [PATCH 04/32] qemu: backup: Move fetching of checkpoint list for incremental backup Date: Mon, 15 Jun 2020 19:09:51 +0200 Message-Id: In-Reply-To: References: MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.84 on 10.5.11.22 X-loop: libvir-list@redhat.com 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: , 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-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable X-ZohoMail-DKIM: pass (identity @redhat.com) Content-Type: text/plain; charset="utf-8" Fetch the checkpoint list for every disk specifically based on the new per-disk 'incremental' field. Signed-off-by: Peter Krempa Reviewed-by: Eric Blake --- src/qemu/qemu_backup.c | 108 ++++++++++++++++++++--------------------- 1 file changed, 52 insertions(+), 56 deletions(-) diff --git a/src/qemu/qemu_backup.c b/src/qemu/qemu_backup.c index 686ed57e82..495da86ff0 100644 --- a/src/qemu/qemu_backup.c +++ b/src/qemu/qemu_backup.c @@ -173,6 +173,50 @@ qemuBackupDiskDataCleanup(virDomainObjPtr vm, } +/** + * qemuBackupBeginCollectIncrementalCheckpoints: + * @vm: domain object + * @incrFrom: name of checkpoint representing starting point of incrementa= l backup + * + * Returns a NULL terminated list of pointers to checkpoint definitions in + * chronological order starting from the 'current' checkpoint until reachi= ng + * @incrFrom. + */ +static virDomainMomentDefPtr * +qemuBackupBeginCollectIncrementalCheckpoints(virDomainObjPtr vm, + const char *incrFrom) +{ + virDomainMomentObjPtr n =3D virDomainCheckpointGetCurrent(vm->checkpoi= nts); + g_autofree virDomainMomentDefPtr *incr =3D NULL; + size_t nincr =3D 0; + + while (n) { + virDomainMomentDefPtr def =3D n->def; + + if (VIR_APPEND_ELEMENT_COPY(incr, nincr, def) < 0) + return NULL; + + if (STREQ(def->name, incrFrom)) { + def =3D NULL; + if (VIR_APPEND_ELEMENT_COPY(incr, nincr, def) < 0) + return NULL; + + return g_steal_pointer(&incr); + } + + if (!n->def->parent_name) + break; + + n =3D virDomainCheckpointFindByName(vm->checkpoints, n->def->paren= t_name); + } + + virReportError(VIR_ERR_OPERATION_INVALID, + _("could not locate checkpoint '%s' for incremental bac= kup"), + incrFrom); + return NULL; +} + + static int qemuBackupGetBitmapMergeRange(virStorageSourcePtr from, const char *bitmapname, @@ -334,11 +378,11 @@ qemuBackupDiskPrepareDataOne(virDomainObjPtr vm, struct qemuBackupDiskData *dd, virJSONValuePtr actions, bool pull, - virDomainMomentDefPtr *incremental, virHashTablePtr blockNamedNodeData, virQEMUDriverConfigPtr cfg) { qemuDomainObjPrivatePtr priv =3D vm->privateData; + g_autofree virDomainMomentDefPtr *incremental =3D NULL; /* set data structure */ dd->backupdisk =3D backupdisk; @@ -363,7 +407,7 @@ qemuBackupDiskPrepareDataOne(virDomainObjPtr vm, * pull mode: * both: original disk */ - if (pull || (incremental && dd->store->format >=3D VIR_STORAGE_FILE_BA= CKING)) { + if (pull || (dd->backupdisk->incremental && dd->store->format >=3D VIR= _STORAGE_FILE_BACKING)) { dd->backingStore =3D dd->domdisk->src; } else { dd->backingStore =3D dd->terminator =3D virStorageSourceNew(); @@ -375,7 +419,10 @@ qemuBackupDiskPrepareDataOne(virDomainObjPtr vm, if (qemuDomainPrepareStorageSourceBlockdev(NULL, dd->store, priv, cfg)= < 0) return -1; - if (incremental) { + if (dd->backupdisk->incremental) { + if (!(incremental =3D qemuBackupBeginCollectIncrementalCheckpoints= (vm, dd->backupdisk->incremental))) + return -1; + if (dd->backupdisk->exportbitmap) dd->incrementalBitmap =3D g_strdup(dd->backupdisk->exportbitma= p); else @@ -444,7 +491,6 @@ qemuBackupDiskPrepareDataOnePull(virJSONValuePtr action= s, static ssize_t qemuBackupDiskPrepareData(virDomainObjPtr vm, virDomainBackupDefPtr def, - virDomainMomentDefPtr *incremental, virHashTablePtr blockNamedNodeData, virJSONValuePtr actions, virQEMUDriverConfigPtr cfg, @@ -467,8 +513,7 @@ qemuBackupDiskPrepareData(virDomainObjPtr vm, ndisks++; if (qemuBackupDiskPrepareDataOne(vm, backupdisk, dd, actions, pull, - incremental, blockNamedNodeData, - cfg) < 0) + blockNamedNodeData, cfg) < 0) goto error; if (pull) { @@ -625,50 +670,6 @@ qemuBackupBeginPullExportDisks(virDomainObjPtr vm, } -/** - * qemuBackupBeginCollectIncrementalCheckpoints: - * @vm: domain object - * @incrFrom: name of checkpoint representing starting point of incrementa= l backup - * - * Returns a NULL terminated list of pointers to checkpoint definitions in - * chronological order starting from the 'current' checkpoint until reachi= ng - * @incrFrom. - */ -static virDomainMomentDefPtr * -qemuBackupBeginCollectIncrementalCheckpoints(virDomainObjPtr vm, - const char *incrFrom) -{ - virDomainMomentObjPtr n =3D virDomainCheckpointGetCurrent(vm->checkpoi= nts); - g_autofree virDomainMomentDefPtr *incr =3D NULL; - size_t nincr =3D 0; - - while (n) { - virDomainMomentDefPtr def =3D n->def; - - if (VIR_APPEND_ELEMENT_COPY(incr, nincr, def) < 0) - return NULL; - - if (STREQ(def->name, incrFrom)) { - def =3D NULL; - if (VIR_APPEND_ELEMENT_COPY(incr, nincr, def) < 0) - return NULL; - - return g_steal_pointer(&incr); - } - - if (!n->def->parent_name) - break; - - n =3D virDomainCheckpointFindByName(vm->checkpoints, n->def->paren= t_name); - } - - virReportError(VIR_ERR_OPERATION_INVALID, - _("could not locate checkpoint '%s' for incremental bac= kup"), - incrFrom); - return NULL; -} - - void qemuBackupJobTerminate(virDomainObjPtr vm, qemuDomainJobStatus jobstatus) @@ -802,7 +803,6 @@ qemuBackupBegin(virDomainObjPtr vm, bool pull =3D false; virDomainMomentObjPtr chk =3D NULL; g_autoptr(virDomainCheckpointDef) chkdef =3D NULL; - g_autofree virDomainMomentDefPtr *incremental =3D NULL; g_autoptr(virJSONValue) actions =3D NULL; struct qemuBackupDiskData *dd =3D NULL; ssize_t ndd =3D 0; @@ -870,10 +870,6 @@ qemuBackupBegin(virDomainObjPtr vm, if (virDomainBackupAlignDisks(def, vm->def, suffix) < 0) goto endjob; - if (def->incremental && - !(incremental =3D qemuBackupBeginCollectIncrementalCheckpoints(vm,= def->incremental))) - goto endjob; - actions =3D virJSONValueNewArray(); /* The 'chk' checkpoint must be rolled back if the transaction command @@ -887,7 +883,7 @@ qemuBackupBegin(virDomainObjPtr vm, if (!(blockNamedNodeData =3D qemuBlockGetNamedNodeData(vm, QEMU_ASYNC_= JOB_BACKUP))) goto endjob; - if ((ndd =3D qemuBackupDiskPrepareData(vm, def, incremental, blockName= dNodeData, + if ((ndd =3D qemuBackupDiskPrepareData(vm, def, blockNamedNodeData, actions, cfg, &dd)) <=3D 0) { if (ndd =3D=3D 0) { virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", --=20 2.26.2