From nobody Fri Dec 19 18:46:35 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=1574804454; cv=none; d=zohomail.com; s=zohoarc; b=GS+gZd2XSW/MexPBh3Z3p3X20GCntw0c9cZeqPpqxX/YXMN9hL8VmN6eazYzNPPG1enmCJVcjdQ3LrjkGYw61L7k1H9P0keu4twXP1l9lF1s1LCiaE4RPQ5GkMc1AEHtPi80XNsCkjtYuqu/yoTbY3GvGvJEjPTd/ni7nSdfUDI= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1574804454; 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=YDlulf5pkrFrqwopDhGHoBBPUzhP+VeO7GzJberlhew=; b=g4/uAqIea2nzGt9wBtTvU/yWa15HvBZWNWxn1nSHvaZYYCmNcZOJ+J13Ly3a0O5fkPne5qo5hxSgWBuuFkUWP8a27c96/MvnA7grcX5s4scJJmXlf63cLY6I3Fl6I+834LP6ytKNtlP9c1+luI6wTpeuytO7NIelmfmNTofePqU= 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-1.mimecast.com [207.211.31.81]) by mx.zohomail.com with SMTPS id 1574804454836450.75578399627216; Tue, 26 Nov 2019 13:40:54 -0800 (PST) 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-175-EXExQ-13MKOfqik6W9EAAA-1; Tue, 26 Nov 2019 16:40:51 -0500 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 mimecast-mx01.redhat.com (Postfix) with ESMTPS id 7D443106BBE0; Tue, 26 Nov 2019 21:40:44 +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 5442060C63; Tue, 26 Nov 2019 21:40:44 +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 13FDA4E57B; Tue, 26 Nov 2019 21:40:44 +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 xAQLeMl9027911 for ; Tue, 26 Nov 2019 16:40:22 -0500 Received: by smtp.corp.redhat.com (Postfix) id D71CD600CE; Tue, 26 Nov 2019 21:40:22 +0000 (UTC) Received: from angien.redhat.com (unknown [10.43.2.48]) by smtp.corp.redhat.com (Postfix) with ESMTP id 5EA0E600C8 for ; Tue, 26 Nov 2019 21:40:22 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1574804453; 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=YDlulf5pkrFrqwopDhGHoBBPUzhP+VeO7GzJberlhew=; b=BeZsYdXPuIDaSX++NeZQzRmUW2yJxYqU7/48gaTBX2NIvTSdcZwJ6vYB9nSpZACLFBbnKn DbE4hsioEWB7oxfCFCDbQIcoOQtihCow7/RqB9b2/q7PnYdkHnwItKZ+4mnwopngyZIthm A5GlJ9OgdT33YsSEkJtrSS/aPb+0qJU= From: Peter Krempa To: libvir-list@redhat.com Date: Tue, 26 Nov 2019 22:40:00 +0100 Message-Id: <3e6a22a86c6221200aec8e3a2978908beeae95fb.1574803736.git.pkrempa@redhat.com> In-Reply-To: References: MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11 X-loop: libvir-list@redhat.com Subject: [libvirt] [PATCH 14/21] qemu: blockjob: Track internal data for 'backup' blockjob 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.12 X-MC-Unique: EXExQ-13MKOfqik6W9EAAA-1 X-Mimecast-Spam-Score: 0 Content-Transfer-Encoding: quoted-printable X-ZohoMail-DKIM: pass (identity @redhat.com) Content-Type: text/plain; charset="utf-8" A backup blockjob needs to be able to notify the parent backup job as well as track all data to be able to clean up the bitmap and blockdev used for the backup. Add the data structure, job allocation function and status XML formatter and parser. Signed-off-by: Peter Krempa --- src/qemu/qemu_blockjob.c | 32 +++++++++++++++++++++++++++++++- src/qemu/qemu_blockjob.h | 16 ++++++++++++++++ src/qemu/qemu_domain.c | 13 +++++++++++++ 3 files changed, 60 insertions(+), 1 deletion(-) diff --git a/src/qemu/qemu_blockjob.c b/src/qemu/qemu_blockjob.c index eafad0432c..8dbb09c30a 100644 --- a/src/qemu/qemu_blockjob.c +++ b/src/qemu/qemu_blockjob.c @@ -77,8 +77,12 @@ qemuBlockJobDataDisposeJobdata(qemuBlockJobDataPtr job) { if (job->type =3D=3D QEMU_BLOCKJOB_TYPE_CREATE) virObjectUnref(job->data.create.src); -} + if (job->type =3D=3D QEMU_BLOCKJOB_TYPE_BACKUP) { + virObjectUnref(job->data.backup.store); + g_free(job->data.backup.bitmap); + } +} static void qemuBlockJobDataDispose(void *obj) @@ -369,6 +373,32 @@ qemuBlockJobDiskNewCopy(virDomainObjPtr vm, } +qemuBlockJobDataPtr +qemuBlockJobDiskNewBackup(virDomainObjPtr vm, + virDomainDiskDefPtr disk, + virStorageSourcePtr store, + const char *bitmap) +{ + g_autoptr(qemuBlockJobData) job =3D NULL; + g_autofree char *jobname =3D NULL; + + jobname =3D g_strdup_printf("backup-%s-%s", disk->dst, disk->src->node= format); + + if (!(job =3D qemuBlockJobDataNew(QEMU_BLOCKJOB_TYPE_BACKUP, jobname))) + return NULL; + + job->data.backup.bitmap =3D g_strdup(bitmap); + job->data.backup.store =3D virObjectRef(store); + + /* backup jobs are usually started in bulk by transaction so the caller + * shall save the status XML */ + if (qemuBlockJobRegister(job, vm, disk, false) < 0) + return NULL; + + return g_steal_pointer(&job); +} + + /** * qemuBlockJobDiskGetJob: * @disk: disk definition diff --git a/src/qemu/qemu_blockjob.h b/src/qemu/qemu_blockjob.h index 4734984c99..bfae410d14 100644 --- a/src/qemu/qemu_blockjob.h +++ b/src/qemu/qemu_blockjob.h @@ -107,6 +107,15 @@ struct _qemuBlockJobCopyData { }; +typedef struct _qemuBlockJobBackupData qemuBlockJobBackupData; +typedef qemuBlockJobBackupData *qemuBlockJobDataBackupPtr; + +struct _qemuBlockJobBackupData { + virStorageSourcePtr store; + char *bitmap; +}; + + typedef struct _qemuBlockJobData qemuBlockJobData; typedef qemuBlockJobData *qemuBlockJobDataPtr; @@ -124,6 +133,7 @@ struct _qemuBlockJobData { qemuBlockJobCommitData commit; qemuBlockJobCreateData create; qemuBlockJobCopyData copy; + qemuBlockJobBackupData backup; } data; int type; /* qemuBlockJobType */ @@ -184,6 +194,12 @@ qemuBlockJobDiskNewCopy(virDomainObjPtr vm, bool shallow, bool reuse); +qemuBlockJobDataPtr +qemuBlockJobDiskNewBackup(virDomainObjPtr vm, + virDomainDiskDefPtr disk, + virStorageSourcePtr store, + const char *bitmap); + qemuBlockJobDataPtr qemuBlockJobDiskGetJob(virDomainDiskDefPtr disk) ATTRIBUTE_NONNULL(1); diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index a4c9ac11be..94d291e881 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -2608,6 +2608,14 @@ qemuDomainObjPrivateXMLFormatBlockjobIterator(void *= payload, break; case QEMU_BLOCKJOB_TYPE_BACKUP: + virBufferEscapeString(&childBuf, "\n", jo= b->data.backup.bitmap); + if (job->data.backup.store && + qemuDomainObjPrivateXMLFormatBlockjobFormatSource(&childBu= f, + "store", + job->dat= a.backup.store, + data->xm= lopt, + false) <= 0) + return -1; break; case QEMU_BLOCKJOB_TYPE_BROKEN: @@ -3199,6 +3207,11 @@ qemuDomainObjPrivateXMLParseBlockjobDataSpecific(qem= uBlockJobDataPtr job, break; case QEMU_BLOCKJOB_TYPE_BACKUP: + job->data.backup.bitmap =3D virXPathString("string(./bitmap/@= name)", ctxt); + + if (!(tmp =3D virXPathNode("./store", ctxt)) || + !(job->data.backup.store =3D qemuDomainObjPrivateXMLParseB= lockjobChain(tmp, ctxt, xmlopt))) + goto broken; break; case QEMU_BLOCKJOB_TYPE_BROKEN: --=20 2.23.0 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list