On 10/3/22 11:20, Michal Prívozník wrote:
On 8/23/22 18:28, Stefan Berger wrote:
Add UNDEFINE_TPM and UNDEFINE_KEEP_TPM flags to qemuDomainUndefineFlags()
API and --tpm and --keep-tpm to 'virsh undefine'. Pass the
virDomainUndefineFlagsValues via qemuDomainRemoveInactive()
from qemuDomainUndefineFlags() all the way down to
qemuTPMEmulatorCleanupHost() and delete TPM storage there considering that
the UNDEFINE_TPM flag has priority over the persistent_state attribute
from the domain XML. Pass 0 in all other API call sites to
qemuDomainRemoveInactive() for now.

Signed-off-by: Stefan Berger <stef...@linux.ibm.com>
---
  include/libvirt/libvirt-domain.h |  6 ++++++
  src/qemu/qemu_domain.c           | 12 +++++++-----
  src/qemu/qemu_domain.h           |  3 ++-
  src/qemu/qemu_driver.c           | 31 ++++++++++++++++++++-----------
  src/qemu/qemu_extdevice.c        |  5 +++--
  src/qemu/qemu_extdevice.h        |  3 ++-
  src/qemu/qemu_migration.c        | 12 ++++++------
  src/qemu/qemu_process.c          |  4 ++--
  src/qemu/qemu_snapshot.c         |  4 ++--
  src/qemu/qemu_tpm.c              | 14 ++++++++++----
  src/qemu/qemu_tpm.h              |  3 ++-
  tools/virsh-domain.c             | 15 +++++++++++++++
  12 files changed, 77 insertions(+), 35 deletions(-)

diff --git a/include/libvirt/libvirt-domain.h b/include/libvirt/libvirt-domain.h
index 7430a08619..5f12c673d6 100644
--- a/include/libvirt/libvirt-domain.h
+++ b/include/libvirt/libvirt-domain.h
@@ -2267,9 +2267,15 @@ typedef enum {
      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.8.0) */
+    VIR_DOMAIN_UNDEFINE_KEEP_TPM           = (1 << 6), /* Keep TPM state 
(Since: 8.8.0) */
+    VIR_DOMAIN_UNDEFINE_TPM_MASK           = (3 << 5), /* TPM flags mask 
(Since: 8.8.0) */

I believe this _MASK is not something we want to expose to users. It's
not like both _KEEP_TPM and _TPM can be passed at the same time.

I will remove it...


+    /* Future undefine control flags should come here. */
  } virDomainUndefineFlagsValues;
+
  int                     virDomainUndefineFlags   (virDomainPtr domain,
                                                    unsigned int flags);
  int                     virConnectNumOfDefinedDomains  (virConnectPtr conn);
diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
index d5fef76211..47eabd0eec 100644
--- a/src/qemu/qemu_domain.c
+++ b/src/qemu/qemu_domain.c
@@ -7143,7 +7143,8 @@ qemuDomainSnapshotDiscardAllMetadata(virQEMUDriver 
*driver,
static void
  qemuDomainRemoveInactiveCommon(virQEMUDriver *driver,
-                               virDomainObj *vm)
+                               virDomainObj *vm,
+                               virDomainUndefineFlagsValues flags)

I'd rather use unsigned int for flags. In the end,
qemuDomainUndefineFlags() uses uint and passes it to
qemuDomainRemoveInactive() so there's not much value in keeping the type.

Should I rename flags to undefine_flags in this patch just so these flags are 
different from other sets of flags? To make them distinguishable was the 
primary reason to keep the type around.



          qemuTPMEmulatorDeleteStorage(tpm);
+    } else if (!tpm->data.emulator.persistent_state &&
+             (flags & VIR_DOMAIN_UNDEFINE_TPM_MASK) == 0) {
+        qemuTPMEmulatorDeleteStorage(tpm);

Here, we should do something similar to NVRAM: fail if the storage
exists and KEEP_TPM wasn't specified. Which is going to break existing
workloads where undefine worked even without the flag. So maybe just
need this?

     if ((tpm->data.emulator.persistent_state && flags &
VIR_DOMAIN_UNDEFINE_TPM) ||
         !tpm->data.emulator.persistent_state && !(flags &
VIR_DOMAIN_UNDEFINE_KEEP_TPM)) {
         qemuTPMEmulatorDeleteStorage(tpm);
     }

I'll have a look at this.




+    }
  }
@@ -993,9 +998,10 @@ qemuExtTPMPrepareHost(virQEMUDriver *driver, void
-qemuExtTPMCleanupHost(virDomainTPMDef *tpm)
+qemuExtTPMCleanupHost(virDomainTPMDef *tpm,
+                      virDomainUndefineFlagsValues flags)
  {
-    qemuTPMEmulatorCleanupHost(tpm);
+    qemuTPMEmulatorCleanupHost(tpm, flags);
  }
diff --git a/src/qemu/qemu_tpm.h b/src/qemu/qemu_tpm.h
index 9951f025a6..f068f3ca5a 100644
--- a/src/qemu/qemu_tpm.h
+++ b/src/qemu/qemu_tpm.h
@@ -35,7 +35,8 @@ int qemuExtTPMPrepareHost(virQEMUDriver *driver,
      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,
diff --git a/tools/virsh-domain.c b/tools/virsh-domain.c
index d2ea4d1c7b..ff9c081d71 100644
--- a/tools/virsh-domain.c
+++ b/tools/virsh-domain.c
@@ -3650,6 +3650,14 @@ static const vshCmdOptDef opts_undefine[] = {
       .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")
+    },

These new arguments should be documented in virsh manpage.

Yes, right.

  Stefan

Michal


Reply via email to