1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25#include "qemu/osdep.h"
26#include "hw/hw.h"
27#include "hw/boards.h"
28#include "sysemu/block-backend.h"
29#include "sysemu/blockdev.h"
30#include "qapi/qmp/qdict.h"
31#include "qemu/config-file.h"
32#include "qemu/option.h"
33#include "sysemu/sysemu.h"
34#include "monitor/monitor.h"
35#include "block/block_int.h"
36
37static DriveInfo *add_init_drive(const char *optstr)
38{
39 DriveInfo *dinfo;
40 QemuOpts *opts;
41 MachineClass *mc;
42
43 opts = drive_def(optstr);
44 if (!opts)
45 return NULL;
46
47 mc = MACHINE_GET_CLASS(current_machine);
48 dinfo = drive_new(opts, mc->block_default_type);
49 if (!dinfo) {
50 qemu_opts_del(opts);
51 return NULL;
52 }
53
54 return dinfo;
55}
56
57void hmp_drive_add(Monitor *mon, const QDict *qdict)
58{
59 DriveInfo *dinfo = NULL;
60 const char *opts = qdict_get_str(qdict, "opts");
61 bool node = qdict_get_try_bool(qdict, "node", false);
62
63 if (node) {
64 hmp_drive_add_node(mon, opts);
65 return;
66 }
67
68 dinfo = add_init_drive(opts);
69 if (!dinfo) {
70 goto err;
71 }
72 if (dinfo->devaddr) {
73 monitor_printf(mon, "Parameter addr not supported\n");
74 goto err;
75 }
76
77 switch (dinfo->type) {
78 case IF_NONE:
79 monitor_printf(mon, "OK\n");
80 break;
81 default:
82 monitor_printf(mon, "Can't hot-add drive to type %d\n", dinfo->type);
83 goto err;
84 }
85 return;
86
87err:
88 if (dinfo) {
89 BlockBackend *blk = blk_by_legacy_dinfo(dinfo);
90 monitor_remove_blk(blk);
91 blk_unref(blk);
92 }
93}
94