#include "hw.h"
#include "boards.h"
-#include "net.h"
-#include "block_int.h"
+#include "blockdev.h"
+#include "qemu-config.h"
#include "sysemu.h"
+#include "monitor/monitor.h"
-DriveInfo *add_init_drive(const char *opts)
+DriveInfo *add_init_drive(const char *optstr)
{
- int fatal_error;
DriveInfo *dinfo;
- DriveOpt *dopt;
+ QemuOpts *opts;
- dopt = drive_add(NULL, "%s", opts);
- if (!dopt)
+ opts = drive_def(optstr);
+ if (!opts)
return NULL;
- dinfo = drive_init(dopt, 0, current_machine, &fatal_error);
+ dinfo = drive_init(opts, current_machine->block_default_type);
if (!dinfo) {
- drive_remove(dopt);
+ qemu_opts_del(opts);
return NULL;
}
return dinfo;
}
-void destroy_nic(dev_match_fn *match_fn, void *arg)
+#if !defined(TARGET_I386)
+int pci_drive_hot_add(Monitor *mon, const QDict *qdict, DriveInfo *dinfo)
{
- int i;
- NICInfo *nic;
-
- for (i = 0; i < MAX_NICS; i++) {
- nic = &nd_table[i];
- if (nic->used) {
- if (nic->private && match_fn(nic->private, arg)) {
- qemu_del_vlan_client(nic->vc);
- net_client_uninit(nic);
- }
- }
- }
+ /* On non-x86 we don't do PCI hotplug */
+ monitor_printf(mon, "Can't hot-add drive to type %d\n", dinfo->type);
+ return -1;
}
+#endif
-void destroy_bdrvs(dev_match_fn *match_fn, void *arg)
+void drive_hot_add(Monitor *mon, const QDict *qdict)
{
- DriveInfo *dinfo;
- struct BlockDriverState *bs;
+ DriveInfo *dinfo = NULL;
+ const char *opts = qdict_get_str(qdict, "opts");
- TAILQ_FOREACH(dinfo, &drives, next) {
- bs = dinfo->bdrv;
- if (bs) {
- if (bs->private && match_fn(bs->private, arg)) {
- drive_uninit(bs);
- bdrv_delete(bs);
- }
- }
+ dinfo = add_init_drive(opts);
+ if (!dinfo) {
+ goto err;
+ }
+ if (dinfo->devaddr) {
+ monitor_printf(mon, "Parameter addr not supported\n");
+ goto err;
}
-}
+ switch (dinfo->type) {
+ case IF_NONE:
+ monitor_printf(mon, "OK\n");
+ break;
+ default:
+ if (pci_drive_hot_add(mon, qdict, dinfo)) {
+ goto err;
+ }
+ }
+ return;
+err:
+ if (dinfo) {
+ drive_put_ref(dinfo);
+ }
+}