From nobody Wed Feb 11 06:16:03 2026 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.zoho.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 1493965380855153.7963289808822; Thu, 4 May 2017 23:23:00 -0700 (PDT) Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.phx2.redhat.com [10.5.11.15]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 260EA61BB8; Fri, 5 May 2017 06:22:59 +0000 (UTC) Received: from colo-mx.corp.redhat.com (unknown [10.5.11.21]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 665E977C9B; Fri, 5 May 2017 06:22:58 +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 31EE94EBD7; Fri, 5 May 2017 06:22:55 +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 v456Mrq0021810 for ; Fri, 5 May 2017 02:22:53 -0400 Received: by smtp.corp.redhat.com (Postfix) id B309A7FB44; Fri, 5 May 2017 06:22:53 +0000 (UTC) Received: from mx1.redhat.com (ext-mx10.extmail.prod.ext.phx2.redhat.com [10.5.110.39]) by smtp.corp.redhat.com (Postfix) with ESMTPS id AC29A7FB49 for ; Fri, 5 May 2017 06:22:52 +0000 (UTC) Received: from relay.sw.ru (mailhub.sw.ru [195.214.232.25]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 995B261BB8 for ; Fri, 5 May 2017 06:22:49 +0000 (UTC) Received: from dim-vz7.qa.sw.ru (msk-vpn.virtuozzo.com [195.214.232.6]) by relay.sw.ru (8.13.4/8.13.4) with ESMTP id v456MlhE011727 for ; Fri, 5 May 2017 09:22:48 +0300 (MSK) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 260EA61BB8 Authentication-Results: ext-mx10.extmail.prod.ext.phx2.redhat.com; dmarc=fail (p=none dis=none) header.from=virtuozzo.com Authentication-Results: ext-mx10.extmail.prod.ext.phx2.redhat.com; spf=pass smtp.mailfrom=libvir-list-bounces@redhat.com DKIM-Filter: OpenDKIM Filter v2.11.0 mx1.redhat.com 260EA61BB8 DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 995B261BB8 Authentication-Results: ext-mx10.extmail.prod.ext.phx2.redhat.com; dmarc=pass (p=none dis=none) header.from=virtuozzo.com Authentication-Results: ext-mx10.extmail.prod.ext.phx2.redhat.com; spf=pass smtp.mailfrom=nshirokovskiy@virtuozzo.com DKIM-Filter: OpenDKIM Filter v2.11.0 mx1.redhat.com 995B261BB8 From: Nikolay Shirokovskiy To: libvir-list@redhat.com Date: Fri, 5 May 2017 09:22:30 +0300 Message-Id: <1493965351-117429-10-git-send-email-nshirokovskiy@virtuozzo.com> In-Reply-To: <1493965351-117429-1-git-send-email-nshirokovskiy@virtuozzo.com> References: <1493965351-117429-1-git-send-email-nshirokovskiy@virtuozzo.com> X-Greylist: IP, sender and recipient auto-whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.39]); Fri, 05 May 2017 06:22:50 +0000 (UTC) X-Greylist: inspected by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.39]); Fri, 05 May 2017 06:22:50 +0000 (UTC) for IP:'195.214.232.25' DOMAIN:'mailhub.sw.ru' HELO:'relay.sw.ru' FROM:'nshirokovskiy@virtuozzo.com' RCPT:'' X-RedHat-Spam-Score: 0.799 (BAYES_50, SPF_PASS) 195.214.232.25 mailhub.sw.ru 195.214.232.25 mailhub.sw.ru X-Scanned-By: MIMEDefang 2.78 on 10.5.110.39 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11 X-loop: libvir-list@redhat.com Subject: [libvirt] [RFC PATCH REBASE 09/10] qemu: backup: prepare backup destination 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.15 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.39]); Fri, 05 May 2017 06:22:59 +0000 (UTC) X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" Prepare here is usual preparation for a disk to be used by qemu made by qemuDomainDiskChainElementPrepare. That is set security labels, add to lock manager and whitelist in cgroups. All three are related to backup target too. Adding to a lock manager is less obvious but can be useful if mirations with a running backup will be possible. Also create file in case of backup to file if it is not exist in order to set securitly labels etc. --- src/qemu/qemu_driver.c | 58 ++++++++++++++++++++++++++++++++++++++++++++++= ++-- 1 file changed, 56 insertions(+), 2 deletions(-) diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index dd1cf6a..68747f1 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -20449,8 +20449,17 @@ qemuDomainSetBlockThreshold(virDomainPtr dom, } =20 =20 +typedef struct _qemuDomainBackupDiskTrackInfo qemuDomainBackupDiskTrackInf= o; +typedef qemuDomainBackupDiskTrackInfo *qemuDomainBackupDiskTrackInfoPtr; +struct _qemuDomainBackupDiskTrackInfo { + bool created; + bool prepared; +}; + + static int -qemuDomainBackupCheckTarget(virDomainBackupDiskDefPtr disk) +qemuDomainBackupCheckTarget(virDomainBackupDiskDefPtr disk, + bool *created) { int ret =3D -1; struct stat st; @@ -20468,6 +20477,12 @@ qemuDomainBackupCheckTarget(virDomainBackupDiskDef= Ptr disk) } switch (target->type) { case VIR_STORAGE_TYPE_FILE: + if (virStorageFileCreate(target) < 0) { + virReportSystemError(errno, _("failed to create image file= '%s'"), + target->path); + goto cleanup; + } + *created =3D true; break; =20 case VIR_STORAGE_TYPE_BLOCK: @@ -20519,6 +20534,22 @@ qemuDomainBackupCheckTarget(virDomainBackupDiskDef= Ptr disk) } =20 =20 +static void +qemuDomainBackupDiskUnlink(virDomainBackupDiskDefPtr disk) +{ + virStorageSourcePtr target =3D disk->target; + + if (virStorageFileInit(target) < 0) + return; + + if (virStorageFileUnlink(target) < 0) + VIR_WARN("unable to unlink target path '%s' for disk '%s', errno: = %d", + target->path, disk->name, errno); + + virStorageFileDeinit(target); +} + + static virDomainBackupPtr qemuDomainBackupCreateXML(virDomainPtr domain, const char *xmlDesc, @@ -20531,6 +20562,7 @@ qemuDomainBackupCreateXML(virDomainPtr domain, virDomainBackupPtr ret =3D NULL; virJSONValuePtr actions =3D NULL; virDomainObjPtr vm =3D NULL; + qemuDomainBackupDiskTrackInfoPtr track_disks =3D NULL; char *path =3D NULL, *device =3D NULL; bool job =3D false; int rc; @@ -20563,6 +20595,9 @@ qemuDomainBackupCreateXML(virDomainPtr domain, if (!(actions =3D virJSONValueNewArray())) goto cleanup; =20 + if (VIR_ALLOC_N(track_disks, def->ndisks) < 0) + goto cleanup; + for (i =3D 0; i < def->ndisks; i++) { virStorageSourcePtr target =3D def->disks[i].target; virDomainDiskDefPtr disk =3D def->disks[i].vmdisk; @@ -20580,9 +20615,15 @@ qemuDomainBackupCreateXML(virDomainPtr domain, if (qemuDomainDiskBlockJobIsActive(disk)) goto cleanup; =20 - if (qemuDomainBackupCheckTarget(&def->disks[i]) < 0) + if (qemuDomainBackupCheckTarget(&def->disks[i], + &track_disks[i].created) < 0) goto cleanup; =20 + if (qemuDomainDiskChainElementPrepare(driver, vm, def->disks[i].ta= rget, + false) < 0) + goto cleanup; + track_disks[i].prepared =3D true; + if (qemuGetDriveSourceString(target, NULL, &path) < 0) goto cleanup; =20 @@ -20616,11 +20657,24 @@ qemuDomainBackupCreateXML(virDomainPtr domain, QEMU_DOMAIN_DISK_PRIVATE(def->disks->vmdisk)->blockjob =3D true; =20 cleanup: + if (!ret && track_disks) { + for (i =3D 0; i < def->ndisks; i++) { + virDomainBackupDiskDefPtr backup_disk =3D &def->disks[i]; + + if (track_disks[i].prepared) + qemuDomainDiskChainElementRevoke(driver, vm, + backup_disk->target); + if (track_disks[i].created) + qemuDomainBackupDiskUnlink(backup_disk); + } + } + if (job) qemuDomainObjEndJob(driver, vm); =20 VIR_FREE(path); VIR_FREE(device); + VIR_FREE(track_disks); =20 virDomainBackupDefFree(def); virJSONValueFree(actions); --=20 1.8.3.1 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list