From nobody Sun Feb 8 23:06:09 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of redhat.com designates 205.139.110.61 as permitted sender) client-ip=205.139.110.61; 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 205.139.110.61 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=1593701164; cv=none; d=zohomail.com; s=zohoarc; b=D6plsdozio2lrHx9mOHmNg7SURIEnRtSdYu0SG5Cb9v5zSoKcOVsrvgyvfXzM4L6t3dek2x8TVpbv45tYqCBBzduRz1AMXCms2nG+SbO6giYB9PKclCI8TVGcQkAs0vz9k7c9cwrIaElC15ilhNhJAdM5WazkJqYT6U0nXr2Zrk= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1593701164; 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=4S9Bmsstktovg4+zG5hqGBhND++D6sPjSuYTTH1aP8s=; b=VR6B4xg3KwayDeJ3Vs4IrHBxHhqsqV3v5hXhHu3O60/j/DsjfdwBSZzT/Z4sNCmsoWIMGlNY0ix71SNSgBisOks3PWMvwSPulzqDclr5KnPDXDotmHGVIZfJjYaQgcgvmaotF4Tpz8UVEgPx8o+ys/Fz4loO28vurStYASwcPDs= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 205.139.110.61 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 [205.139.110.61]) by mx.zohomail.com with SMTPS id 1593701164007912.9562171499274; Thu, 2 Jul 2020 07:46:04 -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-144-9MJ9iJvlNnquBCkLNrtiKQ-1; Thu, 02 Jul 2020 10:45:20 -0400 Received: from smtp.corp.redhat.com (int-mx08.intmail.prod.int.phx2.redhat.com [10.5.11.23]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id B3471100A622; Thu, 2 Jul 2020 14:45:14 +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 90AA12B4DE; Thu, 2 Jul 2020 14:45:14 +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 5E7F96C9DC; Thu, 2 Jul 2020 14:45:14 +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 062EeZum011864 for ; Thu, 2 Jul 2020 10:40:35 -0400 Received: by smtp.corp.redhat.com (Postfix) id E748E10002A2; Thu, 2 Jul 2020 14:40:35 +0000 (UTC) Received: from speedmetal.redhat.com (unknown [10.40.208.18]) by smtp.corp.redhat.com (Postfix) with ESMTP id 636ED10013D2 for ; Thu, 2 Jul 2020 14:40:35 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1593701162; 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=4S9Bmsstktovg4+zG5hqGBhND++D6sPjSuYTTH1aP8s=; b=Z08uwsz/6jwuDvOCF/KVydblFtH/nOHkMGHRdUcNZI76TKZSvz+XmrKTz3X0ySua6/1SlR ABu5iP03szdEIwJFlk+NekBtyYwy2XkhPS3M2sCEDz+jP2C23sdj8NbDfWBgNI9MYj1RsO oSmX7tLX8ofxJdWGYBFGxREzUIxe3dE= X-MC-Unique: 9MJ9iJvlNnquBCkLNrtiKQ-1 From: Peter Krempa To: libvir-list@redhat.com Subject: [PATCH 18/24] qemu: checkpoint: Implement VIR_DOMAIN_CHECKPOINT_XML_SIZE Date: Thu, 2 Jul 2020 16:40:04 +0200 Message-Id: <76532298a679ec88d5aa399c5411dbb820a4e03f.1593700474.git.pkrempa@redhat.com> 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.84 on 10.5.11.23 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=libvir-list-bounces@redhat.com 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" Introduce code which merges the appropriate bitmaps and queries the final size of the backup, so that we can print the XML with size information. Signed-off-by: Peter Krempa Reviewed-by: Eric Blake --- src/qemu/qemu_checkpoint.c | 143 ++++++++++++++++++++++++++++++++++++- 1 file changed, 142 insertions(+), 1 deletion(-) diff --git a/src/qemu/qemu_checkpoint.c b/src/qemu/qemu_checkpoint.c index c24d97443c..f45ab29d4c 100644 --- a/src/qemu/qemu_checkpoint.c +++ b/src/qemu/qemu_checkpoint.c @@ -567,6 +567,142 @@ qemuCheckpointCreateXML(virDomainPtr domain, } +struct qemuCheckpointDiskMap { + virDomainCheckpointDiskDefPtr chkdisk; + virDomainDiskDefPtr domdisk; +}; + + +static int +qemuCheckpointGetXMLDescUpdateSize(virDomainObjPtr vm, + virDomainCheckpointDefPtr chkdef) +{ + qemuDomainObjPrivatePtr priv =3D vm->privateData; + virQEMUDriverPtr driver =3D priv->driver; + g_autoptr(virHashTable) blockNamedNodeData =3D NULL; + g_autofree struct qemuCheckpointDiskMap *diskmap =3D NULL; + g_autoptr(virJSONValue) recoveractions =3D NULL; + g_autoptr(virJSONValue) mergeactions =3D virJSONValueNewArray(); + g_autoptr(virJSONValue) cleanupactions =3D virJSONValueNewArray(); + int rc =3D 0; + size_t ndisks =3D 0; + size_t i; + int ret =3D -1; + + if (qemuDomainObjBeginJob(driver, vm, QEMU_JOB_MODIFY) < 0) + return -1; + + if (virDomainObjCheckActive(vm) < 0) + goto endjob; + + if (!(blockNamedNodeData =3D qemuBlockGetNamedNodeData(vm, QEMU_ASYNC_= JOB_NONE))) + goto endjob; + + /* enumerate disks relevant for the checkpoint which are also present = in the + * domain */ + diskmap =3D g_new0(struct qemuCheckpointDiskMap, chkdef->ndisks); + + for (i =3D 0; i < chkdef->ndisks; i++) { + virDomainCheckpointDiskDefPtr chkdisk =3D chkdef->disks + i; + virDomainDiskDefPtr domdisk; + + chkdisk->size =3D 0; + chkdisk->sizeValid =3D false; + + if (chkdisk->type !=3D VIR_DOMAIN_CHECKPOINT_TYPE_BITMAP) + continue; + + if (!(domdisk =3D virDomainDiskByTarget(vm->def, chkdisk->name))) + continue; + + if (!qemuBlockBitmapChainIsValid(domdisk->src, chkdef->parent.name= , blockNamedNodeData)) + continue; + + diskmap[ndisks].chkdisk =3D chkdisk; + diskmap[ndisks].domdisk =3D domdisk; + ndisks++; + } + + if (ndisks =3D=3D 0) { + ret =3D 0; + goto endjob; + } + + /* we need to calculate the merged bitmap to obtain accurate data */ + for (i =3D 0; i < ndisks; i++) { + virDomainDiskDefPtr domdisk =3D diskmap[i].domdisk; + g_autoptr(virJSONValue) actions =3D NULL; + + /* possibly delete leftovers from previous cases */ + if (qemuBlockNamedNodeDataGetBitmapByName(blockNamedNodeData, domd= isk->src, + "libvirt-tmp-size-xml"))= { + if (!recoveractions) + recoveractions =3D virJSONValueNewArray(); + + if (qemuMonitorTransactionBitmapRemove(recoveractions, + domdisk->src->nodeforma= t, + "libvirt-tmp-size-xml")= < 0) + goto endjob; + } + + if (qemuBlockGetBitmapMergeActions(domdisk->src, NULL, domdisk->sr= c, + chkdef->parent.name, "libvirt-t= mp-size-xml", + NULL, &actions, blockNamedNodeD= ata) < 0) + goto endjob; + + if (virJSONValueArrayConcat(mergeactions, actions) < 0) + goto endjob; + + if (qemuMonitorTransactionBitmapRemove(cleanupactions, + domdisk->src->nodeformat, + "libvirt-tmp-size-xml") < 0) + goto endjob; + } + + qemuDomainObjEnterMonitor(driver, vm); + + if (rc =3D=3D 0 && recoveractions) + rc =3D qemuMonitorTransaction(priv->mon, &recoveractions); + + if (rc =3D=3D 0) + rc =3D qemuMonitorTransaction(priv->mon, &mergeactions); + + if (qemuDomainObjExitMonitor(driver, vm) < 0 || rc < 0) + goto endjob; + + /* now do a final refresh */ + virHashFree(blockNamedNodeData); + if (!(blockNamedNodeData =3D qemuBlockGetNamedNodeData(vm, QEMU_ASYNC_= JOB_NONE))) + goto endjob; + + qemuDomainObjEnterMonitor(driver, vm); + + rc =3D qemuMonitorTransaction(priv->mon, &cleanupactions); + + if (qemuDomainObjExitMonitor(driver, vm) < 0 || rc < 0) + goto endjob; + + /* update disks */ + for (i =3D 0; i < ndisks; i++) { + virDomainCheckpointDiskDefPtr chkdisk =3D diskmap[i].chkdisk; + virDomainDiskDefPtr domdisk =3D diskmap[i].domdisk; + qemuBlockNamedNodeDataBitmapPtr bitmap; + + if ((bitmap =3D qemuBlockNamedNodeDataGetBitmapByName(blockNamedNo= deData, domdisk->src, + "libvirt-tmp-s= ize-xml"))) { + chkdisk->size =3D bitmap->dirtybytes; + chkdisk->sizeValid =3D true; + } + } + + ret =3D 0; + + endjob: + qemuDomainObjEndJob(driver, vm); + return ret; +} + + char * qemuCheckpointGetXMLDesc(virDomainObjPtr vm, virDomainCheckpointPtr checkpoint, @@ -579,13 +715,18 @@ qemuCheckpointGetXMLDesc(virDomainObjPtr vm, unsigned int format_flags; virCheckFlags(VIR_DOMAIN_CHECKPOINT_XML_SECURE | - VIR_DOMAIN_CHECKPOINT_XML_NO_DOMAIN, NULL); + VIR_DOMAIN_CHECKPOINT_XML_NO_DOMAIN | + VIR_DOMAIN_CHECKPOINT_XML_SIZE, NULL); if (!(chk =3D qemuCheckpointObjFromCheckpoint(vm, checkpoint))) return NULL; chkdef =3D virDomainCheckpointObjGetDef(chk); + if (flags & VIR_DOMAIN_CHECKPOINT_XML_SIZE && + qemuCheckpointGetXMLDescUpdateSize(vm, chkdef) < 0) + return NULL; + format_flags =3D virDomainCheckpointFormatConvertXMLFlags(flags); return virDomainCheckpointDefFormat(chkdef, driver->xmlopt, format_flags); --=20 2.26.2