On 06.07.2016 16:45, Kevin Wolf wrote:
> If a node name instead of a BlockBackend name is specified as the driver
> for a guest device, an anonymous BlockBackend is created now.
> 
> usb-storage uses a hack where it forwards its BlockBackend as a property
> to another device that it internally creates. This hack must be updated
> so that it doesn't drop its original BB before it can be passed to the
> other device. This used to work because we always had the monitor
> reference around, but with node-names the device reference is the only
> one now.
> 
> Signed-off-by: Kevin Wolf <kw...@redhat.com>
> ---
>  hw/core/qdev-properties-system.c | 37 ++++++++++++++++++++++++++++++++-----
>  hw/usb/dev-storage.c             |  5 ++++-
>  2 files changed, 36 insertions(+), 6 deletions(-)
> 
> diff --git a/hw/core/qdev-properties-system.c 
> b/hw/core/qdev-properties-system.c
> index df38b8a..615c191 100644
> --- a/hw/core/qdev-properties-system.c
> +++ b/hw/core/qdev-properties-system.c

[...]

> @@ -362,8 +378,19 @@ PropertyInfo qdev_prop_vlan = {
>  void qdev_prop_set_drive(DeviceState *dev, const char *name,
>                           BlockBackend *value, Error **errp)
>  {
> -    object_property_set_str(OBJECT(dev), value ? blk_name(value) : "",
> -                            name, errp);
> +    const char *ref = NULL;

This should be "", otherwise strlen() called by qstring_from_str()
called by object_property_set_str() will probably segfault.

With that fixed:

Reviewed-by: Max Reitz <mre...@redhat.com>

> +
> +    if (value) {
> +        ref = blk_name(value);
> +        if (!*ref) {
> +            BlockDriverState *bs = blk_bs(value);
> +            if (bs) {
> +                ref = bdrv_get_node_name(bs);
> +            }
> +        }
> +    }
> +
> +    object_property_set_str(OBJECT(dev), ref, name, errp);
>  }
>  
>  void qdev_prop_set_chr(DeviceState *dev, const char *name,

Attachment: signature.asc
Description: OpenPGP digital signature

Reply via email to