[--checkpoints-metadata] [--nvram] [--keep-nvram]
[ {--storage volumes | --remove-all-storage
[--delete-storage-volume-snapshots]} --wipe-storage]
+ [--tpm] [--keep-tpm]
Undefine a domain. If the domain is running, this converts it to a
transient domain, without stopping it. If the domain is inactive,
The flag *--wipe-storage* specifies that the storage volumes should be
wiped before removal.
+*--tpm* and *--keep-tpm* specify accordingly to delete or keep a TPM's
+persistent state directory structure and files. If the flags are omitted
+then the persistent_state attribute in the TPM emulator definition in the
+domain XML determines whether the TPM state is kept.
+
NOTE: For an inactive domain, the domain name or UUID must be used as the
*domain*.
VIR_DOMAIN_UNDEFINE_CHECKPOINTS_METADATA = (1 << 4), /* If last use of domain,
then also remove any
checkpoint metadata (Since: 5.6.0) */
+ VIR_DOMAIN_UNDEFINE_TPM = (1 << 5), /* Also remove any
+ TPM state (Since: 8.9.0) */
+ VIR_DOMAIN_UNDEFINE_KEEP_TPM = (1 << 6), /* Keep TPM state (Since: 8.9.0) */
+ /* Future undefine control flags should come here. */
} virDomainUndefineFlagsValues;
static void
qemuDomainRemoveInactiveCommon(virQEMUDriver *driver,
- virDomainObj *vm)
+ virDomainObj *vm,
+ virDomainUndefineFlagsValues flags)
{
g_autoptr(virQEMUDriverConfig) cfg = virQEMUDriverGetConfig(driver);
g_autofree char *snapDir = NULL;
if (rmdir(chkDir) < 0 && errno != ENOENT)
VIR_WARN("unable to remove checkpoint directory %s", chkDir);
}
- qemuExtDevicesCleanupHost(driver, vm->def);
+ qemuExtDevicesCleanupHost(driver, vm->def, flags);
}
*/
void
qemuDomainRemoveInactive(virQEMUDriver *driver,
- virDomainObj *vm)
+ virDomainObj *vm,
+ virDomainUndefineFlagsValues flags)
{
if (vm->persistent) {
/* Short-circuit, we don't want to remove a persistent domain */
return;
}
- qemuDomainRemoveInactiveCommon(driver, vm);
+ qemuDomainRemoveInactiveCommon(driver, vm, flags);
virDomainObjListRemove(driver->domains, vm);
}
return;
}
- qemuDomainRemoveInactiveCommon(driver, vm);
+ qemuDomainRemoveInactiveCommon(driver, vm, 0);
virDomainObjListRemoveLocked(driver->domains, vm);
}
virDomainObj *vm);
void qemuDomainRemoveInactive(virQEMUDriver *driver,
- virDomainObj *vm);
+ virDomainObj *vm,
+ virDomainUndefineFlagsValues flags);
void
qemuDomainRemoveInactiveLocked(virQEMUDriver *driver,
goto cleanup;
if (qemuProcessBeginJob(vm, VIR_DOMAIN_JOB_OPERATION_START, flags) < 0) {
- qemuDomainRemoveInactive(driver, vm);
+ qemuDomainRemoveInactive(driver, vm, 0);
goto cleanup;
}
VIR_NETDEV_VPORT_PROFILE_OP_CREATE,
start_flags) < 0) {
virDomainAuditStart(vm, "booted", false);
- qemuDomainRemoveInactive(driver, vm);
+ qemuDomainRemoveInactive(driver, vm, 0);
qemuProcessEndJob(vm);
goto cleanup;
}
ret = 0;
endjob:
if (ret == 0)
- qemuDomainRemoveInactive(driver, vm);
+ qemuDomainRemoveInactive(driver, vm, 0);
virDomainObjEndJob(vm);
cleanup:
}
virDomainObjEndAsyncJob(vm);
if (ret == 0)
- qemuDomainRemoveInactive(driver, vm);
+ qemuDomainRemoveInactive(driver, vm, 0);
cleanup:
virQEMUSaveDataFree(data);
virDomainObjEndAsyncJob(vm);
if (ret == 0 && flags & VIR_DUMP_CRASH)
- qemuDomainRemoveInactive(driver, vm);
+ qemuDomainRemoveInactive(driver, vm, 0);
cleanup:
virDomainObjEndAPI(&vm);
endjob:
virDomainObjEndAsyncJob(vm);
if (removeInactive)
- qemuDomainRemoveInactive(driver, vm);
+ qemuDomainRemoveInactive(driver, vm, 0);
}
virObjectEventStateQueue(driver->domainEventState, event);
endjob:
- qemuDomainRemoveInactive(driver, vm);
+ qemuDomainRemoveInactive(driver, vm, 0);
virDomainObjEndJob(vm);
}
virFileWrapperFdFree(wrapperFd);
virQEMUSaveDataFree(data);
if (vm && ret < 0)
- qemuDomainRemoveInactive(driver, vm);
+ qemuDomainRemoveInactive(driver, vm, 0);
virDomainObjEndAPI(&vm);
return ret;
}
} else {
/* Brand new domain. Remove it */
VIR_INFO("Deleting domain '%s'", vm->def->name);
- qemuDomainRemoveInactive(driver, vm);
+ qemuDomainRemoveInactive(driver, vm, 0);
}
}
VIR_DOMAIN_UNDEFINE_SNAPSHOTS_METADATA |
VIR_DOMAIN_UNDEFINE_CHECKPOINTS_METADATA |
VIR_DOMAIN_UNDEFINE_NVRAM |
- VIR_DOMAIN_UNDEFINE_KEEP_NVRAM, -1);
+ VIR_DOMAIN_UNDEFINE_KEEP_NVRAM |
+ VIR_DOMAIN_UNDEFINE_TPM |
+ VIR_DOMAIN_UNDEFINE_KEEP_TPM, -1);
if ((flags & VIR_DOMAIN_UNDEFINE_NVRAM) &&
(flags & VIR_DOMAIN_UNDEFINE_KEEP_NVRAM)) {
return -1;
}
+ if ((flags & VIR_DOMAIN_UNDEFINE_TPM) &&
+ (flags & VIR_DOMAIN_UNDEFINE_KEEP_TPM)) {
+ virReportError(VIR_ERR_OPERATION_INVALID,
+ "%s", _("cannot both keep and delete TPM"));
+ return -1;
+ }
+
if (!(vm = qemuDomainObjFromDomain(dom)))
return -1;
*/
vm->persistent = 0;
if (!virDomainObjIsActive(vm))
- qemuDomainRemoveInactive(driver, vm);
+ qemuDomainRemoveInactive(driver, vm, flags);
ret = 0;
endjob:
void
qemuExtDevicesCleanupHost(virQEMUDriver *driver,
- virDomainDef *def)
+ virDomainDef *def,
+ virDomainUndefineFlagsValues flags)
{
size_t i;
return;
for (i = 0; i < def->ntpms; i++) {
- qemuExtTPMCleanupHost(def->tpms[i]);
+ qemuExtTPMCleanupHost(def->tpms[i], flags);
}
}
G_GNUC_WARN_UNUSED_RESULT;
void qemuExtDevicesCleanupHost(virQEMUDriver *driver,
- virDomainDef *def)
+ virDomainDef *def,
+ virDomainUndefineFlagsValues flags)
ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
int qemuExtDevicesStart(virQEMUDriver *driver,
* and there is no 'goto cleanup;' in the middle of those */
VIR_FREE(priv->origname);
virDomainObjRemoveTransientDef(vm);
- qemuDomainRemoveInactive(driver, vm);
+ qemuDomainRemoveInactive(driver, vm, 0);
}
virDomainObjEndAPI(&vm);
virErrorRestore(&origErr);
virDomainDeleteConfig(cfg->configDir, cfg->autostartDir, vm);
vm->persistent = 0;
}
- qemuDomainRemoveInactive(driver, vm);
+ qemuDomainRemoveInactive(driver, vm, 0);
}
cleanup:
virDomainDeleteConfig(cfg->configDir, cfg->autostartDir, vm);
vm->persistent = 0;
}
- qemuDomainRemoveInactive(driver, vm);
+ qemuDomainRemoveInactive(driver, vm, 0);
}
virErrorRestore(&orig_err);
}
if (!virDomainObjIsActive(vm))
- qemuDomainRemoveInactive(driver, vm);
+ qemuDomainRemoveInactive(driver, vm, 0);
return ret;
}
}
if (!virDomainObjIsActive(vm))
- qemuDomainRemoveInactive(driver, vm);
+ qemuDomainRemoveInactive(driver, vm, 0);
virErrorRestore(&orig_err);
return NULL;
qemuMigrationJobFinish(vm);
if (!virDomainObjIsActive(vm))
- qemuDomainRemoveInactive(driver, vm);
+ qemuDomainRemoveInactive(driver, vm, 0);
}
VIR_DOMAIN_EVENT_STOPPED,
VIR_DOMAIN_EVENT_STOPPED_DESTROYED);
- qemuDomainRemoveInactive(driver, dom);
+ qemuDomainRemoveInactive(driver, dom, 0);
virDomainObjEndJob(dom);
if (jobStarted)
virDomainObjEndJob(obj);
if (!virDomainObjIsActive(obj))
- qemuDomainRemoveInactive(driver, obj);
+ qemuDomainRemoveInactive(driver, obj, 0);
virDomainObjEndAPI(&obj);
virIdentitySetCurrent(NULL);
return;
}
if (qemuSnapshotInternalRevertInactive(driver, vm, snap) < 0) {
- qemuDomainRemoveInactive(driver, vm);
+ qemuDomainRemoveInactive(driver, vm, 0);
return -1;
}
start_flags);
virDomainAuditStart(vm, "from-snapshot", rc >= 0);
if (rc < 0) {
- qemuDomainRemoveInactive(driver, vm);
+ qemuDomainRemoveInactive(driver, vm, 0);
return -1;
}
detail = VIR_DOMAIN_EVENT_STARTED_FROM_SNAPSHOT;
/**
* qemuTPMEmulatorCleanupHost:
* @tpm: TPM definition
+ * @flags: flags indicating whether to keep or remove TPM persistent state
*
* Clean up persistent storage for the swtpm.
*/
static void
-qemuTPMEmulatorCleanupHost(virDomainTPMDef *tpm)
+qemuTPMEmulatorCleanupHost(virDomainTPMDef *tpm,
+ virDomainUndefineFlagsValues flags)
{
- if (!tpm->data.emulator.persistent_state)
+ /*
+ * remove TPM state if:
+ * - persistent_state flag is set and the UNDEFINE_TPM flag is set
+ * - persistent_state flag is not set and the KEEP_TPM flag is not set
+ */
+ if ((tpm->data.emulator.persistent_state && (flags & VIR_DOMAIN_UNDEFINE_TPM)) ||
+ (!tpm->data.emulator.persistent_state && !(flags & VIR_DOMAIN_UNDEFINE_KEEP_TPM))) {
qemuTPMEmulatorDeleteStorage(tpm);
+ }
}
void
-qemuExtTPMCleanupHost(virDomainTPMDef *tpm)
+qemuExtTPMCleanupHost(virDomainTPMDef *tpm,
+ virDomainUndefineFlagsValues flags)
{
- qemuTPMEmulatorCleanupHost(tpm);
+ qemuTPMEmulatorCleanupHost(tpm, flags);
}
ATTRIBUTE_NONNULL(3)
G_GNUC_WARN_UNUSED_RESULT;
-void qemuExtTPMCleanupHost(virDomainTPMDef *tpm)
+void qemuExtTPMCleanupHost(virDomainTPMDef *tpm,
+ virDomainUndefineFlagsValues flags)
ATTRIBUTE_NONNULL(1);
int qemuExtTPMStart(virQEMUDriver *driver,
.type = VSH_OT_BOOL,
.help = N_("keep nvram file")
},
+ {.name = "tpm",
+ .type = VSH_OT_BOOL,
+ .help = N_("remove TPM state")
+ },
+ {.name = "keep-tpm",
+ .type = VSH_OT_BOOL,
+ .help = N_("keep TPM state")
+ },
{.name = NULL}
};
bool delete_snapshots = vshCommandOptBool(cmd, "delete-storage-volume-snapshots");
bool nvram = vshCommandOptBool(cmd, "nvram");
bool keep_nvram = vshCommandOptBool(cmd, "keep-nvram");
+ bool tpm = vshCommandOptBool(cmd, "tpm");
+ bool keep_tpm = vshCommandOptBool(cmd, "keep-tpm");
/* Positive if these items exist. */
int has_managed_save = 0;
int has_snapshots_metadata = 0;
VSH_REQUIRE_OPTION("delete-storage-volume-snapshots", "remove-all-storage");
VSH_EXCLUSIVE_OPTIONS("nvram", "keep-nvram");
+ VSH_EXCLUSIVE_OPTIONS("tpm", "keep-tpm");
ignore_value(vshCommandOptStringQuiet(ctl, cmd, "storage", &vol_string));
flags |= VIR_DOMAIN_UNDEFINE_NVRAM;
if (keep_nvram)
flags |= VIR_DOMAIN_UNDEFINE_KEEP_NVRAM;
+ if (tpm)
+ flags |= VIR_DOMAIN_UNDEFINE_TPM;
+ if (keep_tpm)
+ flags |= VIR_DOMAIN_UNDEFINE_KEEP_TPM;
if (!(dom = virshCommandOptDomain(ctl, cmd, &name)))
return false;