From nobody Mon Feb 9 12:29:28 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.zohomail.com; spf=pass (zoho.com: domain of redhat.com designates 209.132.183.28 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=1562250522; cv=none; d=zoho.com; s=zohoarc; b=knjVWhM0m3P5bQATAHA6tEUrC4jlfltAnkjvUVDoKAnUkJtj00iTLjGnm2q84+eed4Pn8D3ALAzVIy94MQaAk1XBDZpnwe2m3bgv6NC27K+CSX2QrmxYAKa+1PdHpFht65qmIE76cOTH3Ikbi8G69+KwLBFhAIt4LPW7uMMX0G4= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1562250522; 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:ARC-Authentication-Results; bh=xwdVL4acF1Lw/spNmlhSPYLS1mrXBqAjDF2QCW3hi/s=; b=XBu1gMddvI+5SuMB5e2ABPOK6wQn5VduXzu6u9IkmDNsJll/48I3WY4j+SdBpKXGuu0sw9vIuZ9Q08j41m8OlKD97R/5PTcXhfKOMpjhSxFb7JuFR1mHv6uUSUzW0F1O3ZnoR5oLNjeHS29Eea6Rx/ZDeEDObxe+goQeN+SoYJo= ARC-Authentication-Results: i=1; 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; dmarc=pass header.from= (p=none dis=none) header.from= Return-Path: Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by mx.zohomail.com with SMTPS id 1562250522146422.60601280850096; Thu, 4 Jul 2019 07:28:42 -0700 (PDT) Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.14]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 279EA307D913; Thu, 4 Jul 2019 14:28:33 +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 7F76D3794; Thu, 4 Jul 2019 14:28:28 +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 D2A5E1833002; Thu, 4 Jul 2019 14:28:20 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx08.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id x64EQek3029627 for ; Thu, 4 Jul 2019 10:26:40 -0400 Received: by smtp.corp.redhat.com (Postfix) id 081DA5B2FE; Thu, 4 Jul 2019 14:26:40 +0000 (UTC) Received: from angien.brq.redhat.com (unknown [10.43.2.229]) by smtp.corp.redhat.com (Postfix) with ESMTP id 38E205B2D2; Thu, 4 Jul 2019 14:26:39 +0000 (UTC) From: Peter Krempa To: libvir-list@redhat.com Date: Thu, 4 Jul 2019 16:26:25 +0200 Message-Id: <4886792fbc10961255a8878bc64443af20bcc58a.1562249939.git.pkrempa@redhat.com> In-Reply-To: References: MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.84 on 10.5.11.23 X-loop: libvir-list@redhat.com Cc: Kevin Wolf Subject: [libvirt] [PATCH 01/11] qemu: block: Allow skipping non-target related data when formating disk JSON 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: , 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.14 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.48]); Thu, 04 Jul 2019 14:28:40 +0000 (UTC) Content-Type: text/plain; charset="utf-8" When formatting new qcow2 images we need to provide the backing store string which should not contain any authentication or irelevant data. Add a flag for qemuBlockStorageSourceGetBackendProps which allows to skip the irrelevant data. Signed-off-by: Peter Krempa Reviewed-by: J=C3=A1n Tomko --- src/qemu/qemu_block.c | 121 ++++++++++++++++++++++++---------------- src/qemu/qemu_block.h | 3 +- src/qemu/qemu_command.c | 2 +- tests/qemublocktest.c | 4 +- 4 files changed, 79 insertions(+), 51 deletions(-) diff --git a/src/qemu/qemu_block.c b/src/qemu/qemu_block.c index 0a6522577d..771797989e 100644 --- a/src/qemu/qemu_block.c +++ b/src/qemu/qemu_block.c @@ -624,7 +624,8 @@ qemuBlockStorageSourceBuildHostsJSONInetSocketAddress(v= irStorageSourcePtr src) static virJSONValuePtr qemuBlockStorageSourceGetGlusterProps(virStorageSourcePtr src, - bool legacy) + bool legacy, + bool onlytarget) { VIR_AUTOPTR(virJSONValue) servers =3D NULL; VIR_AUTOPTR(virJSONValue) props =3D NULL; @@ -645,7 +646,8 @@ qemuBlockStorageSourceGetGlusterProps(virStorageSourceP= tr src, "a:server", &servers, NULL) < 0) return NULL; - if (src->debug && + if (!onlytarget && + src->debug && virJSONValueObjectAdd(props, "u:debug", src->debugLevel, NULL) < 0) return NULL; @@ -654,10 +656,12 @@ qemuBlockStorageSourceGetGlusterProps(virStorageSourc= ePtr src, static virJSONValuePtr -qemuBlockStorageSourceGetVxHSProps(virStorageSourcePtr src) +qemuBlockStorageSourceGetVxHSProps(virStorageSourcePtr src, + bool onlytarget) { const char *protocol =3D virStorageNetProtocolTypeToString(src->protoc= ol); VIR_AUTOPTR(virJSONValue) server =3D NULL; + const char *tlsAlias =3D src->tlsAlias; virJSONValuePtr ret =3D NULL; if (src->nhosts !=3D 1) { @@ -669,6 +673,9 @@ qemuBlockStorageSourceGetVxHSProps(virStorageSourcePtr = src) if (!(server =3D qemuBlockStorageSourceBuildJSONInetSocketAddress(&src= ->hosts[0]))) return NULL; + if (onlytarget) + tlsAlias =3D NULL; + /* VxHS disk specification example: * { driver:"vxhs", * tls-creds:"objvirtio-disk0_tls0", @@ -677,7 +684,7 @@ qemuBlockStorageSourceGetVxHSProps(virStorageSourcePtr = src) */ ignore_value(virJSONValueObjectCreate(&ret, "s:driver", protocol, - "S:tls-creds", src->tlsAlias, + "S:tls-creds", tlsAlias, "s:vdisk-id", src->path, "a:server", &server, NULL)); @@ -686,7 +693,8 @@ qemuBlockStorageSourceGetVxHSProps(virStorageSourcePtr = src) static virJSONValuePtr -qemuBlockStorageSourceGetCURLProps(virStorageSourcePtr src) +qemuBlockStorageSourceGetCURLProps(virStorageSourcePtr src, + bool onlytarget) { qemuDomainStorageSourcePrivatePtr srcPriv =3D QEMU_DOMAIN_STORAGE_SOUR= CE_PRIVATE(src); const char *passwordalias =3D NULL; @@ -716,7 +724,7 @@ qemuBlockStorageSourceGetCURLProps(virStorageSourcePtr = src) if (!(uristr =3D virURIFormat(uri))) return NULL; - if (src->auth) { + if (!onlytarget && src->auth) { username =3D src->auth->username; passwordalias =3D srcPriv->secinfo->s.aes.alias; } @@ -733,7 +741,8 @@ qemuBlockStorageSourceGetCURLProps(virStorageSourcePtr = src) static virJSONValuePtr -qemuBlockStorageSourceGetISCSIProps(virStorageSourcePtr src) +qemuBlockStorageSourceGetISCSIProps(virStorageSourcePtr src, + bool onlytarget) { qemuDomainStorageSourcePrivatePtr srcPriv =3D QEMU_DOMAIN_STORAGE_SOUR= CE_PRIVATE(src); const char *protocol =3D virStorageNetProtocolTypeToString(src->protoc= ol); @@ -781,7 +790,7 @@ qemuBlockStorageSourceGetISCSIProps(virStorageSourcePtr= src) return NULL; } - if (src->auth) { + if (!onlytarget && src->auth) { username =3D src->auth->username; objalias =3D srcPriv->secinfo->s.aes.alias; } @@ -801,9 +810,11 @@ qemuBlockStorageSourceGetISCSIProps(virStorageSourcePt= r src) static virJSONValuePtr -qemuBlockStorageSourceGetNBDProps(virStorageSourcePtr src) +qemuBlockStorageSourceGetNBDProps(virStorageSourcePtr src, + bool onlytarget) { VIR_AUTOPTR(virJSONValue) serverprops =3D NULL; + const char *tlsAlias =3D src->tlsAlias; virJSONValuePtr ret =3D NULL; if (src->nhosts !=3D 1) { @@ -817,11 +828,14 @@ qemuBlockStorageSourceGetNBDProps(virStorageSourcePtr= src) if (!serverprops) return NULL; + if (onlytarget) + tlsAlias =3D NULL; + if (virJSONValueObjectCreate(&ret, "s:driver", "nbd", "a:server", &serverprops, "S:export", src->path, - "S:tls-creds", src->tlsAlias, + "S:tls-creds", tlsAlias, NULL) < 0) return NULL; @@ -830,7 +844,8 @@ qemuBlockStorageSourceGetNBDProps(virStorageSourcePtr s= rc) static virJSONValuePtr -qemuBlockStorageSourceGetRBDProps(virStorageSourcePtr src) +qemuBlockStorageSourceGetRBDProps(virStorageSourcePtr src, + bool onlytarget) { qemuDomainStorageSourcePrivatePtr srcPriv =3D QEMU_DOMAIN_STORAGE_SOUR= CE_PRIVATE(src); VIR_AUTOPTR(virJSONValue) servers =3D NULL; @@ -844,7 +859,7 @@ qemuBlockStorageSourceGetRBDProps(virStorageSourcePtr s= rc) !(servers =3D qemuBlockStorageSourceBuildHostsJSONInetSocketAddres= s(src))) return NULL; - if (src->auth) { + if (!onlytarget && src->auth) { username =3D srcPriv->secinfo->s.aes.username; keysecret =3D srcPriv->secinfo->s.aes.alias; /* the auth modes are modelled after our old command line generato= r */ @@ -943,16 +958,14 @@ qemuBlockStorageSourceGetSshProps(virStorageSourcePtr= src) static virJSONValuePtr -qemuBlockStorageSourceGetFileProps(virStorageSourcePtr src) +qemuBlockStorageSourceGetFileProps(virStorageSourcePtr src, + bool onlytarget) { const char *driver =3D "file"; const char *iomode =3D NULL; const char *prManagerAlias =3D NULL; virJSONValuePtr ret =3D NULL; - if (src->iomode !=3D VIR_DOMAIN_DISK_IO_DEFAULT) - iomode =3D virDomainDiskIoTypeToString(src->iomode); - if (virStorageSourceIsBlockLocal(src)) { if (src->hostcdrom) driver =3D "host_cdrom"; @@ -960,8 +973,13 @@ qemuBlockStorageSourceGetFileProps(virStorageSourcePtr= src) driver =3D "host_device"; } - if (src->pr) - prManagerAlias =3D src->pr->mgralias; + if (!onlytarget) { + if (src->pr) + prManagerAlias =3D src->pr->mgralias; + + if (src->iomode !=3D VIR_DOMAIN_DISK_IO_DEFAULT) + iomode =3D virDomainDiskIoTypeToString(src->iomode); + } ignore_value(virJSONValueObjectCreate(&ret, "s:driver", driver, @@ -974,21 +992,26 @@ qemuBlockStorageSourceGetFileProps(virStorageSourcePt= r src) static virJSONValuePtr -qemuBlockStorageSourceGetVvfatProps(virStorageSourcePtr src) +qemuBlockStorageSourceGetVvfatProps(virStorageSourcePtr src, + bool onlytarget) { - virJSONValuePtr ret =3D NULL; + VIR_AUTOPTR(virJSONValue) ret =3D NULL; /* libvirt currently does not handle the following attributes: * '*fat-type': 'int' * '*label': 'str' */ - ignore_value(virJSONValueObjectCreate(&ret, - "s:driver", "vvfat", - "s:dir", src->path, - "b:floppy", src->floppyimg, - "b:rw", !src->readonly, NULL)); + if (virJSONValueObjectCreate(&ret, + "s:driver", "vvfat", + "s:dir", src->path, + "b:floppy", src->floppyimg, NULL) < 0) + return NULL; - return ret; + if (!onlytarget && + virJSONValueObjectAdd(ret, "b:rw", !src->readonly, NULL) < 0) + return NULL; + + VIR_RETURN_PTR(ret); } @@ -1024,13 +1047,15 @@ qemuBlockStorageSourceGetBlockdevGetCacheProps(virS= torageSourcePtr src, * qemuBlockStorageSourceGetBackendProps: * @src: disk source * @legacy: use legacy formatting of attributes (for -drive / old qemus) + * @onlytarget: omit any data which does not identify the image itself * * Creates a JSON object describing the underlying storage or protocol of a * storage source. Returns NULL on error and reports an appropriate error = message. */ virJSONValuePtr qemuBlockStorageSourceGetBackendProps(virStorageSourcePtr src, - bool legacy) + bool legacy, + bool onlytarget) { int actualType =3D virStorageSourceGetActualType(src); VIR_AUTOPTR(virJSONValue) fileprops =3D NULL; @@ -1038,14 +1063,14 @@ qemuBlockStorageSourceGetBackendProps(virStorageSou= rcePtr src, switch ((virStorageType)actualType) { case VIR_STORAGE_TYPE_BLOCK: case VIR_STORAGE_TYPE_FILE: - if (!(fileprops =3D qemuBlockStorageSourceGetFileProps(src))) + if (!(fileprops =3D qemuBlockStorageSourceGetFileProps(src, onlyta= rget))) return NULL; break; case VIR_STORAGE_TYPE_DIR: /* qemu handles directories by exposing them as a device with emul= ated * FAT filesystem */ - if (!(fileprops =3D qemuBlockStorageSourceGetVvfatProps(src))) + if (!(fileprops =3D qemuBlockStorageSourceGetVvfatProps(src, onlyt= arget))) return NULL; break; @@ -1057,12 +1082,12 @@ qemuBlockStorageSourceGetBackendProps(virStorageSou= rcePtr src, case VIR_STORAGE_TYPE_NETWORK: switch ((virStorageNetProtocol) src->protocol) { case VIR_STORAGE_NET_PROTOCOL_GLUSTER: - if (!(fileprops =3D qemuBlockStorageSourceGetGlusterProps(src,= legacy))) + if (!(fileprops =3D qemuBlockStorageSourceGetGlusterProps(src,= legacy, onlytarget))) return NULL; break; case VIR_STORAGE_NET_PROTOCOL_VXHS: - if (!(fileprops =3D qemuBlockStorageSourceGetVxHSProps(src))) + if (!(fileprops =3D qemuBlockStorageSourceGetVxHSProps(src, on= lytarget))) return NULL; break; @@ -1071,22 +1096,22 @@ qemuBlockStorageSourceGetBackendProps(virStorageSou= rcePtr src, case VIR_STORAGE_NET_PROTOCOL_FTP: case VIR_STORAGE_NET_PROTOCOL_FTPS: case VIR_STORAGE_NET_PROTOCOL_TFTP: - if (!(fileprops =3D qemuBlockStorageSourceGetCURLProps(src))) + if (!(fileprops =3D qemuBlockStorageSourceGetCURLProps(src, on= lytarget))) return NULL; break; case VIR_STORAGE_NET_PROTOCOL_ISCSI: - if (!(fileprops =3D qemuBlockStorageSourceGetISCSIProps(src))) + if (!(fileprops =3D qemuBlockStorageSourceGetISCSIProps(src, o= nlytarget))) return NULL; break; case VIR_STORAGE_NET_PROTOCOL_NBD: - if (!(fileprops =3D qemuBlockStorageSourceGetNBDProps(src))) + if (!(fileprops =3D qemuBlockStorageSourceGetNBDProps(src, onl= ytarget))) return NULL; break; case VIR_STORAGE_NET_PROTOCOL_RBD: - if (!(fileprops =3D qemuBlockStorageSourceGetRBDProps(src))) + if (!(fileprops =3D qemuBlockStorageSourceGetRBDProps(src, onl= ytarget))) return NULL; break; @@ -1107,19 +1132,21 @@ qemuBlockStorageSourceGetBackendProps(virStorageSou= rcePtr src, break; } - if (qemuBlockNodeNameValidate(src->nodestorage) < 0 || - virJSONValueObjectAdd(fileprops, "S:node-name", src->nodestorage, = NULL) < 0) - return NULL; - - if (!legacy) { - if (qemuBlockStorageSourceGetBlockdevGetCacheProps(src, fileprops)= < 0) + if (!onlytarget) { + if (qemuBlockNodeNameValidate(src->nodestorage) < 0 || + virJSONValueObjectAdd(fileprops, "S:node-name", src->nodestora= ge, NULL) < 0) return NULL; - if (virJSONValueObjectAdd(fileprops, - "b:read-only", src->readonly, - "s:discard", "unmap", - NULL) < 0) - return NULL; + if (!legacy) { + if (qemuBlockStorageSourceGetBlockdevGetCacheProps(src, filepr= ops) < 0) + return NULL; + + if (virJSONValueObjectAdd(fileprops, + "b:read-only", src->readonly, + "s:discard", "unmap", + NULL) < 0) + return NULL; + } } VIR_RETURN_PTR(fileprops); @@ -1440,7 +1467,7 @@ qemuBlockStorageSourceAttachPrepareBlockdev(virStorag= eSourcePtr src) return NULL; if (!(data->formatProps =3D qemuBlockStorageSourceGetBlockdevProps(src= )) || - !(data->storageProps =3D qemuBlockStorageSourceGetBackendProps(src= , false))) + !(data->storageProps =3D qemuBlockStorageSourceGetBackendProps(src= , false, false))) return NULL; data->storageNodeName =3D src->nodestorage; diff --git a/src/qemu/qemu_block.h b/src/qemu/qemu_block.h index 934a1f125d..7b94f4f0ff 100644 --- a/src/qemu/qemu_block.h +++ b/src/qemu/qemu_block.h @@ -58,7 +58,8 @@ qemuBlockStorageSourceSupportsConcurrentAccess(virStorage= SourcePtr src); virJSONValuePtr qemuBlockStorageSourceGetBackendProps(virStorageSourcePtr src, - bool legacy); + bool legacy, + bool onlytarget); virURIPtr qemuBlockStorageSourceGetURI(virStorageSourcePtr src); diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 688dc324c6..b963fc7235 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -1610,7 +1610,7 @@ qemuDiskSourceGetProps(virStorageSourcePtr src) virJSONValuePtr props; virJSONValuePtr ret; - if (!(props =3D qemuBlockStorageSourceGetBackendProps(src, true))) + if (!(props =3D qemuBlockStorageSourceGetBackendProps(src, true, false= ))) return NULL; if (virJSONValueObjectCreate(&ret, "a:file", &props, NULL) < 0) { diff --git a/tests/qemublocktest.c b/tests/qemublocktest.c index 21db3e4881..29ce27021f 100644 --- a/tests/qemublocktest.c +++ b/tests/qemublocktest.c @@ -67,7 +67,7 @@ testBackingXMLjsonXML(const void *args) return -1; } - if (!(backendprops =3D qemuBlockStorageSourceGetBackendProps(xmlsrc, t= rue))) { + if (!(backendprops =3D qemuBlockStorageSourceGetBackendProps(xmlsrc, t= rue, false))) { fprintf(stderr, "failed to format disk source json\n"); return -1; } @@ -213,7 +213,7 @@ testQemuDiskXMLToProps(const void *opaque) goto cleanup; if (!(formatProps =3D qemuBlockStorageSourceGetBlockdevProps(n)) || - !(storageProps =3D qemuBlockStorageSourceGetBackendProps(n, fa= lse))) { + !(storageProps =3D qemuBlockStorageSourceGetBackendProps(n, fa= lse, false))) { if (!data->fail) { VIR_TEST_VERBOSE("failed to generate qemu blockdev props\n= "); goto cleanup; --=20 2.21.0 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list