Dr. Greg Wettstein
2012-Aug-05  14:40 UTC
Xen 4.1.x backport request <e4781aedf817c5ab36f6f3077e44c43c566a2812>
Backport of the following patch from development:
# User Ian Campbell <[hidden email]>
# Date 1309968705 -3600
# Node ID e4781aedf817c5ab36f6f3077e44c43c566a2812
# Parent  05700ef33648e0777fb48ba965bf723264d56a31
libxl: attempt to cleanup tapdisk processes on disk backend destroy.
This patch properly terminates the tapdisk2 process(es) started
to service a virtual block device.
Without this patch 4.1.2 leaves a tapdisk2 process running for each
tap device created.
Signed-off-by: Greg Wettstein <greg@enjellic.com>
diff -r fa34499e8f6c tools/blktap2/control/tap-ctl-list.c
--- a/tools/blktap2/control/tap-ctl-list.c	Mon Jul 30 13:38:58 2012 +0100
+++ b/tools/blktap2/control/tap-ctl-list.c	Sun Aug 05 09:26:56 2012 -0500
@@ -506,17 +506,15 @@ out:
 }
 
 int
-tap_ctl_find_minor(const char *type, const char *path)
+tap_ctl_find(const char *type, const char *path, tap_list_t *tap)
 {
 	tap_list_t **list, **_entry;
-	int minor, err;
+	int ret = -ENOENT, err;
 
 	err = tap_ctl_list(&list);
 	if (err)
 		return err;
 
-	minor = -1;
-
 	for (_entry = list; *_entry != NULL; ++_entry) {
 		tap_list_t *entry  = *_entry;
 
@@ -526,11 +524,13 @@ tap_ctl_find_minor(const char *type, con
 		if (path && (!entry->path || strcmp(entry->path, path)))
 			continue;
 
-		minor = entry->minor;
+		*tap = *entry;
+		tap->type = tap->path = NULL;
+		ret = 0;
 		break;
 	}
 
 	tap_ctl_free_list(list);
 
-	return minor >= 0 ? minor : -ENOENT;
+	return ret;
 }
diff -r fa34499e8f6c tools/blktap2/control/tap-ctl.h
--- a/tools/blktap2/control/tap-ctl.h	Mon Jul 30 13:38:58 2012 +0100
+++ b/tools/blktap2/control/tap-ctl.h	Sun Aug 05 09:26:56 2012 -0500
@@ -76,7 +76,7 @@ int tap_ctl_get_driver_id(const char *ha
 
 int tap_ctl_list(tap_list_t ***list);
 void tap_ctl_free_list(tap_list_t **list);
-int tap_ctl_find_minor(const char *type, const char *path);
+int tap_ctl_find(const char *type, const char *path, tap_list_t *tap);
 
 int tap_ctl_allocate(int *minor, char **devname);
 int tap_ctl_free(const int minor);
diff -r fa34499e8f6c tools/libxl/libxl_blktap2.c
--- a/tools/libxl/libxl_blktap2.c	Mon Jul 30 13:38:58 2012 +0100
+++ b/tools/libxl/libxl_blktap2.c	Sun Aug 05 09:26:56 2012 -0500
@@ -18,6 +18,8 @@
 
 #include "tap-ctl.h"
 
+#include <string.h>
+
 int libxl__blktap_enabled(libxl__gc *gc)
 {
     const char *msg;
@@ -30,12 +32,13 @@ const char *libxl__blktap_devpath(libxl_
 {
     const char *type;
     char *params, *devname = NULL;
-    int minor, err;
+    tap_list_t tap;
+    int err;
 
     type = libxl__device_disk_string_of_format(format);
-    minor = tap_ctl_find_minor(type, disk);
-    if (minor >= 0) {
-        devname = libxl__sprintf(gc, "/dev/xen/blktap-2/tapdev%d",
minor);
+    err = tap_ctl_find(type, disk, &tap);
+    if (err == 0) {
+        devname = libxl__sprintf(gc, "/dev/xen/blktap-2/tapdev%d",
tap.minor);
         if (devname)
             return devname;
     }
@@ -49,3 +52,28 @@ const char *libxl__blktap_devpath(libxl_
 
     return NULL;
 }
+
+
+void libxl__device_destroy_tapdisk(libxl__gc *gc, char *be_path)
+{
+    char *path, *params, *type, *disk;
+    int err;
+    tap_list_t tap;
+
+    path = libxl__sprintf(gc, "%s/tapdisk-params", be_path);
+    if (!path) return;
+
+    params = libxl__xs_read(gc, XBT_NULL, path);
+    if (!params) return;
+
+    type = params;
+    disk = strchr(params, '':'');
+    if (!disk) return;
+
+    *disk++ = ''\0'';
+
+    err = tap_ctl_find(type, disk, &tap);
+    if (err < 0) return;
+
+    tap_ctl_destroy(tap.id, tap.minor);
+}
diff -r fa34499e8f6c tools/libxl/libxl_device.c
--- a/tools/libxl/libxl_device.c	Mon Jul 30 13:38:58 2012 +0100
+++ b/tools/libxl/libxl_device.c	Sun Aug 05 09:26:56 2012 -0500
@@ -250,6 +250,7 @@ int libxl__device_destroy(libxl_ctx *ctx
     if (!state)
         goto out;
     if (atoi(state) != 4) {
+        libxl__device_destroy_tapdisk(&gc, be_path);
         xs_rm(ctx->xsh, XBT_NULL, be_path);
         goto out;
     }
@@ -368,6 +369,7 @@ int libxl__devices_destroy(libxl_ctx *ct
             }
         }
     }
+    libxl__device_destroy_tapdisk(&gc, be_path);
 out:
     libxl__free_all(&gc);
     return 0;
diff -r fa34499e8f6c tools/libxl/libxl_internal.h
--- a/tools/libxl/libxl_internal.h	Mon Jul 30 13:38:58 2012 +0100
+++ b/tools/libxl/libxl_internal.h	Sun Aug 05 09:26:56 2012 -0500
@@ -314,6 +314,12 @@ _hidden const char *libxl__blktap_devpat
                                  const char *disk,
                                  libxl_disk_format format);
 
+/* libxl__device_destroy_tapdisk:
+ *   Destroys any tapdisk process associated with the backend represented
+ *   by be_path.
+ */
+_hidden void libxl__device_destroy_tapdisk(libxl__gc *gc, char *be_path);
+
 _hidden char *libxl__uuid2string(libxl__gc *gc, const libxl_uuid uuid);
 
 struct libxl__xen_console_reader {
diff -r fa34499e8f6c tools/libxl/libxl_noblktap2.c
--- a/tools/libxl/libxl_noblktap2.c	Mon Jul 30 13:38:58 2012 +0100
+++ b/tools/libxl/libxl_noblktap2.c	Sun Aug 05 09:26:56 2012 -0500
@@ -27,3 +27,7 @@ const char *libxl__blktap_devpath(libxl_
 {
     return NULL;
 }
+
+void libxl__device_destroy_tapdisk(libxl__gc *gc, char *be_path)
+{
+}
As always,
Dr. G.W. Wettstein, Ph.D.   Enjellic Systems Development, LLC.
4206 N. 19th Ave.           Specializing in information infra-structure
Fargo, ND  58102            development.
PH: 701-281-1686
FAX: 701-281-3949           EMAIL: greg@enjellic.com
------------------------------------------------------------------------------
"My thoughts on the composition and effectiveness of the advisory
 committee?
 I think they are destined to accomplish about the same thing as what
 you would get from locking 9 chimpanzees in a room with an armed
 thermonuclear weapon and a can opener with orders to disarm it."
                                -- Dr. Greg Wettstein
                                   Resurrection