]> git.proxmox.com Git - qemu.git/blobdiff - hw/device-hotplug.c
monitor: move include files to include/monitor/
[qemu.git] / hw / device-hotplug.c
index 8f0dec8b096ad2a02b77cca62c97c830d3283e52..809a598e3aa78d7d01c2d410ddaec1c36e1f9e10 100644 (file)
 
 #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);
+    }
+}