
First, thanks for following up on the fedora bugs so quickly! On 11/17/2015 10:46 AM, Stefan Berger wrote:
Adapt the sysfs TPM command cancel path for the TPM driver that does not use a miscdevice anymore since Linux 4.0. Support old and new paths and check their availability.
Add a mockup for the test cases to avoid the testing for availability of the cancel path.
I see you sent a qemu patch for a similar change. What's the benefit of libvirt setting cancel_path if qemu can (and already attempts to) figure it out? - Cole
Signed-off-by: Stefan Berger <stefanb@linux.vnet.ibm.com> --- src/util/virtpm.c | 22 ++++++++++++++++++++-- tests/qemuxml2argvmock.c | 15 +++++++++++++++ 2 files changed, 35 insertions(+), 2 deletions(-)
diff --git a/src/util/virtpm.c b/src/util/virtpm.c index 88f8361..3872a31 100644 --- a/src/util/virtpm.c +++ b/src/util/virtpm.c @@ -23,9 +23,12 @@ #include <config.h>
#include <sys/stat.h> +#include <fcntl.h>
#include "virstring.h" #include "virerror.h" +#include "viralloc.h" +#include "virfile.h" #include "virtpm.h"
#define VIR_FROM_THIS VIR_FROM_NONE @@ -41,13 +44,28 @@ virTPMCreateCancelPath(const char *devpath) { char *path = NULL; const char *dev; + const char *prefix[] = {"misc/", "tpm/"}; + size_t i; + int fd;
if (devpath) { dev = strrchr(devpath, '/'); if (dev) { dev++; - if (virAsprintf(&path, "/sys/class/misc/%s/device/cancel", - dev) < 0) + for (i = 0; i < ARRAY_CARDINALITY(prefix); i++) { + if (virAsprintf(&path, "/sys/class/%s%s/device/cancel", + prefix[i], dev) < 0) + goto cleanup; + + fd = open(path, O_WRONLY); + if (fd >= 0) { + VIR_FORCE_CLOSE(fd); + break; + } + VIR_FREE(path); + } + /* /dev/null does not allow to cancel cmds but it can be used */ + if (!path && virAsprintf(&path, "/dev/null") < 0) goto cleanup; } else { virReportError(VIR_ERR_INTERNAL_ERROR, diff --git a/tests/qemuxml2argvmock.c b/tests/qemuxml2argvmock.c index d24725e..e58b8ce 100644 --- a/tests/qemuxml2argvmock.c +++ b/tests/qemuxml2argvmock.c @@ -24,9 +24,13 @@ #include "virnuma.h" #include "virmock.h" #include "virutil.h" +#include "virstring.h" +#include "virtpm.h" #include <time.h> #include <unistd.h>
+#define VIR_FROM_THIS VIR_FROM_NONE + long virGetSystemPageSize(void) { return 4096; @@ -59,3 +63,14 @@ virNumaNodeIsAvailable(int node) return node >= 0 && node <= virNumaGetMaxNode(); } #endif /* WITH_NUMACTL && HAVE_NUMA_BITMASK_ISBITSET */ + +char * +virTPMCreateCancelPath(const char *devpath) +{ + char *path; + (void)devpath; + + ignore_value(VIR_STRDUP(path, "/sys/class/misc/tpm0/device/cancel")); + + return path; +}