]> xenbits.xensource.com Git - libvirt.git/commitdiff
qemu: implement startupPolicy
authorMichal Privoznik <mprivozn@redhat.com>
Tue, 18 Oct 2011 08:51:06 +0000 (10:51 +0200)
committerMichal Privoznik <mprivozn@redhat.com>
Tue, 25 Oct 2011 07:27:10 +0000 (09:27 +0200)
This patch implements on_missing feature in qemu driver.
Upon qemu startup process an accessibility of CDROMs
and floppy disks is checked. The source might get dropped
if unavailable and on_missing is set accordingly.
No event is emit thought. Look for follow up patch.

src/qemu/qemu_domain.c
src/qemu/qemu_domain.h
src/qemu/qemu_process.c

index b202ba7dcf2e0e6e88f6d7acb8b9986bf65a3d37..7fbdfa13c9bdd9fa654b9b2b4e7112f2b689da5f 100644 (file)
@@ -1608,3 +1608,69 @@ qemuDomainSetFakeReboot(struct qemud_driver *driver,
     if (virDomainSaveStatus(driver->caps, driver->stateDir, vm) < 0)
         VIR_WARN("Failed to save status on vm %s", vm->def->name);
 }
+
+int
+qemuDomainCheckDiskPresence(struct qemud_driver *driver,
+                            virDomainObjPtr vm,
+                            bool start_with_state)
+{
+    int ret = -1;
+    int i;
+    int accessRet;
+    virDomainDiskDefPtr disk;
+    char uuid[VIR_UUID_STRING_BUFLEN] ATTRIBUTE_UNUSED;
+
+    virUUIDFormat(vm->def->uuid, uuid);
+
+    for (i = 0; i < vm->def->ndisks; i++) {
+        disk = vm->def->disks[i];
+
+        if (!disk->startupPolicy || !disk->src)
+            continue;
+
+        if ((accessRet = virFileAccessibleAs(disk->src, F_OK,
+                                             driver->user,
+                                             driver->group)) >= 0) {
+            /* disk accessible or virFileAccessibleAs()
+             * terminated with signal*/
+            continue;
+        }
+
+        switch ((enum virDomainStartupPolicy) disk->startupPolicy) {
+            case VIR_DOMAIN_STARTUP_POLICY_OPTIONAL:
+                break;
+
+            case VIR_DOMAIN_STARTUP_POLICY_MANDATORY:
+                virReportSystemError(-accessRet,
+                                     _("cannot access file '%s'"),
+                                     disk->src);
+                goto cleanup;
+                break;
+
+            case VIR_DOMAIN_STARTUP_POLICY_REQUISITE:
+                if (!start_with_state) {
+                    virReportSystemError(-accessRet,
+                                         _("cannot access file '%s'"),
+                                         disk->src);
+                    goto cleanup;
+                }
+                break;
+
+            case VIR_DOMAIN_STARTUP_POLICY_DEFAULT:
+            case VIR_DOMAIN_STARTUP_POLICY_LAST:
+                /* this should never happen */
+                break;
+        }
+
+        VIR_DEBUG("Droping disk '%s' on domain '%s' (UUID '%s') "
+                  "due to not accessible source '%s'",
+                  disk->dst, vm->def->name, uuid, disk->src);
+
+        VIR_FREE(disk->src);
+    }
+
+    ret = 0;
+
+cleanup:
+    return ret;
+}
index d9f323cc5954bc3a3fe959f371212dbb89fadd4e..e8bcab3c1b3ef9fb125e598a2ac92d29222e3946 100644 (file)
@@ -280,4 +280,8 @@ void qemuDomainSetFakeReboot(struct qemud_driver *driver,
 
 bool qemuDomainJobAllowed(qemuDomainObjPrivatePtr priv,
                           enum qemuDomainJob job);
+
+int qemuDomainCheckDiskPresence(struct qemud_driver *driver,
+                                virDomainObjPtr vm,
+                                bool start_with_state);
 #endif /* __QEMU_DOMAIN_H__ */
index c0f6fd41b87c7d9530f7b82b3af48863ec3c1d4c..57312238cf99a6549b299f645b048eb8e5fd822b 100644 (file)
@@ -2880,6 +2880,13 @@ int qemuProcessStart(virConnectPtr conn,
                                NULL) < 0)
         goto cleanup;
 
+    if (qemuAssignDeviceAliases(vm->def, priv->qemuCaps) < 0)
+        goto cleanup;
+
+    VIR_DEBUG("Checking for CDROM and floppy presence");
+    if (qemuDomainCheckDiskPresence(driver, vm, migrateFrom != NULL) < 0)
+        goto cleanup;
+
     /* If you are using a SecurityDriver with dynamic labelling,
        then generate a security label for isolation */
     VIR_DEBUG("Generating domain security label (if required)");
@@ -3015,9 +3022,6 @@ int qemuProcessStart(virConnectPtr conn,
         priv->persistentAddrs = 0;
     }
 
-    if (qemuAssignDeviceAliases(vm->def, priv->qemuCaps) < 0)
-        goto cleanup;
-
     VIR_DEBUG("Building emulator command line");
     if (!(cmd = qemuBuildCommandLine(conn, driver, vm->def, priv->monConfig,
                                      priv->monJSON != 0, priv->qemuCaps,