From nobody Mon Feb 9 01:20:52 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of redhat.com designates 216.205.24.124 as permitted sender) client-ip=216.205.24.124; envelope-from=libvir-list-bounces@redhat.com; helo=us-smtp-delivery-124.mimecast.com; Authentication-Results: mx.zohomail.com; spf=pass (zohomail.com: domain of redhat.com designates 216.205.24.124 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=fail(p=none dis=none) header.from=gmail.com ARC-Seal: i=1; a=rsa-sha256; t=1616633733; cv=none; d=zohomail.com; s=zohoarc; b=WI86OL2LXSvWHKqe9m5+K+10MzMHmyJ5OBM34yF4Pg5iRY+7CNMfVeo+NBzZRe9onJe6tcQVxhgItIN8dhGMTtb8EpH37yRH2SLzC+APwlSuvaWBwk7+ee6P+9hOPdGVVe0QUJ7cYzjF/MOOJ6jOpDyTNSEXVWFBgHtYK3c8NKs= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1616633733; h=Content-Type:Content-Transfer-Encoding:Cc: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=zDtOQ8S/CLWIvsWFUTemB1i1sPv4Gw/ICTfgLyP7480=; b=AIUzCTw8I9O2wAlcRuDvJVkt859c2Wl49FOJWl1U8JiMa1FbuSJ9JalVYkWYiKgS/8Pp3hyrFxj/KLLqRzmM55FLI/0olLd5M/NJIcewWVja1iLw7chWN/Eji196hMTde+02qQiF4mLj+TRP8nOujpj52qnzlnzi6Js4Nh8KFoE= ARC-Authentication-Results: i=1; mx.zohomail.com; spf=pass (zohomail.com: domain of redhat.com designates 216.205.24.124 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [216.205.24.124]) by mx.zohomail.com with SMTPS id 1616633733420353.3359104894638; Wed, 24 Mar 2021 17:55:33 -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-485-fL9fA41HMDOuEseA2neRag-1; Wed, 24 Mar 2021 20:55:29 -0400 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 51B8987A83A; Thu, 25 Mar 2021 00:55:23 +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 272165FCB2; Thu, 25 Mar 2021 00:55:23 +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 D3ADA4A700; Thu, 25 Mar 2021 00:55:22 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.rdu2.redhat.com [10.11.54.5]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id 12P0t25H024542 for ; Wed, 24 Mar 2021 20:55:02 -0400 Received: by smtp.corp.redhat.com (Postfix) id 1323DF5196; Thu, 25 Mar 2021 00:55:02 +0000 (UTC) Received: from mimecast-mx02.redhat.com (mimecast03.extmail.prod.ext.rdu2.redhat.com [10.11.55.19]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 0D0A2F51A1 for ; Thu, 25 Mar 2021 00:54:59 +0000 (UTC) Received: from us-smtp-1.mimecast.com (us-smtp-1.mimecast.com [207.211.31.81]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 4C38B811E7A for ; Thu, 25 Mar 2021 00:54:59 +0000 (UTC) Received: from mail-qk1-f178.google.com (mail-qk1-f178.google.com [209.85.222.178]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-129-YWZHP5F-MXSn55i5N6H0ig-1; Wed, 24 Mar 2021 20:54:57 -0400 Received: by mail-qk1-f178.google.com with SMTP id y5so242874qkl.9 for ; Wed, 24 Mar 2021 17:54:57 -0700 (PDT) Received: from localhost (209-6-122-159.s2973.c3-0.arl-cbr1.sbo-arl.ma.cable.rcncustomer.com. [209.6.122.159]) by smtp.gmail.com with ESMTPSA id h14sm2497063qtx.64.2021.03.24.17.54.56 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Wed, 24 Mar 2021 17:54:56 -0700 (PDT) X-MC-Unique: fL9fA41HMDOuEseA2neRag-1 X-MC-Unique: YWZHP5F-MXSn55i5N6H0ig-1 X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=zDtOQ8S/CLWIvsWFUTemB1i1sPv4Gw/ICTfgLyP7480=; b=oTIV72XlCwA9aDvoF1zoFUwY7Fzqwi/W2GXCHqm/MhdFaNoQ+7tIKWwNlE4mRwOknl 7LVxOQ6vQoJE4KwWRnp0xFXiz2bxFCeI07dItcmoIIymQMei21os1BnVLzKKfailA4Re AxOcPzB+h4Vx32GcLYAIFt6NqX7eOP+fWC8jQgKW+A+qljuIzGMqraLJGyBU5REX7O0G 1IvDEN9V0mFb7+Q+QK+CW9SKl0gzlLPFff6nLjWy86/wGUNy48cB7s3/y/rwH+MO5tjD jChcY5cDsuO2EYTDiJIv5o+OXXTiYm6ixYLK/e/DGEczeUMTRmAs4Ra6dFu+MKrGnG1l +bsg== X-Gm-Message-State: AOAM530KE7mBcSyl0x6k+FMmlGjFLNJH04HDXrWUOPjqn0bGGLE30HN6 bpTsF7WPoismTi/beTFvZgjQ67X+CQ== X-Google-Smtp-Source: ABdhPJzrvr1fqLrnX9zcA3GevxnSHqa4lHNX1osdjjE3oaAmyWNh+688nYpictyih0j7F9+oVBiI1Q== X-Received: by 2002:a37:ae04:: with SMTP id x4mr5877703qke.245.1616633696695; Wed, 24 Mar 2021 17:54:56 -0700 (PDT) From: Masayoshi Mizuma To: libvir-list@redhat.com Subject: [PATCH 01/10] qemu_hotplug: Add transient disk hotplug support Date: Wed, 24 Mar 2021 20:54:05 -0400 Message-Id: <20210325005414.275401-2-msys.mizuma@gmail.com> In-Reply-To: <20210325005414.275401-1-msys.mizuma@gmail.com> References: <20210325005414.275401-1-msys.mizuma@gmail.com> MIME-Version: 1.0 X-Mimecast-Impersonation-Protect: Policy=CLT - Impersonation Protection Definition; Similar Internal Domain=false; Similar Monitored External Domain=false; Custom External Domain=false; Mimecast External Domain=false; Newly Observed Domain=false; Internal User Name=false; Custom Display Name List=false; Reply-to Address Mismatch=false; Targeted Threat Dictionary=false; Mimecast Threat Dictionary=false; Custom Threat Dictionary=false X-Scanned-By: MIMEDefang 2.79 on 10.11.54.5 X-loop: libvir-list@redhat.com Cc: Masayoshi Mizuma , Masayoshi Mizuma 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 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 Content-Type: text/plain; charset="utf-8" From: Masayoshi Mizuma Enable disk option for qemuDomainAttachDeviceDiskLive(). The disk hotplug works for virtio or scsi bus. Signed-off-by: Masayoshi Mizuma --- src/qemu/qemu_hotplug.c | 135 +++++++++++++++++++++++++++++++++++++--- 1 file changed, 128 insertions(+), 7 deletions(-) diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c index 58d2abb862..138645260f 100644 --- a/src/qemu/qemu_hotplug.c +++ b/src/qemu/qemu_hotplug.c @@ -1025,6 +1025,111 @@ qemuDomainAttachUSBMassStorageDevice(virQEMUDriverP= tr driver, return 0; } =20 +static int +qemuHotplugDiskPrepareOneBlockdev(virQEMUDriverPtr driver, + virDomainObjPtr vm, + virQEMUDriverConfigPtr cfg, + virDomainDiskDefPtr disk, + virStorageSourcePtr transrc, + qemuDomainAsyncJob asyncJob, + bool *created) +{ + qemuDomainObjPrivatePtr priv =3D vm->privateData; + g_autoptr(qemuBlockStorageSourceChainData) data =3D NULL; + g_autoptr(virStorageSource) terminator =3D NULL; + + terminator =3D virStorageSourceNew(); + + if (qemuDomainPrepareStorageSourceBlockdev(disk, transrc, + priv, cfg) < 0) + return -1; + + if (!(data =3D qemuBuildStorageSourceChainAttachPrepareBlockdevTop(tra= nsrc, + termi= nator, + priv-= >qemuCaps))) + return -1; + + transrc->capacity =3D disk->src->capacity; + + if (qemuBlockStorageSourceCreate(vm, transrc, disk->src, + NULL, data->srcdata[0], + asyncJob) < 0) + goto error; + + if (qemuBlockStorageSourceDetachOneBlockdev(driver, vm, + asyncJob, transrc) < 0) + goto error; + + *created =3D true; + + return 0; + + error: + qemuBlockStorageSourceAttachRollback(priv->mon, data->srcdata[0]); + virStorageSourceUnlink(transrc); + + return -1; +} + + +static int +qemuHotplugDiskPrepareOneDiskTransient(virQEMUDriverPtr driver, + virDomainObjPtr vm, + virDomainDeviceDefPtr dev, + bool *created) +{ + g_autoptr(virQEMUDriverConfig) cfg =3D virQEMUDriverGetConfig(driver); + virDomainDiskDefPtr disk =3D dev->data.disk; + virStorageSourcePtr origsrc =3D disk->src; + virStorageSourcePtr transrc; + bool supportsCreate; + + transrc =3D virStorageSourceNew(); + transrc->type =3D VIR_STORAGE_TYPE_FILE; + transrc->format =3D VIR_STORAGE_FILE_QCOW2; + transrc->path =3D g_strdup_printf("%s.TRANSIENT-%s", + disk->src->path, vm->def->name); + + if (virFileExists(transrc->path)) { + virReportError(VIR_ERR_OPERATION_UNSUPPORTED, + _("Overlay file '%s' for transient disk '%s' alread= y exists"), + transrc->path, disk->dst); + return -1; + } + + if (qemuDomainStorageSourceValidateDepth(transrc, 1, disk->dst) < 0) + return -1; + + if (virStorageSourceInitChainElement(transrc, disk->src, false) < 0) + return -1; + + supportsCreate =3D virStorageSourceSupportsCreate(transrc); + + if (supportsCreate) { + if (qemuDomainStorageFileInit(driver, vm, transrc, NULL) < 0) + return -1; + + if (virStorageSourceCreate(transrc) < 0) { + virReportSystemError(errno, _("failed to create image file '%s= '"), + NULLSTR(transrc->path)); + return -1; + } + } + + if (qemuDomainStorageSourceAccessAllow(driver, vm, transrc, + false, true, true) < 0) + return -1; + + if (qemuHotplugDiskPrepareOneBlockdev(driver, vm, cfg, disk, transrc, + QEMU_ASYNC_JOB_NONE, created) < = 0) + return -1; + + transrc->backingStore =3D origsrc; + disk->src =3D transrc; + + return 0; +} + =20 static int qemuDomainAttachDeviceDiskLiveInternal(virQEMUDriverPtr driver, @@ -1033,7 +1138,9 @@ qemuDomainAttachDeviceDiskLiveInternal(virQEMUDriverP= tr driver, { size_t i; virDomainDiskDefPtr disk =3D dev->data.disk; + virDomainDiskBus bus; int ret =3D -1; + bool transientDiskCreated =3D false; =20 if (disk->device =3D=3D VIR_DOMAIN_DISK_DEVICE_CDROM || disk->device =3D=3D VIR_DOMAIN_DISK_DEVICE_FLOPPY) { @@ -1042,12 +1149,6 @@ qemuDomainAttachDeviceDiskLiveInternal(virQEMUDriver= Ptr driver, return -1; } =20 - if (disk->transient) { - virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s", - _("transient disk hotplug isn't supported")); - return -1; - } - if (virDomainDiskTranslateSourcePool(disk) < 0) goto cleanup; =20 @@ -1060,6 +1161,21 @@ qemuDomainAttachDeviceDiskLiveInternal(virQEMUDriver= Ptr driver, if (qemuDomainDetermineDiskChain(driver, vm, disk, NULL, true) < 0) goto cleanup; =20 + if (disk->transient) { + bus =3D (virDomainDiskBus) disk->bus; + + if ((bus !=3D VIR_DOMAIN_DISK_BUS_VIRTIO) && + (bus !=3D VIR_DOMAIN_DISK_BUS_SCSI)) { + virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s", + _("transient disk hotplug isn't supported")= ); + goto cleanup; + } + + if (qemuHotplugDiskPrepareOneDiskTransient(driver, vm, dev, + &transientDiskCreated) = < 0) + goto cleanup; + } + for (i =3D 0; i < vm->def->ndisks; i++) { if (virDomainDiskDefCheckDuplicateInfo(vm->def->disks[i], disk) < = 0) goto cleanup; @@ -1099,8 +1215,13 @@ qemuDomainAttachDeviceDiskLiveInternal(virQEMUDriver= Ptr driver, } =20 cleanup: - if (ret !=3D 0) + if (ret !=3D 0) { ignore_value(qemuRemoveSharedDevice(driver, dev, vm->def->name)); + if (transientDiskCreated) { + VIR_DEBUG("Removing transient disk %s", disk->src->path); + virStorageSourceUnlink(disk->src); + } + } return ret; } =20 --=20 2.27.0