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(a)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;
+}