From 3a1aa409d40fe29b2842d9fe38f800ecda113a6c Mon Sep 17 00:00:00 2001 From: Munkyu Im Date: Mon, 6 Feb 2017 21:12:21 +0900 Subject: [PATCH] sdcard: re-organize attach/detach sdcard - 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 --- tizen/src/util/device_hotplug.c | 97 +++++++++++++++++++++++---------- 1 file changed, 69 insertions(+), 28 deletions(-) diff --git a/tizen/src/util/device_hotplug.c b/tizen/src/util/device_hotplug.c index 9f56471ec8..56f926a7c5 100644 --- a/tizen/src/util/device_hotplug.c +++ b/tizen/src/util/device_hotplug.c @@ -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 -- 2.34.1