From: Arun Menon <armenon@redhat.com> This commit adds the backup and fsync options while constructing the swtpm command. Both of these attributes only work with the directory backend. Refactor qemuTPMVirCommandSwtpmAddTPMState() function, use virBuffer API to construct the qemu command and use virReportError to report configuration errors. Signed-off-by: Arun Menon <armenon@redhat.com> --- src/qemu/qemu_tpm.c | 55 ++++++++++++++++++++++++++++++++++----------- src/util/virtpm.c | 2 ++ src/util/virtpm.h | 2 ++ 3 files changed, 46 insertions(+), 13 deletions(-) diff --git a/src/qemu/qemu_tpm.c b/src/qemu/qemu_tpm.c index 34e11cc02f..2421c0ddba 100644 --- a/src/qemu/qemu_tpm.c +++ b/src/qemu/qemu_tpm.c @@ -669,34 +669,61 @@ qemuTPMVirCommandSwtpmAddEncryption(virCommand *cmd, return 0; } -static void +static int qemuTPMVirCommandSwtpmAddTPMState(virCommand *cmd, const virDomainTPMEmulatorDef *emulator, const virDomainTPMDef *tpmDef, const virQEMUDriverConfig *cfg) { - const char *lock = ",lock"; + g_auto(virBuffer) buf = VIR_BUFFER_INITIALIZER; + g_autofree char *swtpm = NULL; + bool hasLock = virTPMSwtpmCapsGet(VIR_TPM_SWTPM_FEATURE_TPMSTATE_OPT_LOCK); - if (!virTPMSwtpmCapsGet(VIR_TPM_SWTPM_FEATURE_TPMSTATE_OPT_LOCK)) { - if (qemuTPMHasSharedStorage(cfg, tpmDef)) - VIR_WARN("This swtpm version doesn't support explicit locking"); + swtpm = virTPMGetSwtpm(); - lock = ""; - } + if (!hasLock && qemuTPMHasSharedStorage(cfg, tpmDef)) + VIR_WARN("This swtpm version doesn't support explicit locking"); virCommandAddArg(cmd, "--tpmstate"); + switch (emulator->source_type) { case VIR_DOMAIN_TPM_SOURCE_TYPE_FILE: - virCommandAddArgFormat(cmd, "backend-uri=file://%s%s", - emulator->source_path, lock); + virBufferAsprintf(&buf, "backend-uri=file://%s", emulator->source_path); + if (hasLock) + virBufferAddLit(&buf, ",lock"); break; + case VIR_DOMAIN_TPM_SOURCE_TYPE_DIR: case VIR_DOMAIN_TPM_SOURCE_TYPE_DEFAULT: case VIR_DOMAIN_TPM_SOURCE_TYPE_LAST: - virCommandAddArgFormat(cmd, "dir=%s,mode=0600%s", - emulator->source_path, lock); + virBufferAsprintf(&buf, "dir=%s,mode=0600", emulator->source_path); + if (hasLock) + virBufferAddLit(&buf, ",lock"); + + if (emulator->backup == VIR_TRISTATE_BOOL_YES) { + if (!virTPMSwtpmCapsGet(VIR_TPM_SWTPM_FEATURE_TPMSTATE_OPT_BACKUP)) { + virReportError(VIR_ERR_ARGUMENT_UNSUPPORTED, + _("%1$s does not support backup feature"), + swtpm); + return -1; + } + virBufferAddLit(&buf, ",backup"); + } + + if (emulator->fsync == VIR_TRISTATE_BOOL_YES) { + if (!virTPMSwtpmCapsGet(VIR_TPM_SWTPM_FEATURE_TPMSTATE_OPT_FSYNC)) { + virReportError(VIR_ERR_ARGUMENT_UNSUPPORTED, + _("%1$s does not support fsync feature"), + swtpm); + return -1; + } + virBufferAddLit(&buf, ",fsync"); + } break; } + + virCommandAddArgBuffer(cmd, &buf); + return 0; } /* qemuTPMEmulatorUpdateProfileName: @@ -736,7 +763,8 @@ qemuTPMEmulatorUpdateProfileName(virDomainTPMEmulatorDef *emulator, virCommandAddArgList(cmd, "socket", "--print-info", "0x20", "--tpm2", NULL); - qemuTPMVirCommandSwtpmAddTPMState(cmd, emulator, persistentTPMDef, cfg); + if (qemuTPMVirCommandSwtpmAddTPMState(cmd, emulator, persistentTPMDef, cfg) < 0) + return -1; if (qemuTPMVirCommandSwtpmAddEncryption(cmd, emulator, swtpm) < 0) return -1; @@ -860,7 +888,8 @@ qemuTPMEmulatorBuildCommand(virDomainTPMDef *tpm, virCommandAddArgFormat(cmd, "type=unixio,path=%s,mode=0600", tpm->data.emulator.source->data.nix.path); - qemuTPMVirCommandSwtpmAddTPMState(cmd, &tpm->data.emulator, tpm, cfg); + if (qemuTPMVirCommandSwtpmAddTPMState(cmd, &tpm->data.emulator, tpm, cfg) < 0) + goto error; virCommandAddArg(cmd, "--log"); if (tpm->data.emulator.debug != 0) diff --git a/src/util/virtpm.c b/src/util/virtpm.c index cf0f20e009..2e890f94ef 100644 --- a/src/util/virtpm.c +++ b/src/util/virtpm.c @@ -44,6 +44,8 @@ VIR_ENUM_IMPL(virTPMSwtpmFeature, "nvram-backend-file", "cmdarg-print-info", "tpmstate-opt-lock", + "tpmstate-dir-backend-opt-backup", + "tpmstate-dir-backend-opt-fsync", ); VIR_ENUM_IMPL(virTPMSwtpmSetupFeature, diff --git a/src/util/virtpm.h b/src/util/virtpm.h index 2892dd307e..1d2c94d36b 100644 --- a/src/util/virtpm.h +++ b/src/util/virtpm.h @@ -35,6 +35,8 @@ typedef enum { VIR_TPM_SWTPM_FEATURE_NVRAM_BACKEND_FILE, VIR_TPM_SWTPM_FEATURE_CMDARG_PRINT_INFO, VIR_TPM_SWTPM_FEATURE_TPMSTATE_OPT_LOCK, + VIR_TPM_SWTPM_FEATURE_TPMSTATE_OPT_BACKUP, + VIR_TPM_SWTPM_FEATURE_TPMSTATE_OPT_FSYNC, VIR_TPM_SWTPM_FEATURE_LAST } virTPMSwtpmFeature; -- 2.54.0