[libvirt] [PATCH v2] tpm: adapt sysfs cancel path for new TPM driver

Stefan Berger stefanb at us.ibm.com
Wed Nov 18 00:44:13 UTC 2015


This patch addresses BZ 1244895.

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.

Signed-off-by: Stefan Berger <stefanb at linux.vnet.ibm.com>
---
 src/util/virtpm.c        | 21 ++++++++++++++++++---
 tests/qemuxml2argvmock.c | 15 +++++++++++++++
 2 files changed, 33 insertions(+), 3 deletions(-)

diff --git a/src/util/virtpm.c b/src/util/virtpm.c
index 88f8361..6d9b065 100644
--- a/src/util/virtpm.c
+++ b/src/util/virtpm.c
@@ -26,6 +26,8 @@
 
 #include "virstring.h"
 #include "virerror.h"
+#include "viralloc.h"
+#include "virfile.h"
 #include "virtpm.h"
 
 #define VIR_FROM_THIS VIR_FROM_NONE
@@ -41,14 +43,27 @@ virTPMCreateCancelPath(const char *devpath)
 {
     char *path = NULL;
     const char *dev;
+    const char *prefix[] = {"misc/", "tpm/"};
+    size_t i;
 
     if (devpath) {
         dev = strrchr(devpath, '/');
         if (dev) {
             dev++;
-            if (virAsprintf(&path, "/sys/class/misc/%s/device/cancel",
-                            dev) < 0)
-                goto cleanup;
+            for (i = 0; i < ARRAY_CARDINALITY(prefix); i++) {
+                if (virAsprintf(&path, "/sys/class/%s%s/device/cancel",
+                                prefix[i], dev) < 0)
+                     goto cleanup;
+
+                if (virFileExists(path))
+                    break;
+
+                VIR_FREE(path);
+            }
+            if (!path)
+                virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+                               _("No usable sysfs TPM cancel file could be "
+                                 "found"));
         } else {
             virReportError(VIR_ERR_INTERNAL_ERROR,
                            _("TPM device path %s is invalid"), devpath);
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;
+}
-- 
2.4.3




More information about the libvir-list mailing list