#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"
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