sdcard: re-organize attach/detach sdcard
authorMunkyu Im <munkyu.im@samsung.com>
Mon, 6 Feb 2017 12:12:21 +0000 (21:12 +0900)
committerSeokYeon Hwang <syeon.hwang@samsung.com>
Thu, 16 Feb 2017 06:45:00 +0000 (15:45 +0900)
 - QPI rules are changed.
from commit 9ec8873e684c2dae6fadb3a801057c613ccd2a6b,
"node-name" becomes mandatory and "id" is removed.
"id" is necessary to search attached sdcard.
To do it, should use blk_new_open() which returns BlockBackend pointer.
And this value is set as an argument  of monitor_add_blk().

from commit 0153d2f50bc2ad3f41810d838fcf66acbf10f07a,
"options" is removed.
 - modify method of adding/removing block device.
 - add some error handlings.

Change-Id: I7230c8f6a116eed5dc71e1c85d8ad162c4581d59
Signed-off-by: Munkyu Im <munkyu.im@samsung.com>
tizen/src/util/device_hotplug.c

index 9f56471..56f926a 100644 (file)
@@ -33,6 +33,7 @@
 #include "qemu/event_notifier.h"
 #include "qapi/qmp/qstring.h"
 #include "sysemu/block-backend.h"
+#include "qapi/qmp/qerror.h"
 
 #ifdef CONFIG_VIRTFS
 #include "fsdev/qemu-fsdev.h"
@@ -101,63 +102,103 @@ static bool do_host_keyboard_detach(void)
 
 static bool do_sdcard_attach(const char * const file)
 {
-    QDict *qdict = qdict_new();
-    QDict *qdict_file = qdict_new();
-    QDict *qdict_options = qdict_new();
+    BlockBackend *blk;
+    QemuOpts *opts;
+    QDict *qdict;
+    char *cmdline;
+
     gchar *sdcard_img = g_path_get_basename(file);
     gchar *sdcard_device_id = g_strdup_printf("device_id_%s", sdcard_img);
     gchar *sdcard_drive_id = g_strdup_printf("drive_id_%s", sdcard_img);
-    DriveInfo *dinfo = NULL;
 
-    g_free(sdcard_img);
-
-    qdict_put(qdict_file, "driver", qstring_from_str("file"));
-    qdict_put(qdict_file, "filename", qstring_from_str(file));
-    qdict_put(qdict_options, "file", qdict_file);
-    qdict_put(qdict_options, "driver", qstring_from_str("qcow2"));
-    qdict_put(qdict_options, "id", qstring_from_str(sdcard_device_id));
-    qdict_put(qdict, "options", qdict_options);
+    /* refer from test-replication.c */
+    cmdline = g_strdup_printf("driver=qcow2,node-name=sdcard,"
+            "file.driver=file,file.filename=%s"
+            , file);
+    opts = qemu_opts_parse_noisily(&qemu_drive_opts, cmdline, false);
+    g_free(cmdline);
 
-    qmp_marshal_blockdev_add(qdict, NULL, &error_abort);
+    qdict = qemu_opts_to_qdict(opts, NULL);
+    qemu_opts_del(opts);
 
-    dinfo = g_malloc0(sizeof(*dinfo));
-    dinfo->type = IF_VIRTIO;
-    blk_set_legacy_dinfo(blk_by_name(sdcard_device_id), dinfo);
+    blk = blk_new_open(NULL, NULL, qdict, BDRV_O_RDWR, &error_abort);
+    if (error_abort) {
+        goto fail_attach;
+    }
 
-    QDECREF(qdict);
+    monitor_add_blk(blk, sdcard_device_id, &error_abort);
+    if (error_abort) {
+        goto fail_attach;
+    }
 
     qdict = qdict_new();
     qdict_put(qdict, "driver", qstring_from_str(SDCARD_DRIVER));
     qdict_put(qdict, "drive", qstring_from_str(sdcard_device_id));
     /* set sdcard id as sdcard image file name */
     qdict_put(qdict, "id", qstring_from_str(sdcard_drive_id));
-
     qmp_device_add(qdict, NULL, &error_abort);
-
     QDECREF(qdict);
-    g_free(sdcard_device_id);
-    g_free(sdcard_drive_id);
+    if (error_abort) {
+        goto fail_attach;
+    }
     state->sdcard_attached = true;
     make_send_device_ntf((char *)MSG_TYPE_SDCARD, GROUP_SDCARD,
-                         ACT_SDCARD_ATTACH, g_path_get_basename(file));
+            ACT_SDCARD_ATTACH, sdcard_img);
+    g_free(sdcard_img);
+    g_free(sdcard_device_id);
+    g_free(sdcard_drive_id);
     return true;
+
+fail_attach:
+    LOG_WARNING("%s\n", error_get_pretty(error_abort));
+    make_send_device_ntf((char *)MSG_TYPE_SDCARD, GROUP_SDCARD,
+            ACT_SDCARD_ATTACH_FAIL, sdcard_img);
+    g_free(sdcard_img);
+    g_free(sdcard_device_id);
+    g_free(sdcard_drive_id);
+    return false;
 }
 
 static bool do_sdcard_detach(const char * const file)
 {
-    QDict *qdict = qdict_new();
-    gchar *sdcard_drive_id = g_strdup_printf("drive_id_%s", g_path_get_basename(file));
-    qdict_put(qdict, "id", qstring_from_str(sdcard_drive_id));
+    BlockBackend *blk;
+    QDict *qdict;
+    gchar *sdcard_img = g_path_get_basename(file);
+    gchar *sdcard_device_id = g_strdup_printf("device_id_%s", sdcard_img);
+    gchar *sdcard_drive_id = g_strdup_printf("drive_id_%s", sdcard_img);
 
-    qmp_marshal_device_del(qdict, NULL, &error_abort);
+    blk = blk_by_name(sdcard_device_id);
+    if (!blk) {
+        LOG_WARNING("cannot find sdcard name: %s\n", sdcard_device_id);
+        goto fail_detach;
+    }
+
+    monitor_remove_blk(blk);
+    blk_unref(blk);
 
+    qdict = qdict_new();
+    qdict_put(qdict, "id", qstring_from_str(sdcard_drive_id));
+    qmp_marshal_device_del(qdict, NULL, &error_abort);
     QDECREF(qdict);
+    if (error_abort) {
+        LOG_WARNING("%s\n", error_get_pretty(error_abort));
+        goto fail_detach;
+    }
     state->sdcard_attached = false;
     make_send_device_ntf((char *)MSG_TYPE_SDCARD, GROUP_SDCARD,
-                         ACT_SDCARD_DETACH, g_path_get_basename(file));
-
+                         ACT_SDCARD_DETACH, sdcard_img);
+    g_free(sdcard_img);
+    g_free(sdcard_device_id);
     g_free(sdcard_drive_id);
     return true;
+
+fail_detach:
+    make_send_device_ntf((char *)MSG_TYPE_SDCARD, GROUP_SDCARD,
+            ACT_SDCARD_DETACH_FAIL, sdcard_img);
+    g_free(sdcard_img);
+    g_free(sdcard_device_id);
+    g_free(sdcard_drive_id);
+    return false;
 }
 
 #ifdef CONFIG_VIRTFS