]> 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 3bdc048c685031b690526bbb6cc1fb3c6667bb16..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"
 
-int add_init_drive(const char *opts)
+DriveInfo *add_init_drive(const char *optstr)
 {
-    int drive_opt_idx, drive_idx;
-    int ret = -1;
+    DriveInfo *dinfo;
+    QemuOpts *opts;
 
-    drive_opt_idx = drive_add(NULL, "%s", opts);
-    if (!drive_opt_idx)
-        return ret;
+    opts = drive_def(optstr);
+    if (!opts)
+        return NULL;
 
-    drive_idx = drive_init(&drives_opt[drive_opt_idx], 0, current_machine);
-    if (drive_idx == -1) {
-        drive_remove(drive_opt_idx);
-        return ret;
+    dinfo = drive_init(opts, current_machine->block_default_type);
+    if (!dinfo) {
+        qemu_opts_del(opts);
+        return NULL;
     }
 
-    return drive_idx;
+    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)) {
-                if (nic->vlan) {
-                    VLANClientState *vc;
-                    vc = qemu_find_vlan_client(nic->vlan, nic->private);
-                    if (vc)
-                        qemu_del_vlan_client(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)
 {
-    int i;
-    struct BlockDriverState *bs;
+    DriveInfo *dinfo = NULL;
+    const char *opts = qdict_get_str(qdict, "opts");
 
-    for (i = 0; i <= MAX_DRIVES; i++) {
-        bs = drives_table[i].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);
+    }
+}