qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH V3 13/13] hw/sd.c: introduce "eject" property fo


From: Paolo Bonzini
Subject: Re: [Qemu-devel] [PATCH V3 13/13] hw/sd.c: introduce "eject" property for SD card objects
Date: Sat, 28 Apr 2012 16:27:05 +0200
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:11.0) Gecko/20120329 Thunderbird/11.0.1

Il 27/04/2012 17:50, Igor Mitsyanko ha scritto:
> Boolean property "eject" could be used to query if virtual media is inserted 
> into
> SD card object, or to deattach BlockDriverState from SD card object.

All this is already available in the BlockDriverState object; the eject
monitor command does bdrv_close and calls the change_media_cb on the
attached device.  The SD card should just attach callbacks to the BDS.

Paolo

> Signed-off-by: Igor Mitsyanko <address@hidden>
> ---
>  hw/sd.c |   60 +++++++++++++++++++++++++++++++++++++++++++++++++++---------
>  1 files changed, 51 insertions(+), 9 deletions(-)
> 
> diff --git a/hw/sd.c b/hw/sd.c
> index d067ffb..de57000 100644
> --- a/hw/sd.c
> +++ b/hw/sd.c
> @@ -508,6 +508,19 @@ static void sd_init_card(SDState *sd, BlockDriverState 
> *bdrv, Error **errp)
>      }
>  }
>  
> +static void sd_deinit_card(SDState *sd)
> +{
> +    bdrv_close(sd->bdrv);
> +    sd->enable = false;
> +    bdrv_detach_dev(sd->bdrv, sd);
> +    sd_reset(sd, NULL);
> +
> +    if (sd->buf) {
> +        qemu_vfree(sd->buf);
> +        sd->buf = NULL;
> +    }
> +}
> +
>  static void sd_set_callbacks(SDState *sd, qemu_irq readonly, qemu_irq insert)
>  {
>      sd->readonly_cb = readonly;
> @@ -1828,15 +1841,7 @@ static void sd_devid_set(Object *obj, const char 
> *value, Error **errp)
>              return;
>          }
>  
> -        bdrv_close(sd->bdrv);
> -        sd->enable = false;
> -        bdrv_detach_dev(sd->bdrv, sd);
> -        if (sd->buf) {
> -            qemu_vfree(sd->buf);
> -            sd->buf = NULL;
> -        }
> -        sd_reset(sd, NULL);
> -
> +        sd_deinit_card(sd);
>          sd_init_card(sd, bdrv, errp);
>          if (error_is_set(errp)) {
>              vmstate_unregister(NULL, &sd_vmstate, sd);
> @@ -1850,6 +1855,41 @@ static void sd_devid_set(Object *obj, const char 
> *value, Error **errp)
>      }
>  }
>  
> +static void sd_is_ejected(Object *obj, Visitor *v, void *opaque,
> +                         const char *name, Error **errp)
> +{
> +    SDState *sd = SD_CARD(obj);
> +    bool ejected = sd->bdrv && bdrv_is_inserted(sd->bdrv) ? false : true;
> +
> +    visit_type_bool(v, &ejected, name, errp);
> +}
> +
> +static void sd_eject(Object *obj, Visitor *v, void *opaque,
> +                         const char *name, Error **errp)
> +{
> +    SDState *sd = SD_CARD(obj);
> +    bool eject;
> +
> +    visit_type_bool(v, &eject, name, errp);
> +    if (error_is_set(errp)) {
> +        return;
> +    }
> +
> +    if (eject) {
> +        if (!sd->bdrv) {
> +            return;
> +        }
> +
> +        if (bdrv_in_use(sd->bdrv)) {
> +            error_set(errp, QERR_DEVICE_IN_USE, 
> bdrv_get_device_name(sd->bdrv));
> +            return;
> +        }
> +
> +        vmstate_unregister(NULL, &sd_vmstate, sd);
> +        sd_deinit_card(sd);
> +    }
> +}
> +
>  static void sd_initfn(Object *obj)
>  {
>      SDState *sd = SD_CARD(obj);
> @@ -1859,6 +1899,8 @@ static void sd_initfn(Object *obj)
>              NULL, NULL, NULL);
>      object_property_add_str(OBJECT(sd), "device-id", sd_devid_get, 
> sd_devid_set,
>              NULL);
> +    object_property_add(obj, "eject", "boolean", sd_is_ejected, sd_eject,
> +            NULL, NULL, NULL);
>  }
>  
>  static const TypeInfo sd_type_info = {




reply via email to

[Prev in Thread] Current Thread [Next in Thread]