]> xenbits.xensource.com Git - libvirt.git/commitdiff
qemu: Add flag to force a CDROM eject
authorCole Robinson <crobinso@redhat.com>
Mon, 8 Nov 2010 17:52:48 +0000 (12:52 -0500)
committerCole Robinson <crobinso@redhat.com>
Wed, 10 Nov 2010 17:31:20 +0000 (12:31 -0500)
QEMU allows forcing a CDROM eject even if the guest has locked the device.
Expose this via a new UpdateDevice flag, VIR_DOMAIN_DEVICE_MODIFY_FORCE.

This has been requested for RHEV:

https://bugzilla.redhat.com/show_bug.cgi?id=626305

v2: Change flag name, bool cleanups

include/libvirt/libvirt.h.in
src/qemu/qemu_driver.c
src/qemu/qemu_monitor.c
src/qemu/qemu_monitor.h
src/qemu/qemu_monitor_json.c
src/qemu/qemu_monitor_json.h
src/qemu/qemu_monitor_text.c
src/qemu/qemu_monitor_text.h

index 81db3a269cff66a5255e12c61e653e649342cff0..5c782709034e432ed8c8f88af4f88d9c38d7659a 100644 (file)
@@ -1033,6 +1033,8 @@ typedef enum {
    VIR_DOMAIN_DEVICE_MODIFY_CURRENT = 0, /* Modify device allocation based on current domain state */
    VIR_DOMAIN_DEVICE_MODIFY_LIVE = (1 << 0), /* Modify live device allocation */
    VIR_DOMAIN_DEVICE_MODIFY_CONFIG = (1 << 1), /* Modify persisted device allocation */
+   VIR_DOMAIN_DEVICE_MODIFY_FORCE = (1 << 2), /* Forcibly modify device
+                                                 (ex. force eject a cdrom) */
 } virDomainDeviceModifyFlags;
 
 int virDomainAttachDevice(virDomainPtr domain, const char *xml);
index bb96c1f9b9f43e066225a9ce0bba55250efc909c..bed208fac527ddac371243cdbb8b7aed87c5df95 100644 (file)
@@ -7704,7 +7704,8 @@ cleanup:
 static int qemudDomainChangeEjectableMedia(struct qemud_driver *driver,
                                            virDomainObjPtr vm,
                                            virDomainDiskDefPtr disk,
-                                           unsigned long long qemuCmdFlags)
+                                           unsigned long long qemuCmdFlags,
+                                           bool force)
 {
     virDomainDiskDefPtr origdisk = NULL;
     int i;
@@ -7765,7 +7766,7 @@ static int qemudDomainChangeEjectableMedia(struct qemud_driver *driver,
                                      driveAlias,
                                      disk->src, format);
     } else {
-        ret = qemuMonitorEjectMedia(priv->mon, driveAlias);
+        ret = qemuMonitorEjectMedia(priv->mon, driveAlias, force);
     }
     qemuDomainObjExitMonitorWithDriver(driver, vm);
 
@@ -8732,7 +8733,8 @@ static int qemudDomainAttachDevice(virDomainPtr dom,
         case VIR_DOMAIN_DISK_DEVICE_FLOPPY:
             ret = qemudDomainChangeEjectableMedia(driver, vm,
                                                   dev->data.disk,
-                                                  qemuCmdFlags);
+                                                  qemuCmdFlags,
+                                                  false);
             if (ret == 0)
                 dev->data.disk = NULL;
             break;
