e8512dfa | 27-May-2020 |
Markus Armbruster <armbru@redhat.com> |
qom: Constify object_get_canonical_path{,_component}()'s parameter
Suggested-by: Eric Blake <eblake@redhat.com> Signed-off-by: Markus Armbruster <armbru@redhat.com> Message-Id: <20200527084754.7531-
qom: Constify object_get_canonical_path{,_component}()'s parameter
Suggested-by: Eric Blake <eblake@redhat.com> Signed-off-by: Markus Armbruster <armbru@redhat.com> Message-Id: <20200527084754.7531-2-armbru@redhat.com> Reviewed-by: Cédric Le Goater <clg@kaod.org> Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
show more ...
|
c5e18709 | 12-May-2020 |
Masahiro Yamada <masahiroy@kernel.org> |
qom/container: remove .instance_size initializer from container_info
You can omit .instance_size if it is the same as that of the parent.
.class_size = sizeof(ObjectClass)
... is omitted here,
qom/container: remove .instance_size initializer from container_info
You can omit .instance_size if it is the same as that of the parent.
.class_size = sizeof(ObjectClass)
... is omitted here, so removing .instance_size is more consistent.
Signed-off-by: Masahiro Yamada <masahiroy@kernel.org> Message-Id: <20200513033600.2709646-1-masahiroy@kernel.org> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
show more ...
|
e27a9595 | 12-May-2020 |
Masahiro Yamada <masahiroy@kernel.org> |
qom/object: pass (Object *) to object_initialize_with_type()
object_new_with_type() already passes (Object *) pointer. Avoid casting back and forth.
Signed-off-by: Masahiro Yamada <masahiroy@kernel
qom/object: pass (Object *) to object_initialize_with_type()
object_new_with_type() already passes (Object *) pointer. Avoid casting back and forth.
Signed-off-by: Masahiro Yamada <masahiroy@kernel.org> Message-Id: <20200512173104.2293073-1-masahiroy@kernel.org> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
show more ...
|
3d91293e | 12-May-2020 |
Masahiro Yamada <masahiroy@kernel.org> |
qom/object: simplify type_initialize_interface()
iface_impl->class is the same as new_iface. Make it more readable.
Signed-off-by: Masahiro Yamada <masahiroy@kernel.org> Message-Id: <20200512182501
qom/object: simplify type_initialize_interface()
iface_impl->class is the same as new_iface. Make it more readable.
Signed-off-by: Masahiro Yamada <masahiroy@kernel.org> Message-Id: <20200512182501.2300530-1-masahiroy@kernel.org> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
show more ...
|
e5a0cc5e | 12-May-2020 |
Masahiro Yamada <masahiroy@kernel.org> |
qom/object: factor out the initialization of hash table of properties
Properties are not related to the initialization of interfaces.
The initialization of the hash table can be moved after the if-
qom/object: factor out the initialization of hash table of properties
Properties are not related to the initialization of interfaces.
The initialization of the hash table can be moved after the if-block, and unified.
Signed-off-by: Masahiro Yamada <masahiroy@kernel.org> Message-Id: <20200512172615.2291999-1-masahiroy@kernel.org> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
show more ...
|
ad195c8f | 09-May-2020 |
Masahiro Yamada <masahiroy@kernel.org> |
qom: remove index from object_resolve_abs_path()
You can advance 'parts' to track the current path fragment. The 'index' parameter is unneeded.
Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
qom: remove index from object_resolve_abs_path()
You can advance 'parts' to track the current path fragment. The 'index' parameter is unneeded.
Signed-off-by: Masahiro Yamada <masahiroy@kernel.org> Message-Id: <20200510013235.954906-1-masahiroy@kernel.org> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
show more ...
|
4a39181d | 04-Apr-2020 |
Cédric Le Goater <clg@kaod.org> |
qom/object: Fix object_child_foreach_recursive() return value
When recursing, the return value of do_object_child_foreach() is not taken into account.
Cc: Peter Crosthwaite <peter.crosthwaite@xilin
qom/object: Fix object_child_foreach_recursive() return value
When recursing, the return value of do_object_child_foreach() is not taken into account.
Cc: Peter Crosthwaite <peter.crosthwaite@xilinx.com> Fixes: d714b8de7747 ("qom: Add recursive version of object_child_for_each") Signed-off-by: Cédric Le Goater <clg@kaod.org> Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com> Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com> Message-Id: <20200404153340.164861-1-clg@kaod.org> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
show more ...
|
7d2ef6dc | 20-May-2020 |
Dr. David Alan Gilbert <dgilbert@redhat.com> |
hmp: Simplify qom-set
Simplify qom_set by making it use qmp_qom_set and the JSON parser.
(qemu) qom-get /machine smm "auto" (qemu) qom-set /machine smm "auto"
Signed-off-by: Dr. David Alan Gilbert
hmp: Simplify qom-set
Simplify qom_set by making it use qmp_qom_set and the JSON parser.
(qemu) qom-get /machine smm "auto" (qemu) qom-set /machine smm "auto"
Signed-off-by: Dr. David Alan Gilbert <dgilbert@redhat.com> Message-Id: <20200520151108.160598-3-dgilbert@redhat.com> Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com> Reviewed-by: Markus Armbruster <armbru@redhat.com> Signed-off-by: Dr. David Alan Gilbert <dgilbert@redhat.com> With 's'->'S' type change suggested by Paolo and Markus
show more ...
|
89cf4fe3 | 20-May-2020 |
Dr. David Alan Gilbert <dgilbert@redhat.com> |
hmp: Implement qom-get HMP command
This started off as Andreas Färber's implementation from March 2015, but after feedback from Paolo and Markus it morphed into using the json output which handles s
hmp: Implement qom-get HMP command
This started off as Andreas Färber's implementation from March 2015, but after feedback from Paolo and Markus it morphed into using the json output which handles structs reasonably.
Use with qom-list to find the members of an object.
(qemu) qom-get /backend/console[0]/device/vga.rom[0] size 65536 (qemu) qom-get /machine smm "auto" (qemu) qom-get /machine rtc-time { "tm_year": 120, "tm_sec": 51, "tm_hour": 9, "tm_min": 50, "tm_mon": 4, "tm_mday": 20 } (qemu) qom-get /machine frob Error: Property '.frob' not found
Signed-off-by: Dr. David Alan Gilbert <dgilbert@redhat.com> Message-Id: <20200520151108.160598-2-dgilbert@redhat.com> Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com> Reviewed-by: Markus Armbruster <armbru@redhat.com> Signed-off-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
show more ...
|
688ffbb4 | 12-May-2020 |
Philippe Mathieu-Daudé <f4bug@amsat.org> |
various: Remove unnecessary OBJECT() cast
The OBJECT() macro is defined as:
#define OBJECT(obj) ((Object *)(obj))
Remove the unnecessary OBJECT() casts when we already know the pointer is of Obj
various: Remove unnecessary OBJECT() cast
The OBJECT() macro is defined as:
#define OBJECT(obj) ((Object *)(obj))
Remove the unnecessary OBJECT() casts when we already know the pointer is of Object type.
Patch created mechanically using spatch with this script:
@@ typedef Object; Object *o; @@ - OBJECT(o) + o
Acked-by: Cornelia Huck <cohuck@redhat.com> Acked-by: Corey Minyard <cminyard@mvista.com> Acked-by: John Snow <jsnow@redhat.com> Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org> Message-Id: <20200512070020.22782-3-f4bug@amsat.org> [Trivial rebase conflict in hw/s390x/sclp.c resolved]
show more ...
|
df4fe0b2 | 05-May-2020 |
Markus Armbruster <armbru@redhat.com> |
qom: Drop @errp parameter of object_property_del()
Same story as for object_property_add(): the only way object_property_del() can fail is when the property with this name does not exist. Since our
qom: Drop @errp parameter of object_property_del()
Same story as for object_property_add(): the only way object_property_del() can fail is when the property with this name does not exist. Since our property names are all hardcoded, failure is a programming error, and the appropriate way to handle it is passing &error_abort. Most callers do that, the commit before previous fixed one that didn't (and got the error handling wrong), and the two remaining exceptions ignore errors.
Drop the @errp parameter.
Signed-off-by: Markus Armbruster <armbru@redhat.com> Reviewed-by: Paolo Bonzini <pbonzini@redhat.com> Message-Id: <20200505152926.18877-19-armbru@redhat.com> Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
show more ...
|
d2623129 | 05-May-2020 |
Markus Armbruster <armbru@redhat.com> |
qom: Drop parameter @errp of object_property_add() & friends
The only way object_property_add() can fail is when a property with the same name already exists. Since our property names are all hardc
qom: Drop parameter @errp of object_property_add() & friends
The only way object_property_add() can fail is when a property with the same name already exists. Since our property names are all hardcoded, failure is a programming error, and the appropriate way to handle it is passing &error_abort.
Same for its variants, except for object_property_add_child(), which additionally fails when the child already has a parent. Parentage is also under program control, so this is a programming error, too.
We have a bit over 500 callers. Almost half of them pass &error_abort, slightly fewer ignore errors, one test case handles errors, and the remaining few callers pass them to their own callers.
The previous few commits demonstrated once again that ignoring programming errors is a bad idea.
Of the few ones that pass on errors, several violate the Error API. The Error ** argument must be NULL, &error_abort, &error_fatal, or a pointer to a variable containing NULL. Passing an argument of the latter kind twice without clearing it in between is wrong: if the first call sets an error, it no longer points to NULL for the second call. ich9_pm_add_properties(), sparc32_ledma_realize(), sparc32_dma_realize(), xilinx_axidma_realize(), xilinx_enet_realize() are wrong that way.
When the one appropriate choice of argument is &error_abort, letting users pick the argument is a bad idea.
Drop parameter @errp and assert the preconditions instead.
There's one exception to "duplicate property name is a programming error": the way object_property_add() implements the magic (and undocumented) "automatic arrayification". Don't drop @errp there. Instead, rename object_property_add() to object_property_try_add(), and add the obvious wrapper object_property_add().
Signed-off-by: Markus Armbruster <armbru@redhat.com> Reviewed-by: Eric Blake <eblake@redhat.com> Reviewed-by: Paolo Bonzini <pbonzini@redhat.com> Message-Id: <20200505152926.18877-15-armbru@redhat.com> [Two semantic rebase conflicts resolved]
show more ...
|
7eecec7d | 05-May-2020 |
Markus Armbruster <armbru@redhat.com> |
qom: Drop object_property_set_description() parameter @errp
object_property_set_description() and object_class_property_set_description() fail only when property @name is not found.
There are 85 ca
qom: Drop object_property_set_description() parameter @errp
object_property_set_description() and object_class_property_set_description() fail only when property @name is not found.
There are 85 calls of object_property_set_description() and object_class_property_set_description(). None of them can fail:
* 84 immediately follow the creation of the property.
* The one in spapr_rng_instance_init() refers to a property created in spapr_rng_class_init(), from spapr_rng_properties[].
Every one of them still gets to decide what to pass for @errp.
51 calls pass &error_abort, 32 calls pass NULL, one receives the error and propagates it to &error_abort, and one propagates it to &error_fatal. I'm actually surprised none of them violates the Error API.
What are we gaining by letting callers handle the "property not found" error? Use when the property is not known to exist is simpler: you don't have to guard the call with a check. We haven't found such a use in 5+ years. Until we do, let's make life a bit simpler and drop the @errp parameter.
Signed-off-by: Markus Armbruster <armbru@redhat.com> Reviewed-by: Eric Blake <eblake@redhat.com> Reviewed-by: Paolo Bonzini <pbonzini@redhat.com> Message-Id: <20200505152926.18877-8-armbru@redhat.com> [One semantic rebase conflict resolved]
show more ...
|
70251887 | 05-May-2020 |
Markus Armbruster <armbru@redhat.com> |
qom: Make all the object_property_add_FOO() return the property
Some object_property_add_FOO() return the newly added property, some don't. Clean that up.
Signed-off-by: Markus Armbruster <armbru@
qom: Make all the object_property_add_FOO() return the property
Some object_property_add_FOO() return the newly added property, some don't. Clean that up.
Signed-off-by: Markus Armbruster <armbru@redhat.com> Reviewed-by: Eric Blake <eblake@redhat.com> Reviewed-by: Paolo Bonzini <pbonzini@redhat.com> Message-Id: <20200505152926.18877-7-armbru@redhat.com>
show more ...
|
44a17fe0 | 05-May-2020 |
Markus Armbruster <armbru@redhat.com> |
qom: Drop convenience method object_property_get_uint16List()
qom/object.c provides object_property_get_TYPE() and object_property_set_TYPE() for a number of common types. These are all convenience
qom: Drop convenience method object_property_get_uint16List()
qom/object.c provides object_property_get_TYPE() and object_property_set_TYPE() for a number of common types. These are all convenience wrappers around object_property_get_qobject() and object_property_set_qobject().
Except for object_property_get_uint16List(), which is unusual in two ways:
* It bypasses object_property_get_qobject(). Fixable; the previous commit did it for object_property_get_enum())
* It stores the value through a parameter. Its contract claims it returns the value, like the other functions do. Also fixable.
Fixing is not worthwhile, though: object_property_get_uint16List() has seen exactly one user in six years.
Convert the lone user to do its job with the generic object_property_get_qobject(), and drop object_property_get_uint16List().
Signed-off-by: Markus Armbruster <armbru@redhat.com> Message-Id: <20200505152926.18877-6-armbru@redhat.com> Reviewed-by: Paolo Bonzini <pbonzini@redhat.com> [Commit message typo fixed]
show more ...
|
b555f89f | 05-May-2020 |
Markus Armbruster <armbru@redhat.com> |
qom: Simplify object_property_get_enum()
Reuse object_property_get_str(). Switches from the string to the qobject visitor under the hood.
Signed-off-by: Markus Armbruster <armbru@redhat.com> Messa
qom: Simplify object_property_get_enum()
Reuse object_property_get_str(). Switches from the string to the qobject visitor under the hood.
Signed-off-by: Markus Armbruster <armbru@redhat.com> Message-Id: <20200505152926.18877-5-armbru@redhat.com> Reviewed-by: Paolo Bonzini <pbonzini@redhat.com>
show more ...
|
f73a32a5 | 05-May-2020 |
Markus Armbruster <armbru@redhat.com> |
qom: Drop object_property_del_child()'s unused parameter @errp
Signed-off-by: Markus Armbruster <armbru@redhat.com> Reviewed-by: Eric Blake <eblake@redhat.com> Reviewed-by: Paolo Bonzini <pbonzini@r
qom: Drop object_property_del_child()'s unused parameter @errp
Signed-off-by: Markus Armbruster <armbru@redhat.com> Reviewed-by: Eric Blake <eblake@redhat.com> Reviewed-by: Paolo Bonzini <pbonzini@redhat.com> Message-Id: <20200505152926.18877-4-armbru@redhat.com>
show more ...
|
ddfb0baa | 05-May-2020 |
Markus Armbruster <armbru@redhat.com> |
qom: Clean up inconsistent use of gchar * vs. char *
Uses of gchar * in qom/object.h:
* ObjectProperty member @name
Functions that take a property name argument all use char *. Change the mem
qom: Clean up inconsistent use of gchar * vs. char *
Uses of gchar * in qom/object.h:
* ObjectProperty member @name
Functions that take a property name argument all use char *. Change the member to match.
* ObjectProperty member @type
Functions that take a property type argument or return it all use char *. Change the member to match.
* ObjectProperty member @description
Functions that take a property description argument all use char *. Change the member to match.
* object_resolve_path_component() parameter @part
Path components are property names. Most callers pass char * arguments. Change the parameter to match. Adjust the few callers that pass gchar * to pass char *.
* Return value of object_get_canonical_path_component(), object_get_canonical_path()
Most callers convert their return values right back to char *. Change the return value to match. Adjust the few callers where that would add a conversion to gchar * to use char * instead.
Signed-off-by: Markus Armbruster <armbru@redhat.com> Reviewed-by: Eric Blake <eblake@redhat.com> Reviewed-by: Paolo Bonzini <pbonzini@redhat.com> Message-Id: <20200505152926.18877-3-armbru@redhat.com>
show more ...
|
975ac455 | 05-May-2020 |
Markus Armbruster <armbru@redhat.com> |
qom: Clearer reference counting in object_initialize_childv()
Signed-off-by: Markus Armbruster <armbru@redhat.com> Reviewed-by: Eric Blake <eblake@redhat.com> Reviewed-by: Paolo Bonzini <pbonzini@re
qom: Clearer reference counting in object_initialize_childv()
Signed-off-by: Markus Armbruster <armbru@redhat.com> Reviewed-by: Eric Blake <eblake@redhat.com> Reviewed-by: Paolo Bonzini <pbonzini@redhat.com> Message-Id: <20200505152926.18877-2-armbru@redhat.com>
show more ...
|
eaae29ef | 16-Apr-2020 |
Kevin Wolf <kwolf@redhat.com> |
qemu-storage-daemon: Fix non-string --object properties
After processing the option string with the keyval parser, we get a QDict that contains only strings. This QDict must be fed to a keyval visit
qemu-storage-daemon: Fix non-string --object properties
After processing the option string with the keyval parser, we get a QDict that contains only strings. This QDict must be fed to a keyval visitor which converts the strings into the right data types.
qmp_object_add(), however, uses the normal QObject input visitor, which expects a QDict where all properties already have the QType that matches the data type required by the QOM object type.
Change the --object implementation in qemu-storage-daemon so that it doesn't call qmp_object_add(), but calls user_creatable_add_dict() directly instead and pass it a new keyval boolean that decides which visitor must be used.
Reported-by: Coiby Xu <coiby.xu@gmail.com> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
show more ...
|
d6a5beeb | 16-Apr-2020 |
Kevin Wolf <kwolf@redhat.com> |
qom: Factor out user_creatable_add_dict()
The QMP handler qmp_object_add() and the implementation of --object in qemu-storage-daemon can share most of the code. Currently, qemu-storage-daemon calls
qom: Factor out user_creatable_add_dict()
The QMP handler qmp_object_add() and the implementation of --object in qemu-storage-daemon can share most of the code. Currently, qemu-storage-daemon calls qmp_object_add(), but this is not correct because different visitors need to be used.
As a first step towards a fix, make qmp_object_add() a wrapper around a new function user_creatable_add_dict() that can get an additional parameter. The handling of "props" is only required for compatibility and not required for the qemu-storage-daemon command line, so it stays in qmp_object_add().
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
show more ...
|
ea097dff | 24-Apr-2020 |
Markus Armbruster <armbru@redhat.com> |
qom: Simplify object_property_get_enum()
Signed-off-by: Markus Armbruster <armbru@redhat.com> Reviewed-by: Eric Blake <eblake@redhat.com> Message-Id: <20200424084338.26803-14-armbru@redhat.com> |
7f5d9b20 | 26-Mar-2020 |
Paolo Bonzini <pbonzini@redhat.com> |
object-add: don't create return value if failed
No need to return an empty value from object-add (it would also leak if the command failed). While at it, remove the "if" around object_unref since o
object-add: don't create return value if failed
No need to return an empty value from object-add (it would also leak if the command failed). While at it, remove the "if" around object_unref since object_unref handles NULL arguments just fine.
Reported-by: Marc-André Lureau <marcandre.lureau@redhat.com> Message-Id: <20200325184723.2029630-4-marcandre.lureau@redhat.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
show more ...
|
836e1b38 | 04-Feb-2020 |
Felipe Franciosi <felipe@nutanix.com> |
qom/object: enable setter for uint types
Traditionally, the uint-specific property helpers only offer getters. When adding object (or class) uint types, one must therefore use the generic property h
qom/object: enable setter for uint types
Traditionally, the uint-specific property helpers only offer getters. When adding object (or class) uint types, one must therefore use the generic property helper if a setter is needed (and probably duplicate some code writing their own getters/setters).
This enhances the uint-specific property helper APIs by adding a bitwise-or'd 'flags' field and modifying all clients of that API to set this paramater to OBJ_PROP_FLAG_READ. This maintains the current behaviour whilst allowing others to also set OBJ_PROP_FLAG_WRITE (or use the more convenient OBJ_PROP_FLAG_READWRITE) in the future (which will automatically install a setter). Other flags may be added later.
Signed-off-by: Felipe Franciosi <felipe@nutanix.com> Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
show more ...
|
9b6abdcf | 10-Mar-2020 |
Pan Nengyuan <pannengyuan@huawei.com> |
qom-qmp-cmds: fix two memleaks in qmp_object_add
'type/id' forgot to free in qmp_object_add, this patch fix that.
The leak stack: Direct leak of 84 byte(s) in 6 object(s) allocated from: #0 0x7
qom-qmp-cmds: fix two memleaks in qmp_object_add
'type/id' forgot to free in qmp_object_add, this patch fix that.
The leak stack: Direct leak of 84 byte(s) in 6 object(s) allocated from: #0 0x7fe2a5ebf768 in __interceptor_malloc (/lib64/libasan.so.5+0xef768) #1 0x7fe2a5044445 in g_malloc (/lib64/libglib-2.0.so.0+0x52445) #2 0x7fe2a505dd92 in g_strdup (/lib64/libglib-2.0.so.0+0x6bd92) #3 0x56344954e692 in qmp_object_add /mnt/sdb/qemu-new/qemu_test/qemu/qom/qom-qmp-cmds.c:258 #4 0x563449960f5a in do_qmp_dispatch /mnt/sdb/qemu-new/qemu_test/qemu/qapi/qmp-dispatch.c:132 #5 0x563449960f5a in qmp_dispatch /mnt/sdb/qemu-new/qemu_test/qemu/qapi/qmp-dispatch.c:175 #6 0x563449498a30 in monitor_qmp_dispatch /mnt/sdb/qemu-new/qemu_test/qemu/monitor/qmp.c:145 #7 0x56344949a64f in monitor_qmp_bh_dispatcher /mnt/sdb/qemu-new/qemu_test/qemu/monitor/qmp.c:234 #8 0x563449a92a3a in aio_bh_call /mnt/sdb/qemu-new/qemu_test/qemu/util/async.c:136
Direct leak of 54 byte(s) in 6 object(s) allocated from: #0 0x7fe2a5ebf768 in __interceptor_malloc (/lib64/libasan.so.5+0xef768) #1 0x7fe2a5044445 in g_malloc (/lib64/libglib-2.0.so.0+0x52445) #2 0x7fe2a505dd92 in g_strdup (/lib64/libglib-2.0.so.0+0x6bd92) #3 0x56344954e6c4 in qmp_object_add /mnt/sdb/qemu-new/qemu_test/qemu/qom/qom-qmp-cmds.c:267 #4 0x563449960f5a in do_qmp_dispatch /mnt/sdb/qemu-new/qemu_test/qemu/qapi/qmp-dispatch.c:132 #5 0x563449960f5a in qmp_dispatch /mnt/sdb/qemu-new/qemu_test/qemu/qapi/qmp-dispatch.c:175 #6 0x563449498a30 in monitor_qmp_dispatch /mnt/sdb/qemu-new/qemu_test/qemu/monitor/qmp.c:145 #7 0x56344949a64f in monitor_qmp_bh_dispatcher /mnt/sdb/qemu-new/qemu_test/qemu/monitor/qmp.c:234 #8 0x563449a92a3a in aio_bh_call /mnt/sdb/qemu-new/qemu_test/qemu/util/async.c:136
Fixes: 5f07c4d60d091320186e7b0edaf9ed2cc16b2d1e Reported-by: Euler Robot <euler.robot@huawei.com> Signed-off-by: Pan Nengyuan <pannengyuan@huawei.com> Message-Id: <20200310064640.5059-1-pannengyuan@huawei.com> Reviewed-by: Daniel P. Berrangé <berrange@redhat.com> Acked-by: Igor Mammedov <imammedo@redhat.com> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
show more ...
|