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.
Signed-off-by: Igor Mitsyanko <i.mitsya...@samsung.com> --- 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 = { -- 1.7.4.1