qemu-devel
[Top][All Lists]
Advanced

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

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


From: Igor Mitsyanko
Subject: [Qemu-devel] [PATCH V3 13/13] hw/sd.c: introduce "eject" property for SD card objects
Date: Fri, 27 Apr 2012 19:50:59 +0400

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 <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 = {
-- 
1.7.4.1




reply via email to

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