Ian Campbell
2011-Sep-21 13:54 UTC
[Xen-devel] [PATCH] libxl: attempt to cleanup tapdisk processes on disk backend destroy
# HG changeset patch # User Ian Campbell <ian.campbell@citrix.com> # Date 1316609964 -3600 # Node ID b43fd821d1aebc8671e684bfc285cda7a6002ff1 # Parent 206afa070919e3fe0b13a03f870ca2da44ab604a libxl: attempt to cleanup tapdisk processes on disk backend destroy. Signed-off-by: Ian Campbell <ian.campbell@citrix.com> diff -r 206afa070919 -r b43fd821d1ae tools/blktap2/control/tap-ctl-list.c --- a/tools/blktap2/control/tap-ctl-list.c Wed Sep 21 13:59:24 2011 +0100 +++ b/tools/blktap2/control/tap-ctl-list.c Wed Sep 21 13:59:24 2011 +0100 @@ -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 206afa070919 -r b43fd821d1ae tools/blktap2/control/tap-ctl.h --- a/tools/blktap2/control/tap-ctl.h Wed Sep 21 13:59:24 2011 +0100 +++ b/tools/blktap2/control/tap-ctl.h Wed Sep 21 13:59:24 2011 +0100 @@ -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 206afa070919 -r b43fd821d1ae tools/libxl/libxl_blktap2.c --- a/tools/libxl/libxl_blktap2.c Wed Sep 21 13:59:24 2011 +0100 +++ b/tools/libxl/libxl_blktap2.c Wed Sep 21 13:59:24 2011 +0100 @@ -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 *g { 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 *g 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 206afa070919 -r b43fd821d1ae tools/libxl/libxl_device.c --- a/tools/libxl/libxl_device.c Wed Sep 21 13:59:24 2011 +0100 +++ b/tools/libxl/libxl_device.c Wed Sep 21 13:59:24 2011 +0100 @@ -372,6 +372,7 @@ int libxl__device_destroy(libxl__gc *gc, 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; } @@ -394,6 +395,7 @@ retry_transaction: } else { xs_rm(ctx->xsh, XBT_NULL, be_path); } + libxl__device_destroy_tapdisk(gc, be_path); out: return rc; } diff -r 206afa070919 -r b43fd821d1ae tools/libxl/libxl_internal.h --- a/tools/libxl/libxl_internal.h Wed Sep 21 13:59:24 2011 +0100 +++ b/tools/libxl/libxl_internal.h Wed Sep 21 13:59:24 2011 +0100 @@ -363,6 +363,12 @@ _hidden char *libxl__blktap_devpath(libx 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 206afa070919 -r b43fd821d1ae tools/libxl/libxl_noblktap2.c --- a/tools/libxl/libxl_noblktap2.c Wed Sep 21 13:59:24 2011 +0100 +++ b/tools/libxl/libxl_noblktap2.c Wed Sep 21 13:59:24 2011 +0100 @@ -27,3 +27,7 @@ char *libxl__blktap_devpath(libxl__gc *g { return NULL; } + +void libxl__device_destroy_tapdisk(libxl__gc *gc, char *be_path) +{ +} _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
Ian Jackson
2011-Sep-28 15:42 UTC
Re: [Xen-devel] [PATCH] libxl: attempt to cleanup tapdisk processes on disk backend destroy
Ian Campbell writes ("[Xen-devel] [PATCH] libxl: attempt to cleanup tapdisk processes on disk backend destroy"):> libxl: attempt to cleanup tapdisk processes on disk backend destroy.This looks plausible to me, although I''m not hugely familiar with the tapdisk machinery. Committed-by: Ian Jackson <ian.jackson@eu.citrix.com> _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
Maybe Matching Threads
- [PATCH 1/2] 4.1.2 blktap2 cleanup fixes.
- [PATCH 2/2] 4.1.2 blktap2 cleanup fixes.
- Tapdisk processes being left behind when hvm domu's migrate/shutdown
- Can't block-attach a file on a read only volume?
- [PATCH, v2]: xl: Implement per-API-call garbage-collection lifetime