From nobody Mon Apr 29 18:26:54 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1528750480315225.32483480247186; Mon, 11 Jun 2018 13:54:40 -0700 (PDT) Received: from localhost ([::1]:51296 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fSTpk-00037G-PR for importer@patchew.org; Mon, 11 Jun 2018 16:54:38 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:43661) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fSTnY-0001kh-0M for qemu-devel@nongnu.org; Mon, 11 Jun 2018 16:52:24 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1fSTnV-00082G-NU for qemu-devel@nongnu.org; Mon, 11 Jun 2018 16:52:20 -0400 Received: from mx3-rdu2.redhat.com ([66.187.233.73]:49976 helo=mx1.redhat.com) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1fSTnO-0007w0-V2; Mon, 11 Jun 2018 16:52:11 -0400 Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.rdu2.redhat.com [10.11.54.5]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 6F87EBB409; Mon, 11 Jun 2018 20:52:10 +0000 (UTC) Received: from localhost (ovpn-204-89.brq.redhat.com [10.40.204.89]) by smtp.corp.redhat.com (Postfix) with ESMTPS id D84A05032A; Mon, 11 Jun 2018 20:52:09 +0000 (UTC) From: Max Reitz To: qemu-block@nongnu.org Date: Mon, 11 Jun 2018 22:51:54 +0200 Message-Id: <20180611205203.2624-2-mreitz@redhat.com> In-Reply-To: <20180611205203.2624-1-mreitz@redhat.com> References: <20180611205203.2624-1-mreitz@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.11.54.5 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.11.55.1]); Mon, 11 Jun 2018 20:52:10 +0000 (UTC) X-Greylist: inspected by milter-greylist-4.5.16 (mx1.redhat.com [10.11.55.1]); Mon, 11 Jun 2018 20:52:10 +0000 (UTC) for IP:'10.11.54.5' DOMAIN:'int-mx05.intmail.prod.int.rdu2.redhat.com' HELO:'smtp.corp.redhat.com' FROM:'mreitz@redhat.com' RCPT:'' X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 66.187.233.73 Subject: [Qemu-devel] [PATCH v2 01/10] qapi: Add default-variant for flat unions X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Kevin Wolf , qemu-devel@nongnu.org, Michael Roth , Markus Armbruster , Max Reitz Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" This patch allows specifying a discriminator that is an optional member of the base struct. In such a case, a default value must be provided that is used when no value is given. Signed-off-by: Max Reitz --- qapi/introspect.json | 8 +++++ scripts/qapi/common.py | 57 ++++++++++++++++++++++++++++------ scripts/qapi/doc.py | 8 +++-- scripts/qapi/introspect.py | 10 ++++-- scripts/qapi/visit.py | 13 ++++++++ tests/qapi-schema/test-qapi.py | 2 ++ 6 files changed, 83 insertions(+), 15 deletions(-) diff --git a/qapi/introspect.json b/qapi/introspect.json index 80a0a3e656..b43c87fe8d 100644 --- a/qapi/introspect.json +++ b/qapi/introspect.json @@ -168,6 +168,13 @@ # @tag: the name of the member serving as type tag. # An element of @members with this name must exist. # +# @default-variant: if the @tag element of @members is optional, this +# is the default value for choosing a variant. Its +# value will be a valid value for @tag. +# Present exactly when @tag is present and the +# associated element of @members is optional. +# (Since: 3.0) +# # @variants: variant members, i.e. additional members that # depend on the type tag's value. Present exactly when # @tag is present. The variants are in no particular order, @@ -181,6 +188,7 @@ { 'struct': 'SchemaInfoObject', 'data': { 'members': [ 'SchemaInfoObjectMember' ], '*tag': 'str', + '*default-variant': 'str', '*variants': [ 'SchemaInfoObjectVariant' ] } } =20 ## diff --git a/scripts/qapi/common.py b/scripts/qapi/common.py index e82990f0f2..d15f56b260 100644 --- a/scripts/qapi/common.py +++ b/scripts/qapi/common.py @@ -721,6 +721,7 @@ def check_union(expr, info): name =3D expr['union'] base =3D expr.get('base') discriminator =3D expr.get('discriminator') + default_variant =3D expr.get('default-variant') members =3D expr['data'] =20 # Two types of unions, determined by discriminator. @@ -745,16 +746,37 @@ def check_union(expr, info): base_members =3D find_base_members(base) assert base_members is not None =20 - # The value of member 'discriminator' must name a non-optional - # member of the base struct. + # The value of member 'discriminator' must name a member of + # the base struct. check_name(info, "Discriminator of flat union '%s'" % name, discriminator) - discriminator_type =3D base_members.get(discriminator) - if not discriminator_type: - raise QAPISemError(info, - "Discriminator '%s' is not a member of base= " - "struct '%s'" - % (discriminator, base)) + if default_variant is None: + discriminator_type =3D base_members.get(discriminator) + if not discriminator_type: + if base_members.get('*' + discriminator) is None: + raise QAPISemError(info, + "Discriminator '%s' is not a member= of " + "base struct '%s'" + % (discriminator, base)) + else: + raise QAPISemError(info, + "Default variant must be specified = for " + "optional discriminator '%s'" + % discriminator) + else: + discriminator_type =3D base_members.get('*' + discriminator) + if not discriminator_type: + if base_members.get(discriminator) is None: + raise QAPISemError(info, + "Discriminator '%s' is not a member= of " + "base struct '%s'" + % (discriminator, base)) + else: + raise QAPISemError(info, + "Must not specify a default variant= for " + "non-optional discriminator '%s'" + % discriminator) + enum_define =3D enum_types.get(discriminator_type) allow_metas =3D ['struct'] # Do not allow string discriminator @@ -763,6 +785,15 @@ def check_union(expr, info): "Discriminator '%s' must be of enumeration " "type" % discriminator) =20 + if default_variant is not None: + # Must be a value of the enumeration + if default_variant not in enum_define['data']: + raise QAPISemError(info, + "Default variant '%s' of flat union '%s= ' is " + "not part of '%s'" + % (default_variant, name, + discriminator_type)) + # Check every branch; don't allow an empty union if len(members) =3D=3D 0: raise QAPISemError(info, "Union '%s' cannot have empty 'data'" % n= ame) @@ -910,7 +941,7 @@ def check_exprs(exprs): elif 'union' in expr: meta =3D 'union' check_keys(expr_elem, 'union', ['data'], - ['base', 'discriminator']) + ['base', 'discriminator', 'default-variant']) union_types[expr[meta]] =3D expr elif 'alternate' in expr: meta =3D 'alternate' @@ -1336,12 +1367,14 @@ class QAPISchemaObjectTypeMember(QAPISchemaMember): =20 =20 class QAPISchemaObjectTypeVariants(object): - def __init__(self, tag_name, tag_member, variants): + def __init__(self, tag_name, tag_member, default_tag_value, variants): # Flat unions pass tag_name but not tag_member. # Simple unions and alternates pass tag_member but not tag_name. # After check(), tag_member is always set, and tag_name remains # a reliable witness of being used by a flat union. assert bool(tag_member) !=3D bool(tag_name) + # default_tag_value is only passed for flat unions. + assert bool(tag_name) or not bool(default_tag_value) assert (isinstance(tag_name, str) or isinstance(tag_member, QAPISchemaObjectTypeMember)) assert len(variants) > 0 @@ -1349,6 +1382,7 @@ class QAPISchemaObjectTypeVariants(object): assert isinstance(v, QAPISchemaObjectTypeVariant) self._tag_name =3D tag_name self.tag_member =3D tag_member + self.default_tag_value =3D default_tag_value self.variants =3D variants =20 def set_owner(self, name): @@ -1640,6 +1674,7 @@ class QAPISchema(object): data =3D expr['data'] base =3D expr.get('base') tag_name =3D expr.get('discriminator') + default_tag_value =3D expr.get('default-variant') tag_member =3D None if isinstance(base, dict): base =3D (self._make_implicit_object_type( @@ -1659,6 +1694,7 @@ class QAPISchema(object): QAPISchemaObjectType(name, info, doc, base, members, QAPISchemaObjectTypeVariants(tag_name, tag_member, + default_tag_= value, variants))) =20 def _def_alternate_type(self, expr, info, doc): @@ -1671,6 +1707,7 @@ class QAPISchema(object): QAPISchemaAlternateType(name, info, doc, QAPISchemaObjectTypeVariants(None, tag_membe= r, + None, variants)= )) =20 def _def_command(self, expr, info, doc): diff --git a/scripts/qapi/doc.py b/scripts/qapi/doc.py index b5630844f9..7dd14173e5 100644 --- a/scripts/qapi/doc.py +++ b/scripts/qapi/doc.py @@ -160,8 +160,12 @@ def texi_members(doc, what, base, variants, member_fun= c): items +=3D '@item The members of @code{%s}\n' % base.doc_type() if variants: for v in variants.variants: - when =3D ' when @code{%s} is @t{"%s"}' % ( - variants.tag_member.name, v.name) + if v.name =3D=3D variants.default_tag_value: + when =3D ' when @code{%s} is @t{"%s"} or not given' % ( + variants.tag_member.name, v.name) + else: + when =3D ' when @code{%s} is @t{"%s"}' % ( + variants.tag_member.name, v.name) if v.type.is_implicit(): assert not v.type.base and not v.type.variants for m in v.type.local_members: diff --git a/scripts/qapi/introspect.py b/scripts/qapi/introspect.py index 5b6c72c7b2..0133f91792 100644 --- a/scripts/qapi/introspect.py +++ b/scripts/qapi/introspect.py @@ -142,9 +142,12 @@ const QLitObject %(c_name)s =3D %(c_string)s; ret['default'] =3D None return ret =20 - def _gen_variants(self, tag_name, variants): - return {'tag': tag_name, - 'variants': [self._gen_variant(v) for v in variants]} + def _gen_variants(self, tag_name, default_variant, variants): + ret =3D {'tag': tag_name, + 'variants': [self._gen_variant(v) for v in variants]} + if default_variant: + ret['default-variant'] =3D default_variant + return ret =20 def _gen_variant(self, variant): return {'case': variant.name, 'type': self._use_type(variant.type)} @@ -163,6 +166,7 @@ const QLitObject %(c_name)s =3D %(c_string)s; obj =3D {'members': [self._gen_member(m) for m in members]} if variants: obj.update(self._gen_variants(variants.tag_member.name, + variants.default_tag_value, variants.variants)) self._gen_qlit(name, 'object', obj) =20 diff --git a/scripts/qapi/visit.py b/scripts/qapi/visit.py index 5d72d8936c..4c432f3ead 100644 --- a/scripts/qapi/visit.py +++ b/scripts/qapi/visit.py @@ -75,6 +75,19 @@ void visit_type_%(c_name)s_members(Visitor *v, %(c_name)= s *obj, Error **errp) ''') =20 if variants: + if variants.default_tag_value is not None: + ret +=3D mcgen(''' + if (!obj->has_%(c_name)s) { + obj->has_%(c_name)s =3D true; + obj->%(c_name)s =3D %(enum_const)s; + } +''', + c_name=3Dc_name(variants.tag_member.name), + enum_const=3Dc_enum_const( + variants.tag_member.type.name, + variants.default_tag_value, + variants.tag_member.type.prefix)) + ret +=3D mcgen(''' switch (obj->%(c_name)s) { ''', diff --git a/tests/qapi-schema/test-qapi.py b/tests/qapi-schema/test-qapi.py index 4512a41504..3609e98348 100644 --- a/tests/qapi-schema/test-qapi.py +++ b/tests/qapi-schema/test-qapi.py @@ -56,6 +56,8 @@ class QAPISchemaTestVisitor(QAPISchemaVisitor): def _print_variants(variants): if variants: print(' tag %s' % variants.tag_member.name) + if variants.default_tag_value: + print(' default variant: %s' % variants.default_tag_val= ue) for v in variants.variants: print(' case %s: %s' % (v.name, v.type.name)) =20 --=20 2.17.1 From nobody Mon Apr 29 18:26:54 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1528750480236134.4087278965893; Mon, 11 Jun 2018 13:54:40 -0700 (PDT) Received: from localhost ([::1]:51295 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fSTpj-000378-KQ for importer@patchew.org; Mon, 11 Jun 2018 16:54:35 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:43625) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fSTnX-0001jc-2Z for qemu-devel@nongnu.org; Mon, 11 Jun 2018 16:52:20 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1fSTnV-00082M-O9 for qemu-devel@nongnu.org; Mon, 11 Jun 2018 16:52:19 -0400 Received: from mx3-rdu2.redhat.com ([66.187.233.73]:49080 helo=mx1.redhat.com) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1fSTnQ-0007xO-R5; Mon, 11 Jun 2018 16:52:12 -0400 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.rdu2.redhat.com [10.11.54.6]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 58958401EF1C; Mon, 11 Jun 2018 20:52:12 +0000 (UTC) Received: from localhost (ovpn-204-89.brq.redhat.com [10.40.204.89]) by smtp.corp.redhat.com (Postfix) with ESMTPS id ECBEE2035721; Mon, 11 Jun 2018 20:52:11 +0000 (UTC) From: Max Reitz To: qemu-block@nongnu.org Date: Mon, 11 Jun 2018 22:51:55 +0200 Message-Id: <20180611205203.2624-3-mreitz@redhat.com> In-Reply-To: <20180611205203.2624-1-mreitz@redhat.com> References: <20180611205203.2624-1-mreitz@redhat.com> X-Scanned-By: MIMEDefang 2.78 on 10.11.54.6 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.11.55.5]); Mon, 11 Jun 2018 20:52:12 +0000 (UTC) X-Greylist: inspected by milter-greylist-4.5.16 (mx1.redhat.com [10.11.55.5]); Mon, 11 Jun 2018 20:52:12 +0000 (UTC) for IP:'10.11.54.6' DOMAIN:'int-mx06.intmail.prod.int.rdu2.redhat.com' HELO:'smtp.corp.redhat.com' FROM:'mreitz@redhat.com' RCPT:'' X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 66.187.233.73 Subject: [Qemu-devel] [PATCH v2 02/10] docs/qapi: Document optional discriminators X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Kevin Wolf , qemu-devel@nongnu.org, Michael Roth , Markus Armbruster , Max Reitz Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Reviewed-by: Eric Blake Signed-off-by: Max Reitz --- docs/devel/qapi-code-gen.txt | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/docs/devel/qapi-code-gen.txt b/docs/devel/qapi-code-gen.txt index 1366228b2a..f0a2101096 100644 --- a/docs/devel/qapi-code-gen.txt +++ b/docs/devel/qapi-code-gen.txt @@ -472,8 +472,8 @@ All branches of the union must be complex types, and th= e top-level members of the union dictionary on the wire will be combination of members from both the base type and the appropriate branch type (when merging two dictionaries, there must be no keys in common). The -'discriminator' member must be the name of a non-optional enum-typed -member of the base struct. +'discriminator' member must be the name of an enum-typed member of the +base struct. =20 The following example enhances the above simple union example by adding an optional common member 'read-only', renaming the @@ -502,6 +502,23 @@ the enum). In the resulting generated C data types, a= flat union is represented as a struct with the base members included directly, and then a union of structures for each branch of the struct. =20 +If the discriminator points to an optional member of the base struct, +its default value must be specified as a 'default-variant'. In the +following example, the above BlockDriver struct is changed so it +defaults to the 'file' driver if that field is omitted on the wire: + + { 'union': 'BlockdevOptions', + 'base': { '*driver': 'BlockdevDriver', '*read-only': 'bool' }, + 'discriminator': 'driver', + 'default-variant': 'file', + 'data': { 'file': 'BlockdevOptionsFile', + 'qcow2': 'BlockdevOptionsQcow2' } } + +Now the 'file' JSON object can be abbreviated to: + + { "read-only": "true", + "filename": "/some/place/my-image" } + A simple union can always be re-written as a flat union where the base class has a single member named 'type', and where each branch of the union has a struct with a single member named 'data'. That is, --=20 2.17.1 From nobody Mon Apr 29 18:26:54 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1528750689879398.2678517480425; Mon, 11 Jun 2018 13:58:09 -0700 (PDT) Received: from localhost ([::1]:51317 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fSTt7-00067w-8d for importer@patchew.org; Mon, 11 Jun 2018 16:58:05 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:43745) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fSTnd-0001pw-4x for qemu-devel@nongnu.org; Mon, 11 Jun 2018 16:52:27 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1fSTnY-00087R-1C for qemu-devel@nongnu.org; Mon, 11 Jun 2018 16:52:25 -0400 Received: from mx3-rdu2.redhat.com ([66.187.233.73]:37046 helo=mx1.redhat.com) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1fSTnS-0007zC-Ux; Mon, 11 Jun 2018 16:52:15 -0400 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.rdu2.redhat.com [10.11.54.6]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 68266402317E; Mon, 11 Jun 2018 20:52:14 +0000 (UTC) Received: from localhost (ovpn-204-89.brq.redhat.com [10.40.204.89]) by smtp.corp.redhat.com (Postfix) with ESMTPS id DC63A2035721; Mon, 11 Jun 2018 20:52:13 +0000 (UTC) From: Max Reitz To: qemu-block@nongnu.org Date: Mon, 11 Jun 2018 22:51:56 +0200 Message-Id: <20180611205203.2624-4-mreitz@redhat.com> In-Reply-To: <20180611205203.2624-1-mreitz@redhat.com> References: <20180611205203.2624-1-mreitz@redhat.com> X-Scanned-By: MIMEDefang 2.78 on 10.11.54.6 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.11.55.6]); Mon, 11 Jun 2018 20:52:14 +0000 (UTC) X-Greylist: inspected by milter-greylist-4.5.16 (mx1.redhat.com [10.11.55.6]); Mon, 11 Jun 2018 20:52:14 +0000 (UTC) for IP:'10.11.54.6' DOMAIN:'int-mx06.intmail.prod.int.rdu2.redhat.com' HELO:'smtp.corp.redhat.com' FROM:'mreitz@redhat.com' RCPT:'' X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 66.187.233.73 Subject: [Qemu-devel] [PATCH v2 03/10] tests: Add QAPI optional discriminator tests X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Kevin Wolf , qemu-devel@nongnu.org, Michael Roth , Markus Armbruster , Max Reitz Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" There already is an optional discriminator test, although it also noted the discriminator name itself as optional. This already gives us one error test case, to which this patch adds various others. Furthermore, a passing test case is added to qapi-schema-test. Signed-off-by: Max Reitz --- tests/Makefile.include | 5 ++++- ...union-optional-discriminator-invalid-default.json | 12 ++++++++++++ ...optional-discriminator-invalid-specification.json | 12 ++++++++++++ ...lat-union-optional-discriminator-no-default.json} | 5 +++-- .../flat-union-superfluous-default-variant.json | 11 +++++++++++ tests/qapi-schema/qapi-schema-test.json | 9 +++++++++ ...-union-optional-discriminator-invalid-default.err | 1 + ...nion-optional-discriminator-invalid-default.exit} | 0 ...union-optional-discriminator-invalid-default.out} | 0 ...-optional-discriminator-invalid-specification.err | 1 + ...optional-discriminator-invalid-specification.exit | 1 + ...-optional-discriminator-invalid-specification.out | 0 .../flat-union-optional-discriminator-no-default.err | 1 + ...flat-union-optional-discriminator-no-default.exit | 1 + .../flat-union-optional-discriminator-no-default.out | 0 .../flat-union-optional-discriminator.err | 1 - .../flat-union-superfluous-default-variant.err | 1 + .../flat-union-superfluous-default-variant.exit | 1 + .../flat-union-superfluous-default-variant.out | 0 tests/qapi-schema/qapi-schema-test.out | 9 +++++++++ 20 files changed, 67 insertions(+), 4 deletions(-) create mode 100644 tests/qapi-schema/flat-union-optional-discriminator-inv= alid-default.json create mode 100644 tests/qapi-schema/flat-union-optional-discriminator-inv= alid-specification.json rename tests/qapi-schema/{flat-union-optional-discriminator.json =3D> flat= -union-optional-discriminator-no-default.json} (70%) create mode 100644 tests/qapi-schema/flat-union-superfluous-default-varian= t.json create mode 100644 tests/qapi-schema/flat-union-optional-discriminator-inv= alid-default.err rename tests/qapi-schema/{flat-union-optional-discriminator.exit =3D> flat= -union-optional-discriminator-invalid-default.exit} (100%) rename tests/qapi-schema/{flat-union-optional-discriminator.out =3D> flat-= union-optional-discriminator-invalid-default.out} (100%) create mode 100644 tests/qapi-schema/flat-union-optional-discriminator-inv= alid-specification.err create mode 100644 tests/qapi-schema/flat-union-optional-discriminator-inv= alid-specification.exit create mode 100644 tests/qapi-schema/flat-union-optional-discriminator-inv= alid-specification.out create mode 100644 tests/qapi-schema/flat-union-optional-discriminator-no-= default.err create mode 100644 tests/qapi-schema/flat-union-optional-discriminator-no-= default.exit create mode 100644 tests/qapi-schema/flat-union-optional-discriminator-no-= default.out delete mode 100644 tests/qapi-schema/flat-union-optional-discriminator.err create mode 100644 tests/qapi-schema/flat-union-superfluous-default-varian= t.err create mode 100644 tests/qapi-schema/flat-union-superfluous-default-varian= t.exit create mode 100644 tests/qapi-schema/flat-union-superfluous-default-varian= t.out diff --git a/tests/Makefile.include b/tests/Makefile.include index 2023e257fd..66d10e1072 100644 --- a/tests/Makefile.include +++ b/tests/Makefile.include @@ -505,8 +505,11 @@ qapi-schema +=3D flat-union-int-branch.json qapi-schema +=3D flat-union-invalid-branch-key.json qapi-schema +=3D flat-union-invalid-discriminator.json qapi-schema +=3D flat-union-no-base.json -qapi-schema +=3D flat-union-optional-discriminator.json +qapi-schema +=3D flat-union-optional-discriminator-invalid-specification.j= son +qapi-schema +=3D flat-union-optional-discriminator-no-default.json +qapi-schema +=3D flat-union-optional-discriminator-invalid-default.json qapi-schema +=3D flat-union-string-discriminator.json +qapi-schema +=3D flat-union-superfluous-default-variant.json qapi-schema +=3D funny-char.json qapi-schema +=3D ident-with-escape.json qapi-schema +=3D include-before-err.json diff --git a/tests/qapi-schema/flat-union-optional-discriminator-invalid-de= fault.json b/tests/qapi-schema/flat-union-optional-discriminator-invalid-de= fault.json new file mode 100644 index 0000000000..015a47ba52 --- /dev/null +++ b/tests/qapi-schema/flat-union-optional-discriminator-invalid-default.j= son @@ -0,0 +1,12 @@ +# default-variant must refer to an actual value of the discriminator's +# enum +{ 'enum': 'Enum', 'data': [ 'one', 'two' ] } +{ 'struct': 'Base', + 'data': { '*switch': 'Enum' } } +{ 'struct': 'Branch', 'data': { 'name': 'str' } } +{ 'union': 'MyUnion', + 'base': 'Base', + 'discriminator': 'switch', + 'default-variant': 'three', + 'data': { 'one': 'Branch', + 'two': 'Branch' } } diff --git a/tests/qapi-schema/flat-union-optional-discriminator-invalid-sp= ecification.json b/tests/qapi-schema/flat-union-optional-discriminator-inva= lid-specification.json new file mode 100644 index 0000000000..fd896942a2 --- /dev/null +++ b/tests/qapi-schema/flat-union-optional-discriminator-invalid-specifica= tion.json @@ -0,0 +1,12 @@ +# For using optional discriminators, only the field in the base struct +# must be marked optional, not the discriminator name itself +{ 'enum': 'Enum', 'data': [ 'one', 'two' ] } +{ 'struct': 'Base', + 'data': { '*switch': 'Enum' } } +{ 'struct': 'Branch', 'data': { 'name': 'str' } } +{ 'union': 'MyUnion', + 'base': 'Base', + 'discriminator': '*switch', + 'default-variant': 'one', + 'data': { 'one': 'Branch', + 'two': 'Branch' } } diff --git a/tests/qapi-schema/flat-union-optional-discriminator.json b/tes= ts/qapi-schema/flat-union-optional-discriminator-no-default.json similarity index 70% rename from tests/qapi-schema/flat-union-optional-discriminator.json rename to tests/qapi-schema/flat-union-optional-discriminator-no-default.js= on index 08a8f7ef8b..0d612f5a62 100644 --- a/tests/qapi-schema/flat-union-optional-discriminator.json +++ b/tests/qapi-schema/flat-union-optional-discriminator-no-default.json @@ -1,10 +1,11 @@ -# we require the discriminator to be non-optional +# Using an optional discriminator requires specifying a default +# variant { 'enum': 'Enum', 'data': [ 'one', 'two' ] } { 'struct': 'Base', 'data': { '*switch': 'Enum' } } { 'struct': 'Branch', 'data': { 'name': 'str' } } { 'union': 'MyUnion', 'base': 'Base', - 'discriminator': '*switch', + 'discriminator': 'switch', 'data': { 'one': 'Branch', 'two': 'Branch' } } diff --git a/tests/qapi-schema/flat-union-superfluous-default-variant.json = b/tests/qapi-schema/flat-union-superfluous-default-variant.json new file mode 100644 index 0000000000..8558165868 --- /dev/null +++ b/tests/qapi-schema/flat-union-superfluous-default-variant.json @@ -0,0 +1,11 @@ +# default-variant only makes sense with an optional discriminator +{ 'enum': 'Enum', 'data': [ 'one', 'two' ] } +{ 'struct': 'Base', + 'data': { 'switch': 'Enum' } } +{ 'struct': 'Branch', 'data': { 'name': 'str' } } +{ 'union': 'MyUnion', + 'base': 'Base', + 'discriminator': 'switch', + 'default-variant': 'one', + 'data': { 'one': 'Branch', + 'two': 'Branch' } } diff --git a/tests/qapi-schema/qapi-schema-test.json b/tests/qapi-schema/qa= pi-schema-test.json index 46c7282945..64d5f6694e 100644 --- a/tests/qapi-schema/qapi-schema-test.json +++ b/tests/qapi-schema/qapi-schema-test.json @@ -99,6 +99,15 @@ { 'struct': 'UserDefC', 'data': { 'string1': 'str', 'string2': 'str' } } =20 +# for testing unions with an optional discriminator +{ 'union': 'UserDefFlatUnion3', + 'base': { '*enum1': 'EnumOne' }, + 'discriminator': 'enum1', + 'default-variant': 'value1', + 'data': { 'value1' : 'UserDefA', + 'value2' : 'UserDefB', + 'value3' : 'UserDefB' } } + # for testing use of 'number' within alternates { 'alternate': 'AltEnumBool', 'data': { 'e': 'EnumOne', 'b': 'bool' } } { 'alternate': 'AltEnumNum', 'data': { 'e': 'EnumOne', 'n': 'number' } } diff --git a/tests/qapi-schema/flat-union-optional-discriminator-invalid-de= fault.err b/tests/qapi-schema/flat-union-optional-discriminator-invalid-def= ault.err new file mode 100644 index 0000000000..b6bd3423d6 --- /dev/null +++ b/tests/qapi-schema/flat-union-optional-discriminator-invalid-default.e= rr @@ -0,0 +1 @@ +tests/qapi-schema/flat-union-optional-discriminator-invalid-default.json:7= : Default variant 'three' of flat union 'MyUnion' is not part of 'Enum' diff --git a/tests/qapi-schema/flat-union-optional-discriminator.exit b/tes= ts/qapi-schema/flat-union-optional-discriminator-invalid-default.exit similarity index 100% rename from tests/qapi-schema/flat-union-optional-discriminator.exit rename to tests/qapi-schema/flat-union-optional-discriminator-invalid-defau= lt.exit diff --git a/tests/qapi-schema/flat-union-optional-discriminator.out b/test= s/qapi-schema/flat-union-optional-discriminator-invalid-default.out similarity index 100% rename from tests/qapi-schema/flat-union-optional-discriminator.out rename to tests/qapi-schema/flat-union-optional-discriminator-invalid-defau= lt.out diff --git a/tests/qapi-schema/flat-union-optional-discriminator-invalid-sp= ecification.err b/tests/qapi-schema/flat-union-optional-discriminator-inval= id-specification.err new file mode 100644 index 0000000000..cbf154e726 --- /dev/null +++ b/tests/qapi-schema/flat-union-optional-discriminator-invalid-specifica= tion.err @@ -0,0 +1 @@ +tests/qapi-schema/flat-union-optional-discriminator-invalid-specification.= json:7: Discriminator of flat union 'MyUnion' does not allow optional name = '*switch' diff --git a/tests/qapi-schema/flat-union-optional-discriminator-invalid-sp= ecification.exit b/tests/qapi-schema/flat-union-optional-discriminator-inva= lid-specification.exit new file mode 100644 index 0000000000..d00491fd7e --- /dev/null +++ b/tests/qapi-schema/flat-union-optional-discriminator-invalid-specifica= tion.exit @@ -0,0 +1 @@ +1 diff --git a/tests/qapi-schema/flat-union-optional-discriminator-invalid-sp= ecification.out b/tests/qapi-schema/flat-union-optional-discriminator-inval= id-specification.out new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/qapi-schema/flat-union-optional-discriminator-no-default= .err b/tests/qapi-schema/flat-union-optional-discriminator-no-default.err new file mode 100644 index 0000000000..1342efd9e8 --- /dev/null +++ b/tests/qapi-schema/flat-union-optional-discriminator-no-default.err @@ -0,0 +1 @@ +tests/qapi-schema/flat-union-optional-discriminator-no-default.json:7: Def= ault variant must be specified for optional discriminator 'switch' diff --git a/tests/qapi-schema/flat-union-optional-discriminator-no-default= .exit b/tests/qapi-schema/flat-union-optional-discriminator-no-default.exit new file mode 100644 index 0000000000..d00491fd7e --- /dev/null +++ b/tests/qapi-schema/flat-union-optional-discriminator-no-default.exit @@ -0,0 +1 @@ +1 diff --git a/tests/qapi-schema/flat-union-optional-discriminator-no-default= .out b/tests/qapi-schema/flat-union-optional-discriminator-no-default.out new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/qapi-schema/flat-union-optional-discriminator.err b/test= s/qapi-schema/flat-union-optional-discriminator.err deleted file mode 100644 index aaabedb3bd..0000000000 --- a/tests/qapi-schema/flat-union-optional-discriminator.err +++ /dev/null @@ -1 +0,0 @@ -tests/qapi-schema/flat-union-optional-discriminator.json:6: Discriminator = of flat union 'MyUnion' does not allow optional name '*switch' diff --git a/tests/qapi-schema/flat-union-superfluous-default-variant.err b= /tests/qapi-schema/flat-union-superfluous-default-variant.err new file mode 100644 index 0000000000..5230bbf645 --- /dev/null +++ b/tests/qapi-schema/flat-union-superfluous-default-variant.err @@ -0,0 +1 @@ +tests/qapi-schema/flat-union-superfluous-default-variant.json:6: Must not = specify a default variant for non-optional discriminator 'switch' diff --git a/tests/qapi-schema/flat-union-superfluous-default-variant.exit = b/tests/qapi-schema/flat-union-superfluous-default-variant.exit new file mode 100644 index 0000000000..d00491fd7e --- /dev/null +++ b/tests/qapi-schema/flat-union-superfluous-default-variant.exit @@ -0,0 +1 @@ +1 diff --git a/tests/qapi-schema/flat-union-superfluous-default-variant.out b= /tests/qapi-schema/flat-union-superfluous-default-variant.out new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/qapi-schema/qapi-schema-test.out b/tests/qapi-schema/qap= i-schema-test.out index 542a19c407..4e3c2934bb 100644 --- a/tests/qapi-schema/qapi-schema-test.out +++ b/tests/qapi-schema/qapi-schema-test.out @@ -76,6 +76,15 @@ alternate UserDefAlternate object UserDefC member string1: str optional=3DFalse member string2: str optional=3DFalse +object q_obj_UserDefFlatUnion3-base + member enum1: EnumOne optional=3DTrue +object UserDefFlatUnion3 + base q_obj_UserDefFlatUnion3-base + tag enum1 + default variant: value1 + case value1: UserDefA + case value2: UserDefB + case value3: UserDefB alternate AltEnumBool tag type case e: EnumOne --=20 2.17.1 From nobody Mon Apr 29 18:26:54 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.gnu.org (208.118.235.17 [208.118.235.17]) by mx.zohomail.com with SMTPS id 1528750662688206.82906261024414; Mon, 11 Jun 2018 13:57:42 -0700 (PDT) Received: from localhost ([::1]:51314 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fSTsa-0005jf-9U for importer@patchew.org; Mon, 11 Jun 2018 16:57:32 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:43680) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fSTnY-0001lv-W1 for qemu-devel@nongnu.org; Mon, 11 Jun 2018 16:52:24 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1fSTnX-00086v-SC for qemu-devel@nongnu.org; Mon, 11 Jun 2018 16:52:21 -0400 Received: from mx3-rdu2.redhat.com ([66.187.233.73]:47826 helo=mx1.redhat.com) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1fSTnU-00080m-UC; Mon, 11 Jun 2018 16:52:17 -0400 Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.rdu2.redhat.com [10.11.54.3]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 5E9647D668; Mon, 11 Jun 2018 20:52:16 +0000 (UTC) Received: from localhost (ovpn-204-89.brq.redhat.com [10.40.204.89]) by smtp.corp.redhat.com (Postfix) with ESMTPS id ED4821134CA1; Mon, 11 Jun 2018 20:52:15 +0000 (UTC) From: Max Reitz To: qemu-block@nongnu.org Date: Mon, 11 Jun 2018 22:51:57 +0200 Message-Id: <20180611205203.2624-5-mreitz@redhat.com> In-Reply-To: <20180611205203.2624-1-mreitz@redhat.com> References: <20180611205203.2624-1-mreitz@redhat.com> X-Scanned-By: MIMEDefang 2.78 on 10.11.54.3 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.11.55.2]); Mon, 11 Jun 2018 20:52:16 +0000 (UTC) X-Greylist: inspected by milter-greylist-4.5.16 (mx1.redhat.com [10.11.55.2]); Mon, 11 Jun 2018 20:52:16 +0000 (UTC) for IP:'10.11.54.3' DOMAIN:'int-mx03.intmail.prod.int.rdu2.redhat.com' HELO:'smtp.corp.redhat.com' FROM:'mreitz@redhat.com' RCPT:'' X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 66.187.233.73 Subject: [Qemu-devel] [PATCH v2 04/10] qapi: Formalize qcow2 encryption probing X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Kevin Wolf , qemu-devel@nongnu.org, Michael Roth , Markus Armbruster , Max Reitz Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Currently, you can give no encryption format for a qcow2 file while still passing a key-secret. That does not conform to the schema, so this patch changes the schema to allow it. Signed-off-by: Max Reitz Reviewed-by: Daniel P. Berrang=C3=A9 --- qapi/block-core.json | 44 ++++++++++++++++++++++++++++++++++++++++---- block/qcow2.c | 3 +++ 2 files changed, 43 insertions(+), 4 deletions(-) diff --git a/qapi/block-core.json b/qapi/block-core.json index 4bd85dd1bb..295ace42ae 100644 --- a/qapi/block-core.json +++ b/qapi/block-core.json @@ -44,6 +44,19 @@ { 'struct': 'ImageInfoSpecificQCow2EncryptionBase', 'data': { 'format': 'BlockdevQcow2EncryptionFormat'}} =20 +## +# @ImageInfoSpecificQCow2EncryptionNoInfo: +# +# Only used for the qcow2 encryption format "auto" in which the actual +# encryption format is determined from the image header. Therefore, +# this encryption format will never be reported in +# ImageInfoSpecificQCow2Encryption. +# +# Since: 3.0 +## +{ 'struct': 'ImageInfoSpecificQCow2EncryptionNoInfo', + 'data': { } } + ## # @ImageInfoSpecificQCow2Encryption: # @@ -53,7 +66,8 @@ 'base': 'ImageInfoSpecificQCow2EncryptionBase', 'discriminator': 'format', 'data': { 'aes': 'QCryptoBlockInfoQCow', - 'luks': 'QCryptoBlockInfoLUKS' } } + 'luks': 'QCryptoBlockInfoLUKS', + 'auto': 'ImageInfoSpecificQCow2EncryptionNoInfo' } } =20 ## # @ImageInfoSpecificQCow2: @@ -2658,10 +2672,30 @@ # @BlockdevQcow2EncryptionFormat: # @aes: AES-CBC with plain64 initialization venctors # +# @auto: Determine the encryption format from the image +# header. This only allows the use of the +# key-secret option. (Since: 3.0) +# # Since: 2.10 ## { 'enum': 'BlockdevQcow2EncryptionFormat', - 'data': [ 'aes', 'luks' ] } + 'data': [ 'aes', 'luks', 'auto' ] } + +## +# @BlockdevQcow2EncryptionSecret: +# +# Allows specifying a key-secret without specifying the exact +# encryption format, which is determined automatically from the image +# header. +# +# @key-secret: The ID of a QCryptoSecret object providing the +# decryption key. Mandatory except when probing +# image for metadata only. +# +# Since: 3.0 +## +{ 'struct': 'BlockdevQcow2EncryptionSecret', + 'data': { '*key-secret': 'str' } } =20 ## # @BlockdevQcow2Encryption: @@ -2669,10 +2703,12 @@ # Since: 2.10 ## { 'union': 'BlockdevQcow2Encryption', - 'base': { 'format': 'BlockdevQcow2EncryptionFormat' }, + 'base': { '*format': 'BlockdevQcow2EncryptionFormat' }, 'discriminator': 'format', + 'default-variant': 'auto', 'data': { 'aes': 'QCryptoBlockOptionsQCow', - 'luks': 'QCryptoBlockOptionsLUKS'} } + 'luks': 'QCryptoBlockOptionsLUKS', + 'auto': 'BlockdevQcow2EncryptionSecret' } } =20 ## # @BlockdevOptionsQcow2: diff --git a/block/qcow2.c b/block/qcow2.c index 945132f692..6bfcba4ee1 100644 --- a/block/qcow2.c +++ b/block/qcow2.c @@ -868,6 +868,9 @@ static int qcow2_update_options_prepare(BlockDriverStat= e *bs, =20 qdict_extract_subqdict(options, &encryptopts, "encrypt."); encryptfmt =3D qdict_get_try_str(encryptopts, "format"); + if (!g_strcmp0(encryptfmt, "auto")) { + encryptfmt =3D NULL; + } =20 opts =3D qemu_opts_create(&qcow2_runtime_opts, NULL, 0, &error_abort); qemu_opts_absorb_qdict(opts, options, &local_err); --=20 2.17.1 From nobody Mon Apr 29 18:26:54 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.gnu.org (208.118.235.17 [208.118.235.17]) by mx.zohomail.com with SMTPS id 1528750662639799.26142206978; Mon, 11 Jun 2018 13:57:42 -0700 (PDT) Received: from localhost ([::1]:51315 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fSTsb-0005kH-7D for importer@patchew.org; Mon, 11 Jun 2018 16:57:33 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:43765) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fSTne-0001qg-1u for qemu-devel@nongnu.org; Mon, 11 Jun 2018 16:52:27 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1fSTnd-0008FZ-8T for qemu-devel@nongnu.org; Mon, 11 Jun 2018 16:52:26 -0400 Received: from mx3-rdu2.redhat.com ([66.187.233.73]:47830 helo=mx1.redhat.com) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1fSTnW-00084C-T8; Mon, 11 Jun 2018 16:52:18 -0400 Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.rdu2.redhat.com [10.11.54.4]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 4DDE47D668; Mon, 11 Jun 2018 20:52:18 +0000 (UTC) Received: from localhost (ovpn-204-89.brq.redhat.com [10.40.204.89]) by smtp.corp.redhat.com (Postfix) with ESMTPS id DBBA02024CA1; Mon, 11 Jun 2018 20:52:17 +0000 (UTC) From: Max Reitz To: qemu-block@nongnu.org Date: Mon, 11 Jun 2018 22:51:58 +0200 Message-Id: <20180611205203.2624-6-mreitz@redhat.com> In-Reply-To: <20180611205203.2624-1-mreitz@redhat.com> References: <20180611205203.2624-1-mreitz@redhat.com> X-Scanned-By: MIMEDefang 2.78 on 10.11.54.4 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.11.55.2]); Mon, 11 Jun 2018 20:52:18 +0000 (UTC) X-Greylist: inspected by milter-greylist-4.5.16 (mx1.redhat.com [10.11.55.2]); Mon, 11 Jun 2018 20:52:18 +0000 (UTC) for IP:'10.11.54.4' DOMAIN:'int-mx04.intmail.prod.int.rdu2.redhat.com' HELO:'smtp.corp.redhat.com' FROM:'mreitz@redhat.com' RCPT:'' X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 66.187.233.73 Subject: [Qemu-devel] [PATCH v2 05/10] qapi: Formalize qcow encryption probing X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Kevin Wolf , qemu-devel@nongnu.org, Michael Roth , Markus Armbruster , Max Reitz Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" qcow only supports a single encryption (and there is no reason why that would change in the future), so we can make it the default. Signed-off-by: Max Reitz Reviewed-by: Daniel P. Berrang=C3=A9 Reviewed-by: Eric Blake --- qapi/block-core.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/qapi/block-core.json b/qapi/block-core.json index 295ace42ae..98295ac30e 100644 --- a/qapi/block-core.json +++ b/qapi/block-core.json @@ -2647,8 +2647,9 @@ # Since: 2.10 ## { 'union': 'BlockdevQcowEncryption', - 'base': { 'format': 'BlockdevQcowEncryptionFormat' }, + 'base': { '*format': 'BlockdevQcowEncryptionFormat' }, 'discriminator': 'format', + 'default-variant': 'aes', 'data': { 'aes': 'QCryptoBlockOptionsQCow' } } =20 ## --=20 2.17.1 From nobody Mon Apr 29 18:26:54 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.gnu.org (208.118.235.17 [208.118.235.17]) by mx.zohomail.com with SMTPS id 1528750662687738.5040033967944; Mon, 11 Jun 2018 13:57:42 -0700 (PDT) Received: from localhost ([::1]:51316 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fSTsi-0005ph-Ro for importer@patchew.org; Mon, 11 Jun 2018 16:57:40 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:43856) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fSTnh-0001sx-CS for qemu-devel@nongnu.org; Mon, 11 Jun 2018 16:52:30 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1fSTng-0008Jy-Aa for qemu-devel@nongnu.org; Mon, 11 Jun 2018 16:52:29 -0400 Received: from mx3-rdu2.redhat.com ([66.187.233.73]:49984 helo=mx1.redhat.com) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1fSTnY-00088M-NF; Mon, 11 Jun 2018 16:52:20 -0400 Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.rdu2.redhat.com [10.11.54.4]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 302AEBB409; Mon, 11 Jun 2018 20:52:20 +0000 (UTC) Received: from localhost (ovpn-204-89.brq.redhat.com [10.40.204.89]) by smtp.corp.redhat.com (Postfix) with ESMTPS id CE68B2024CA1; Mon, 11 Jun 2018 20:52:19 +0000 (UTC) From: Max Reitz To: qemu-block@nongnu.org Date: Mon, 11 Jun 2018 22:51:59 +0200 Message-Id: <20180611205203.2624-7-mreitz@redhat.com> In-Reply-To: <20180611205203.2624-1-mreitz@redhat.com> References: <20180611205203.2624-1-mreitz@redhat.com> X-Scanned-By: MIMEDefang 2.78 on 10.11.54.4 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.11.55.1]); Mon, 11 Jun 2018 20:52:20 +0000 (UTC) X-Greylist: inspected by milter-greylist-4.5.16 (mx1.redhat.com [10.11.55.1]); Mon, 11 Jun 2018 20:52:20 +0000 (UTC) for IP:'10.11.54.4' DOMAIN:'int-mx04.intmail.prod.int.rdu2.redhat.com' HELO:'smtp.corp.redhat.com' FROM:'mreitz@redhat.com' RCPT:'' X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 66.187.233.73 Subject: [Qemu-devel] [PATCH v2 06/10] qdict: Make qdict_flatten() shallow-clone-friendly X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Kevin Wolf , qemu-devel@nongnu.org, Michael Roth , Markus Armbruster , Max Reitz Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" In its current form, qdict_flatten() removes all entries from nested QDicts that are moved to the root QDict. It is completely sufficient to remove all old entries from the root QDict, however. If the nested dicts have a refcount of 1, this will automatically delete them, too. And if they have a greater refcount, we probably do not want to modify them in the first place. The latter observation means that it was currently (in general) impossible to qdict_flatten() a shallowly cloned dict because that would empty nested QDicts in the original dict as well. This patch changes this, so you can now use qdict_flatten(qdict_shallow_clone(dict)) to get a flattened copy without disturbing the original. Signed-off-by: Max Reitz Reviewed-by: Markus Armbruster --- qobject/block-qdict.c | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/qobject/block-qdict.c b/qobject/block-qdict.c index 0b2ae02627..7e0deb74c5 100644 --- a/qobject/block-qdict.c +++ b/qobject/block-qdict.c @@ -114,19 +114,30 @@ static void qdict_flatten_qdict(QDict *qdict, QDict *= target, const char *prefix) =20 /* * Flatten non-empty QDict and QList recursively into @target, - * copy other objects to @target + * copy other objects to @target. + * On the root level (if @qdict =3D=3D @target), remove flattened + * nested QDicts and QLists from @qdict. + * + * (Note that we do not need to remove entries from nested + * dicts or lists. Their reference count is decremented on + * the root level, so there are no leaks. In fact, if they + * have a reference count greater than one, we are probably + * well advised not to modify them altogether.) */ if (dict_val && qdict_size(dict_val)) { qdict_flatten_qdict(dict_val, target, new_key ? new_key : entry->key); - qdict_del(qdict, entry->key); + if (target =3D=3D qdict) { + qdict_del(qdict, entry->key); + } } else if (list_val && !qlist_empty(list_val)) { qdict_flatten_qlist(list_val, target, new_key ? new_key : entry->key); - qdict_del(qdict, entry->key); + if (target =3D=3D qdict) { + qdict_del(qdict, entry->key); + } } else if (target !=3D qdict) { qdict_put_obj(target, new_key, qobject_ref(value)); - qdict_del(qdict, entry->key); } =20 g_free(new_key); --=20 2.17.1 From nobody Mon Apr 29 18:26:54 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1528750826813390.8710357485395; Mon, 11 Jun 2018 14:00:26 -0700 (PDT) Received: from localhost ([::1]:51331 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fSTvO-0008JE-2L for importer@patchew.org; Mon, 11 Jun 2018 17:00:26 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:43851) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fSTnh-0001sk-4u for qemu-devel@nongnu.org; Mon, 11 Jun 2018 16:52:30 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1fSTng-0008K7-AV for qemu-devel@nongnu.org; Mon, 11 Jun 2018 16:52:29 -0400 Received: from mx3-rdu2.redhat.com ([66.187.233.73]:38824 helo=mx1.redhat.com) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1fSTna-0008Bh-La; Mon, 11 Jun 2018 16:52:22 -0400 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.rdu2.redhat.com [10.11.54.6]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 26B6740BC058; Mon, 11 Jun 2018 20:52:22 +0000 (UTC) Received: from localhost (ovpn-204-89.brq.redhat.com [10.40.204.89]) by smtp.corp.redhat.com (Postfix) with ESMTPS id B90A22035721; Mon, 11 Jun 2018 20:52:21 +0000 (UTC) From: Max Reitz To: qemu-block@nongnu.org Date: Mon, 11 Jun 2018 22:52:00 +0200 Message-Id: <20180611205203.2624-8-mreitz@redhat.com> In-Reply-To: <20180611205203.2624-1-mreitz@redhat.com> References: <20180611205203.2624-1-mreitz@redhat.com> X-Scanned-By: MIMEDefang 2.78 on 10.11.54.6 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.11.55.7]); Mon, 11 Jun 2018 20:52:22 +0000 (UTC) X-Greylist: inspected by milter-greylist-4.5.16 (mx1.redhat.com [10.11.55.7]); Mon, 11 Jun 2018 20:52:22 +0000 (UTC) for IP:'10.11.54.6' DOMAIN:'int-mx06.intmail.prod.int.rdu2.redhat.com' HELO:'smtp.corp.redhat.com' FROM:'mreitz@redhat.com' RCPT:'' X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 66.187.233.73 Subject: [Qemu-devel] [PATCH v2 07/10] tests: Add QDict clone-flatten test X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Kevin Wolf , qemu-devel@nongnu.org, Michael Roth , Markus Armbruster , Max Reitz Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" This new test verifies that qdict_flatten() does not modify a shallow clone of the given QDict. Reviewed-by: Eric Blake Signed-off-by: Max Reitz Reviewed-by: Markus Armbruster --- tests/check-block-qdict.c | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/tests/check-block-qdict.c b/tests/check-block-qdict.c index 1d20fccbd4..478807f839 100644 --- a/tests/check-block-qdict.c +++ b/tests/check-block-qdict.c @@ -125,6 +125,38 @@ static void qdict_flatten_test(void) qobject_unref(root); } =20 +static void qdict_clone_flatten_test(void) +{ + QDict *dict1 =3D qdict_new(); + QDict *dict2 =3D qdict_new(); + QDict *cloned_dict1; + + /* + * Test that we can clone and flatten + * { "a": { "b": 42 } } + * without modifying the clone. + */ + + qdict_put_int(dict2, "b", 42); + qdict_put(dict1, "a", dict2); + + cloned_dict1 =3D qdict_clone_shallow(dict1); + + qdict_flatten(dict1); + + g_assert(qdict_size(dict1) =3D=3D 1); + g_assert(qdict_get_int(dict1, "a.b") =3D=3D 42); + + g_assert(qdict_size(cloned_dict1) =3D=3D 1); + g_assert(qdict_get_qdict(cloned_dict1, "a") =3D=3D dict2); + + g_assert(qdict_size(dict2) =3D=3D 1); + g_assert(qdict_get_int(dict2, "b") =3D=3D 42); + + qobject_unref(dict1); + qobject_unref(cloned_dict1); +} + static void qdict_array_split_test(void) { QDict *test_dict =3D qdict_new(); @@ -674,6 +706,7 @@ int main(int argc, char **argv) =20 g_test_add_func("/public/defaults", qdict_defaults_test); g_test_add_func("/public/flatten", qdict_flatten_test); + g_test_add_func("/public/clone_flatten", qdict_clone_flatten_test); g_test_add_func("/public/array_split", qdict_array_split_test); g_test_add_func("/public/array_entries", qdict_array_entries_test); g_test_add_func("/public/join", qdict_join_test); --=20 2.17.1 From nobody Mon Apr 29 18:26:54 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1528750905700474.5601231420792; Mon, 11 Jun 2018 14:01:45 -0700 (PDT) Received: from localhost ([::1]:51341 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fSTwe-0000wv-RK for importer@patchew.org; Mon, 11 Jun 2018 17:01:44 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:43899) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fSTnj-0001vj-F8 for qemu-devel@nongnu.org; Mon, 11 Jun 2018 16:52:36 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1fSTnh-0008Ly-Jt for qemu-devel@nongnu.org; Mon, 11 Jun 2018 16:52:31 -0400 Received: from mx3-rdu2.redhat.com ([66.187.233.73]:45980 helo=mx1.redhat.com) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1fSTnc-0008EQ-LQ; Mon, 11 Jun 2018 16:52:24 -0400 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.rdu2.redhat.com [10.11.54.6]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 32BF0808255C; Mon, 11 Jun 2018 20:52:24 +0000 (UTC) Received: from localhost (ovpn-204-89.brq.redhat.com [10.40.204.89]) by smtp.corp.redhat.com (Postfix) with ESMTPS id A78DC2035721; Mon, 11 Jun 2018 20:52:23 +0000 (UTC) From: Max Reitz To: qemu-block@nongnu.org Date: Mon, 11 Jun 2018 22:52:01 +0200 Message-Id: <20180611205203.2624-9-mreitz@redhat.com> In-Reply-To: <20180611205203.2624-1-mreitz@redhat.com> References: <20180611205203.2624-1-mreitz@redhat.com> X-Scanned-By: MIMEDefang 2.78 on 10.11.54.6 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.11.55.8]); Mon, 11 Jun 2018 20:52:24 +0000 (UTC) X-Greylist: inspected by milter-greylist-4.5.16 (mx1.redhat.com [10.11.55.8]); Mon, 11 Jun 2018 20:52:24 +0000 (UTC) for IP:'10.11.54.6' DOMAIN:'int-mx06.intmail.prod.int.rdu2.redhat.com' HELO:'smtp.corp.redhat.com' FROM:'mreitz@redhat.com' RCPT:'' X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 66.187.233.73 Subject: [Qemu-devel] [PATCH v2 08/10] block: Try to create well typed json:{} filenames X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Kevin Wolf , qemu-devel@nongnu.org, Michael Roth , Markus Armbruster , Max Reitz Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" By applying a health mix of qdict_flatten(), qdict_crumple(), qdict_stringify_for_keyval(), the keyval input visitor, and the QObject output visitor (not necessarily in that order), we can at least try to bring bs->full_open_options into accordance with the QAPI schema. This may not always work (there are some options left that have not been QAPI-fied yet), but in practice it usually will. In any case, sometimes emitting wrongly typed json:{} filenames is better than doing it effectively half the time. This affects some iotests because json:{} filenames are now usually crumpled. In 198, "format": "auto" now appears in the qcow2 encryption options because going through a visitor makes optional discriminators' default values explicit. Buglink: https://bugzilla.redhat.com/show_bug.cgi?id=3D1534396 Signed-off-by: Max Reitz --- block.c | 66 +++++++++++++++++++++++++++++++++++++- tests/qemu-iotests/059.out | 2 +- tests/qemu-iotests/099.out | 4 +-- tests/qemu-iotests/110.out | 2 +- tests/qemu-iotests/198.out | 4 +-- tests/qemu-iotests/207.out | 10 +++--- 6 files changed, 76 insertions(+), 12 deletions(-) diff --git a/block.c b/block.c index afe30caac3..6d7567b46e 100644 --- a/block.c +++ b/block.c @@ -36,6 +36,7 @@ #include "qapi/qmp/qjson.h" #include "qapi/qmp/qnull.h" #include "qapi/qmp/qstring.h" +#include "qapi/qobject-input-visitor.h" #include "qapi/qobject-output-visitor.h" #include "qapi/qapi-visit-block-core.h" #include "sysemu/block-backend.h" @@ -5158,6 +5159,56 @@ static bool append_open_options(QDict *d, BlockDrive= rState *bs) return found_any; } =20 +/** + * Take a blockdev @options QDict and convert its values to the + * correct type. + * + * Fail if @options does not match the QAPI schema of BlockdevOptions. + * + * In case of failure, return NULL and set @errp. + * + * In case of success, return a correctly typed new QDict. + */ +static QDict *bdrv_type_blockdev_opts(const QDict *options, Error **errp) +{ + Visitor *v; + BlockdevOptions *blockdev_options; + QObject *typed_opts; + QDict *string_options; + Error *local_err =3D NULL; + + string_options =3D qdict_clone_shallow(options); + + qdict_flatten(string_options); + v =3D qobject_input_visitor_new_flat_confused(string_options, errp); + if (!v) { + error_prepend(errp, "Failed to prepare options: "); + return NULL; + } + + visit_type_BlockdevOptions(v, NULL, &blockdev_options, &local_err); + visit_free(v); + if (local_err) { + error_propagate(errp, local_err); + error_prepend(errp, "Not a valid BlockdevOptions object: "); + return NULL; + } + + v =3D qobject_output_visitor_new(&typed_opts); + visit_type_BlockdevOptions(v, NULL, &blockdev_options, &local_err); + if (!local_err) { + visit_complete(v, &typed_opts); + } + visit_free(v); + qapi_free_BlockdevOptions(blockdev_options); + if (local_err) { + error_propagate(errp, local_err); + return NULL; + } + + return qobject_to(QDict, typed_opts); +} + /* Updates the following BDS fields: * - exact_filename: A filename which may be used for opening a block dev= ice * which (mostly) equals the given BDS (even without any @@ -5259,10 +5310,23 @@ void bdrv_refresh_filename(BlockDriverState *bs) if (bs->exact_filename[0]) { pstrcpy(bs->filename, sizeof(bs->filename), bs->exact_filename); } else if (bs->full_open_options) { - QString *json =3D qobject_to_json(QOBJECT(bs->full_open_options)); + QString *json; + QDict *typed_opts, *json_opts; + + typed_opts =3D bdrv_type_blockdev_opts(bs->full_open_options, NULL= ); + + /* We cannot be certain that bs->full_open_options matches + * BlockdevOptions, so bdrv_type_blockdev_opts() may fail. + * That is not fatal, we can just emit bs->full_open_options + * directly -- qemu will accept that, even if it does not + * match the schema. */ + json_opts =3D typed_opts ?: bs->full_open_options; + + json =3D qobject_to_json(QOBJECT(json_opts)); snprintf(bs->filename, sizeof(bs->filename), "json:%s", qstring_get_str(json)); qobject_unref(json); + qobject_unref(typed_opts); } } =20 diff --git a/tests/qemu-iotests/059.out b/tests/qemu-iotests/059.out index f6dce7947c..0238b9e9a8 100644 --- a/tests/qemu-iotests/059.out +++ b/tests/qemu-iotests/059.out @@ -2050,7 +2050,7 @@ wrote 512/512 bytes at offset 10240 =20 =3D=3D=3D Testing monolithicFlat with internally generated JSON file name = =3D=3D=3D Formatting 'TEST_DIR/t.IMGFMT', fmt=3DIMGFMT size=3D67108864 subformat=3Dm= onolithicFlat -can't open: Cannot use relative extent paths with VMDK descriptor file 'js= on:{"image": {"driver": "file", "filename": "TEST_DIR/t.IMGFMT"}, "driver":= "blkdebug", "inject-error.0.event": "read_aio"}' +can't open: Cannot use relative extent paths with VMDK descriptor file 'js= on:{"inject-error": [{"event": "read_aio"}], "image": {"driver": "file", "f= ilename": "TEST_DIR/t.IMGFMT"}, "driver": "blkdebug"}' =20 =3D=3D=3D Testing version 3 =3D=3D=3D image: TEST_DIR/iotest-version3.IMGFMT diff --git a/tests/qemu-iotests/099.out b/tests/qemu-iotests/099.out index 8cce627529..0a9c434148 100644 --- a/tests/qemu-iotests/099.out +++ b/tests/qemu-iotests/099.out @@ -12,11 +12,11 @@ blkverify:TEST_DIR/t.IMGFMT.compare:TEST_DIR/t.IMGFMT =20 =3D=3D=3D Testing JSON filename for blkdebug =3D=3D=3D =20 -json:{"driver": "IMGFMT", "file": {"image": {"driver": "file", "filename":= "TEST_DIR/t.IMGFMT"}, "driver": "blkdebug", "inject-error.0.event": "l1_up= date"}} +json:{"driver": "IMGFMT", "file": {"inject-error": [{"event": "l1_update"}= ], "image": {"driver": "file", "filename": "TEST_DIR/t.IMGFMT"}, "driver": = "blkdebug"}} =20 =3D=3D=3D Testing indirectly enforced JSON filename =3D=3D=3D =20 -json:{"driver": "raw", "file": {"test": {"driver": "IMGFMT", "file": {"ima= ge": {"driver": "file", "filename": "TEST_DIR/t.IMGFMT"}, "driver": "blkdeb= ug", "inject-error.0.event": "l1_update"}}, "driver": "blkverify", "raw": {= "driver": "file", "filename": "TEST_DIR/t.IMGFMT.compare"}}} +json:{"driver": "raw", "file": {"test": {"driver": "IMGFMT", "file": {"inj= ect-error": [{"event": "l1_update"}], "image": {"driver": "file", "filename= ": "TEST_DIR/t.IMGFMT"}, "driver": "blkdebug"}}, "driver": "blkverify", "ra= w": {"driver": "file", "filename": "TEST_DIR/t.IMGFMT.compare"}}} =20 =3D=3D=3D Testing plain filename for blkdebug =3D=3D=3D =20 diff --git a/tests/qemu-iotests/110.out b/tests/qemu-iotests/110.out index b3584ff87f..fa19315dfb 100644 --- a/tests/qemu-iotests/110.out +++ b/tests/qemu-iotests/110.out @@ -11,7 +11,7 @@ backing file: t.IMGFMT.base (actual path: TEST_DIR/t.IMGF= MT.base) =20 =3D=3D=3D Non-reconstructable filename =3D=3D=3D =20 -image: json:{"driver": "IMGFMT", "file": {"set-state.0.event": "read_aio",= "image": {"driver": "file", "filename": "TEST_DIR/t.IMGFMT"}, "driver": "b= lkdebug", "set-state.0.new_state": 42}} +image: json:{"driver": "IMGFMT", "file": {"set-state": [{"new_state": 42, = "event": "read_aio"}], "image": {"driver": "file", "filename": "TEST_DIR/t.= IMGFMT"}, "driver": "blkdebug"}} file format: IMGFMT virtual size: 64M (67108864 bytes) backing file: t.IMGFMT.base (cannot determine actual path) diff --git a/tests/qemu-iotests/198.out b/tests/qemu-iotests/198.out index adb805cce9..a3cb530a0c 100644 --- a/tests/qemu-iotests/198.out +++ b/tests/qemu-iotests/198.out @@ -32,7 +32,7 @@ read 16777216/16777216 bytes at offset 0 16 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) =20 =3D=3D checking image base =3D=3D -image: json:{"encrypt.key-secret": "sec0", "driver": "IMGFMT", "file": {"d= river": "file", "filename": "TEST_DIR/t.IMGFMT.base"}} +image: json:{"driver": "IMGFMT", "encrypt": {"format": "auto", "key-secret= ": "sec0"}, "file": {"driver": "file", "filename": "TEST_DIR/t.IMGFMT.base"= }} file format: IMGFMT virtual size: 16M (16777216 bytes) Format specific information: @@ -74,7 +74,7 @@ Format specific information: master key iters: 1024 =20 =3D=3D checking image layer =3D=3D -image: json:{"encrypt.key-secret": "sec1", "driver": "IMGFMT", "file": {"d= river": "file", "filename": "TEST_DIR/t.IMGFMT"}} +image: json:{"driver": "IMGFMT", "encrypt": {"format": "auto", "key-secret= ": "sec1"}, "file": {"driver": "file", "filename": "TEST_DIR/t.IMGFMT"}} file format: IMGFMT virtual size: 16M (16777216 bytes) backing file: TEST_DIR/t.IMGFMT.base diff --git a/tests/qemu-iotests/207.out b/tests/qemu-iotests/207.out index 078b7e63cb..993417a77e 100644 --- a/tests/qemu-iotests/207.out +++ b/tests/qemu-iotests/207.out @@ -5,7 +5,7 @@ {'execute': 'job-dismiss', 'arguments': {'id': 'job0'}} {u'return': {}} =20 -image: json:{"driver": "IMGFMT", "file": {"server.host": "127.0.0.1", "ser= ver.port": "22", "driver": "ssh", "path": "TEST_IMG"}} +image: json:{"driver": "IMGFMT", "file": {"driver": "ssh", "path": "TEST_I= MG", "server": {"port": "22", "host": "127.0.0.1"}}} file format: IMGFMT virtual size: 4.0M (4194304 bytes) =20 @@ -21,7 +21,7 @@ virtual size: 4.0M (4194304 bytes) {'execute': 'job-dismiss', 'arguments': {'id': 'job0'}} {u'return': {}} =20 -image: json:{"driver": "IMGFMT", "file": {"server.host": "127.0.0.1", "ser= ver.port": "22", "driver": "ssh", "path": "TEST_IMG"}} +image: json:{"driver": "IMGFMT", "file": {"driver": "ssh", "path": "TEST_I= MG", "server": {"port": "22", "host": "127.0.0.1"}}} file format: IMGFMT virtual size: 8.0M (8388608 bytes) =20 @@ -30,7 +30,7 @@ virtual size: 8.0M (8388608 bytes) {'execute': 'job-dismiss', 'arguments': {'id': 'job0'}} {u'return': {}} =20 -image: json:{"driver": "IMGFMT", "file": {"server.host": "127.0.0.1", "ser= ver.port": "22", "driver": "ssh", "path": "TEST_IMG"}} +image: json:{"driver": "IMGFMT", "file": {"driver": "ssh", "path": "TEST_I= MG", "server": {"port": "22", "host": "127.0.0.1"}}} file format: IMGFMT virtual size: 4.0M (4194304 bytes) =20 @@ -45,7 +45,7 @@ Job failed: remote host key does not match host_key_check= 'wrong' {'execute': 'job-dismiss', 'arguments': {'id': 'job0'}} {u'return': {}} =20 -image: json:{"driver": "IMGFMT", "file": {"server.host": "127.0.0.1", "ser= ver.port": "22", "driver": "ssh", "path": "TEST_IMG"}} +image: json:{"driver": "IMGFMT", "file": {"driver": "ssh", "path": "TEST_I= MG", "server": {"port": "22", "host": "127.0.0.1"}}} file format: IMGFMT virtual size: 8.0M (8388608 bytes) =20 @@ -60,7 +60,7 @@ Job failed: remote host key does not match host_key_check= 'wrong' {'execute': 'job-dismiss', 'arguments': {'id': 'job0'}} {u'return': {}} =20 -image: json:{"driver": "IMGFMT", "file": {"server.host": "127.0.0.1", "ser= ver.port": "22", "driver": "ssh", "path": "TEST_IMG"}} +image: json:{"driver": "IMGFMT", "file": {"driver": "ssh", "path": "TEST_I= MG", "server": {"port": "22", "host": "127.0.0.1"}}} file format: IMGFMT virtual size: 4.0M (4194304 bytes) =20 --=20 2.17.1 From nobody Mon Apr 29 18:26:54 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1528751034141393.0704941086401; Mon, 11 Jun 2018 14:03:54 -0700 (PDT) Received: from localhost ([::1]:51358 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fSTyj-0002WD-Bo for importer@patchew.org; Mon, 11 Jun 2018 17:03:53 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:43897) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fSTnj-0001vg-D7 for qemu-devel@nongnu.org; Mon, 11 Jun 2018 16:52:36 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1fSTni-0008NW-BH for qemu-devel@nongnu.org; Mon, 11 Jun 2018 16:52:31 -0400 Received: from mx3-rdu2.redhat.com ([66.187.233.73]:45986 helo=mx1.redhat.com) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1fSTnf-0008Ir-RV; Mon, 11 Jun 2018 16:52:27 -0400 Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.rdu2.redhat.com [10.11.54.3]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 4F882808255C; Mon, 11 Jun 2018 20:52:27 +0000 (UTC) Received: from localhost (ovpn-204-89.brq.redhat.com [10.40.204.89]) by smtp.corp.redhat.com (Postfix) with ESMTPS id EB1C61134CA0; Mon, 11 Jun 2018 20:52:26 +0000 (UTC) From: Max Reitz To: qemu-block@nongnu.org Date: Mon, 11 Jun 2018 22:52:02 +0200 Message-Id: <20180611205203.2624-10-mreitz@redhat.com> In-Reply-To: <20180611205203.2624-1-mreitz@redhat.com> References: <20180611205203.2624-1-mreitz@redhat.com> X-Scanned-By: MIMEDefang 2.78 on 10.11.54.3 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.11.55.8]); Mon, 11 Jun 2018 20:52:27 +0000 (UTC) X-Greylist: inspected by milter-greylist-4.5.16 (mx1.redhat.com [10.11.55.8]); Mon, 11 Jun 2018 20:52:27 +0000 (UTC) for IP:'10.11.54.3' DOMAIN:'int-mx03.intmail.prod.int.rdu2.redhat.com' HELO:'smtp.corp.redhat.com' FROM:'mreitz@redhat.com' RCPT:'' X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 66.187.233.73 Subject: [Qemu-devel] [PATCH v2 09/10] iotests: Test internal option typing X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Kevin Wolf , qemu-devel@nongnu.org, Michael Roth , Markus Armbruster , Max Reitz Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" It would be nice if qemu used the correct types for blockdev options internally, even if the user specified string values (either through -drive or by being not so nice and using json:{} with string values). This patch adds a test verifying that fact. Signed-off-by: Max Reitz --- tests/qemu-iotests/089 | 25 +++++++++++++++++++++++++ tests/qemu-iotests/089.out | 9 +++++++++ 2 files changed, 34 insertions(+) diff --git a/tests/qemu-iotests/089 b/tests/qemu-iotests/089 index aa1ba4a98e..0682d08f39 100755 --- a/tests/qemu-iotests/089 +++ b/tests/qemu-iotests/089 @@ -36,6 +36,7 @@ trap "_cleanup; exit \$status" 0 1 2 3 15 # get standard environment, filters and checks . ./common.rc . ./common.filter +. ./common.qemu =20 _supported_fmt qcow2 _supported_proto file @@ -145,6 +146,30 @@ $QEMU_IO -c "open -o driver=3Dqcow2 json:{\"file.filen= ame\":\"$TEST_IMG\"}" \ $QEMU_IO -c "open -o driver=3Dqcow2 json:{\"driver\":\"raw\",\"file.filena= me\":\"$TEST_IMG\"}" \ -c "info" 2>&1 | _filter_img_info =20 +echo +echo "=3D=3D=3D Testing option typing =3D=3D=3D" +echo + +# json:{} accepts both strings and correctly typed values (even mixed, +# although we probably do not want to support that...), but when +# creating a json:{} filename, it should be correctly typed. +# Therefore, both of these should make the "size" value an integer. + +TEST_IMG=3D"json:{'driver': 'null-co', 'size': 42 }" _img_info | grep '^i= mage' +TEST_IMG=3D"json:{'driver': 'null-co', 'size': '42'}" _img_info | grep '^i= mage' + +echo + +# This should even work when some driver abuses bs->options to store +# non-QAPI options (and the given -drive options are not complete) +# (Watch for whether file.align appears as an int or a string) +qemu_comm_method=3Dmonitor _launch_qemu \ + -drive if=3Dnone,id=3Ddrv0,node-name=3Dnode0,format=3Draw,file=3Dblkde= bug::null-co://,file.align=3D512 + +_send_qemu_cmd $QEMU_HANDLE 'info block' 'json:' + +_cleanup_qemu + =20 # success, all done echo "*** done" diff --git a/tests/qemu-iotests/089.out b/tests/qemu-iotests/089.out index 89e3e4340a..35ffbabe77 100644 --- a/tests/qemu-iotests/089.out +++ b/tests/qemu-iotests/089.out @@ -49,4 +49,13 @@ vm state offset: 512 MiB format name: IMGFMT cluster size: 64 KiB vm state offset: 512 MiB + +=3D=3D=3D Testing option typing =3D=3D=3D + +image: json:{"driver": "null-co", "size": 42} +image: json:{"driver": "null-co", "size": 42} + +QEMU X.Y.Z monitor - type 'help' for more information +(qemu) info block +drv0 (node0): json:{"driver": "raw", "file": {"image": {"driver": "null-co= "}, "driver": "blkdebug", "align": 512}} (raw) *** done --=20 2.17.1 From nobody Mon Apr 29 18:26:54 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1528750844424362.52485499015165; Mon, 11 Jun 2018 14:00:44 -0700 (PDT) Received: from localhost ([::1]:51333 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fSTva-0008Tk-HA for importer@patchew.org; Mon, 11 Jun 2018 17:00:38 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:43958) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fSTnp-00021v-Bd for qemu-devel@nongnu.org; Mon, 11 Jun 2018 16:52:38 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1fSTno-0008WT-BP for qemu-devel@nongnu.org; Mon, 11 Jun 2018 16:52:37 -0400 Received: from mx3-rdu2.redhat.com ([66.187.233.73]:47834 helo=mx1.redhat.com) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1fSTnh-0008Lh-Pr; Mon, 11 Jun 2018 16:52:29 -0400 Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.rdu2.redhat.com [10.11.54.3]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 3C69B7D668; Mon, 11 Jun 2018 20:52:29 +0000 (UTC) Received: from localhost (ovpn-204-89.brq.redhat.com [10.40.204.89]) by smtp.corp.redhat.com (Postfix) with ESMTPS id D75531134CA0; Mon, 11 Jun 2018 20:52:28 +0000 (UTC) From: Max Reitz To: qemu-block@nongnu.org Date: Mon, 11 Jun 2018 22:52:03 +0200 Message-Id: <20180611205203.2624-11-mreitz@redhat.com> In-Reply-To: <20180611205203.2624-1-mreitz@redhat.com> References: <20180611205203.2624-1-mreitz@redhat.com> X-Scanned-By: MIMEDefang 2.78 on 10.11.54.3 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.11.55.2]); Mon, 11 Jun 2018 20:52:29 +0000 (UTC) X-Greylist: inspected by milter-greylist-4.5.16 (mx1.redhat.com [10.11.55.2]); Mon, 11 Jun 2018 20:52:29 +0000 (UTC) for IP:'10.11.54.3' DOMAIN:'int-mx03.intmail.prod.int.rdu2.redhat.com' HELO:'smtp.corp.redhat.com' FROM:'mreitz@redhat.com' RCPT:'' X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 66.187.233.73 Subject: [Qemu-devel] [PATCH v2 10/10] iotests: qcow2's encrypt.format is now optional X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Kevin Wolf , qemu-devel@nongnu.org, Michael Roth , Markus Armbruster , Max Reitz Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Remove the encrypt.format option from the two blockdev-add test cases for encrypted qcow2 images in 087 to explicitly test that this parameter is now optional. Additionally, show that explicitly specifying encrypt.format=3Dauto works just as well, the same for specifying the correct format (encrypt.format=3Dluks here), and that specifying the wrong format (encrypt.format=3Daes) results in an error. While touching this test case, reduce the LUKS iteration time to 10 so the test stays reasonably fast. Signed-off-by: Max Reitz Reviewed-by: Daniel P. Berrang=C3=A9 --- tests/qemu-iotests/087 | 65 +++++++++++++++++++++++--------------- tests/qemu-iotests/087.out | 26 ++++++++++++++- 2 files changed, 64 insertions(+), 27 deletions(-) diff --git a/tests/qemu-iotests/087 b/tests/qemu-iotests/087 index 2561a14456..a267adf568 100755 --- a/tests/qemu-iotests/087 +++ b/tests/qemu-iotests/087 @@ -150,7 +150,6 @@ run_qemu <