libxl: attempt to cleanup tapdisk processes on disk backend destroy.
authorIan Campbell <ian.campbell@citrix.com>
Wed, 28 Sep 2011 15:42:11 +0000 (16:42 +0100)
committerIan Campbell <ian.campbell@citrix.com>
Wed, 28 Sep 2011 15:42:11 +0000 (16:42 +0100)
Signed-off-by: Ian Campbell <ian.campbell@citrix.com>
Committed-by: Ian Jackson <ian.jackson@eu.citrix.com>
tools/blktap2/control/tap-ctl-list.c
tools/blktap2/control/tap-ctl.h
tools/libxl/libxl_blktap2.c
tools/libxl/libxl_device.c
tools/libxl/libxl_internal.h
tools/libxl/libxl_noblktap2.c

index 149727087441fb59c510a7782ec417f509c3bac3..c91f6f48d3564bda4ba40e1a3286d4e9a09df379 100644 (file)
@@ -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, const char *path)
                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;
 }
index d951e774cbff2bb9818d05bee0dc812a9566c582..de0bc29a482af7b7d2393a19f75e02008fe8f9a8 100644 (file)
@@ -76,7 +76,7 @@ int tap_ctl_get_driver_id(const char *handle);
 
 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);
index 7c165fcc9aec76fa3d3aaa431764b423ab205413..994f85be03fe3947e96c410c76bb8327a9ec89f8 100644 (file)
@@ -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 @@ char *libxl__blktap_devpath(libxl__gc *gc,
 {
     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 @@ char *libxl__blktap_devpath(libxl__gc *gc,
 
     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);
+}
index 124ea4cd70393e09b97313b49e0b08ef5448987a..5392d0e352ccb870cda66aeaef4ea1f507eba41e 100644 (file)
@@ -376,6 +376,7 @@ int libxl__device_destroy(libxl__gc *gc, char *be_path, int force)
     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;
     }
@@ -398,6 +399,7 @@ retry_transaction:
     } else {
         xs_rm(ctx->xsh, XBT_NULL, be_path);
     }
+    libxl__device_destroy_tapdisk(gc, be_path);
 out:
     return rc;
 }
index 0e1aac8fa0da740625b7c9472bb4ef2f68f958d6..b4316321031ed9bc48b39dfa80081d84650e4b8b 100644 (file)
@@ -363,6 +363,12 @@ _hidden char *libxl__blktap_devpath(libxl__gc *gc,
                                     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 {
index a66346a286bba0f6ddbf56e53c499afc3745ff84..33f557ff49a80904a180cf9d17bafa3c3404904b 100644 (file)
@@ -27,3 +27,7 @@ char *libxl__blktap_devpath(libxl__gc *gc,
 {
     return NULL;
 }
+
+void libxl__device_destroy_tapdisk(libxl__gc *gc, char *be_path)
+{
+}