@@ -8919,10 +8921,12 @@ static int qemuDomainUpdateDeviceFlags(virDomainPtr dom,
     unsigned long long qemuCmdFlags;
     virCgroupPtr cgroup = NULL;
     int ret = -1;
+    bool force = (flags & VIR_DOMAIN_DEVICE_MODIFY_FORCE) != 0;
 
     virCheckFlags(VIR_DOMAIN_DEVICE_MODIFY_CURRENT |
                   VIR_DOMAIN_DEVICE_MODIFY_LIVE |
-                  VIR_DOMAIN_DEVICE_MODIFY_CONFIG, -1);
+                  VIR_DOMAIN_DEVICE_MODIFY_CONFIG |
+                  VIR_DOMAIN_DEVICE_MODIFY_FORCE, -1);
 
     if (flags & VIR_DOMAIN_DEVICE_MODIFY_CONFIG) {
         qemuReportError(VIR_ERR_OPERATION_INVALID,
@@ -8977,7 +8981,8 @@ static int qemuDomainUpdateDeviceFlags(virDomainPtr dom,
         case VIR_DOMAIN_DISK_DEVICE_FLOPPY:
             ret = qemudDomainChangeEjectableMedia(driver, vm,
                                                   dev->data.disk,
-                                                  qemuCmdFlags);
+                                                  qemuCmdFlags,
+                                                  force);
             if (ret == 0)
                 dev->data.disk = NULL;
             break;
index f65512dd122fad07f6dacb783695c8c1f20cfce3..27223f814548c76a6593a827cd7afdcce7d68d5e 100644 (file)
@@ -1147,10 +1147,11 @@ int qemuMonitorSetCPU(qemuMonitorPtr mon, int cpu, int online)
 
 
 int qemuMonitorEjectMedia(qemuMonitorPtr mon,
-                          const char *devname)
+                          const char *devname,
+                          bool force)
 {
     int ret;
-    DEBUG("mon=%p devname=%s", mon, devname);
+    DEBUG("mon=%p devname=%s force=%d", mon, devname, force);
 
     if (!mon) {
         qemuReportError(VIR_ERR_INVALID_ARG, "%s",
@@ -1159,9 +1160,9 @@ int qemuMonitorEjectMedia(qemuMonitorPtr mon,
     }
 
     if (mon->json)
-        ret = qemuMonitorJSONEjectMedia(mon, devname);
+        ret = qemuMonitorJSONEjectMedia(mon, devname, force);
     else
-        ret = qemuMonitorTextEjectMedia(mon, devname);
+        ret = qemuMonitorTextEjectMedia(mon, devname, force);
     return ret;
 }
 
index 7d0914566e51b9f27874faa54b8c5fbea5f71766..41b3135d3e04358eba5e9efc0a5d5f25cacf1a2a 100644 (file)
@@ -203,12 +203,10 @@ int qemuMonitorSetCPU(qemuMonitorPtr mon, int cpu, int online);
 /* XXX should we pass the virDomainDiskDefPtr instead
  * and hide devname details inside monitor. Reconsider
  * this when doing the QMP implementation
- *
- * XXXX 'eject' has gained a 'force' flag we might like
- * to make use of...
  */
 int qemuMonitorEjectMedia(qemuMonitorPtr mon,
-                          const char *devname);
+                          const char *devname,
+                          bool force);
 int qemuMonitorChangeMedia(qemuMonitorPtr mon,
                            const char *devname,
                            const char *newmedia,
index d2c6f0a0571355e04b0af30f9b197bc85eda477c..da51a4f5a8528f4416691642a774b0f8c9ce2866 100644 (file)
@@ -1348,12 +1348,13 @@ cleanup:
 
 
 int qemuMonitorJSONEjectMedia(qemuMonitorPtr mon,
-                              const char *devname)
+                              const char *devname,
+                              bool force)
 {
     int ret;
     virJSONValuePtr cmd = qemuMonitorJSONMakeCommand("eject",
                                                      "s:device", devname,
-                                                     "b:force", 0,
+                                                     "b:force", force ? 1 : 0,
                                                      NULL);
     virJSONValuePtr reply = NULL;
     if (!cmd)
index 94806c1063704f2f5057df7191841b7167b74e59..c78ee24573af426857513892670e9a372bebb034 100644 (file)
@@ -68,7 +68,8 @@ int qemuMonitorJSONSetBalloon(qemuMonitorPtr mon,
 int qemuMonitorJSONSetCPU(qemuMonitorPtr mon, int cpu, int online);
 
 int qemuMonitorJSONEjectMedia(qemuMonitorPtr mon,
-                              const char *devname);
+                              const char *devname,
+                              bool force);
 int qemuMonitorJSONChangeMedia(qemuMonitorPtr mon,
                                const char *devname,
                                const char *newmedia,
index 7f15008977537f9ff5ffea7b7d23db40a8c1c27a..25521110e2f3e7c3c067dd2329ddfcad6f89254b 100644 (file)
@@ -848,13 +848,14 @@ int qemuMonitorTextSetCPU(qemuMonitorPtr mon, int cpu, int online)
 
 
 int qemuMonitorTextEjectMedia(qemuMonitorPtr mon,
-                              const char *devname)
+                              const char *devname,
+                              bool force)
 {
     char *cmd = NULL;
     char *reply = NULL;
     int ret = -1;
 
-    if (virAsprintf(&cmd, "eject %s", devname) < 0) {
+    if (virAsprintf(&cmd, "eject %s%s", force ? "-f " : "", devname) < 0) {
         virReportOOMError();
         goto cleanup;
     }
index c0175092981b92cdf4acdfcfecbdbc3d91d59ba7..983f402eda133e6b03a9dea0018915e03279fb32 100644 (file)
@@ -66,7 +66,8 @@ int qemuMonitorTextSetBalloon(qemuMonitorPtr mon,
 int qemuMonitorTextSetCPU(qemuMonitorPtr mon, int cpu, int online);
 
 int qemuMonitorTextEjectMedia(qemuMonitorPtr mon,
-                              const char *devname);
+                              const char *devname,
+                              bool force);
 int qemuMonitorTextChangeMedia(qemuMonitorPtr mon,
                                const char *devname,
                                const char *newmedia,