[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH V2] libxl: fix cleanup of tap devices in libxl__device_destroy
# HG changeset patch # User Ian Campbell <ian.campbell@xxxxxxxxxx> # Date 1343985174 -3600 # Node ID 2c21d5c75dcbdf52987fbc47e4c8181b9236bca3 # Parent f9d3acc755bd1b05f5d2c6a592a760953f0e83bd libxl: fix cleanup of tap devices in libxl__device_destroy We pass be_path to tapdisk_destroy but we've already deleted it so it fails to read tapdisk-params. However it appears that we need to destroy the tap device after tearing down xenstore, to avoid the leak reported by Greg Wettstein in <201207312141.q6VLfJje012656@xxxxxxxxxxxxxxxxx>. So read the tapdisk-params in the cleanup transaction, before the remove, and pass that down to destroy_tapdisk instead. tapdisk-params may of course be NULL if the device isn't a tap device. There is no need to tear down the tap device from libxl__initiate_device_remove since this ultimately calls libxl__device_destroy. Propagate and log errors from libxl__device_destroy_tapdisk. Signed-off-by: Ian Campbell <ian.campbell@xxxxxxxxxx> --- v2: - use libxl__xs_read_checked. libxl__device_destroy_tapdisk therefore takes a const char * params and dups itself a writeable copy. - prerequisites are now in tree. diff -r f9d3acc755bd -r 2c21d5c75dcb tools/libxl/libxl_blktap2.c --- a/tools/libxl/libxl_blktap2.c Fri Aug 03 10:12:33 2012 +0100 +++ b/tools/libxl/libxl_blktap2.c Fri Aug 03 10:12:54 2012 +0100 @@ -51,28 +51,37 @@ char *libxl__blktap_devpath(libxl__gc *g } -void libxl__device_destroy_tapdisk(libxl__gc *gc, char *be_path) +int libxl__device_destroy_tapdisk(libxl__gc *gc, const char *params) { - char *path, *params, *type, *disk; + char *type, *disk; int err; tap_list_t tap; - path = libxl__sprintf(gc, "%s/tapdisk-params", be_path); - if (!path) return; + type = libxl__strdup(gc, params); - params = libxl__xs_read(gc, XBT_NULL, path); - if (!params) return; - - type = params; - disk = strchr(params, ':'); - if (!disk) return; + disk = strchr(type, ':'); + if (!disk) { + LOG(ERROR, "Unable to parse params %s", params); + return ERROR_INVAL; + } *disk++ = '\0'; err = tap_ctl_find(type, disk, &tap); - if (err < 0) return; + if (err < 0) { + /* returns -errno */ + LOGEV(ERROR, -err, "Unable to find type %s disk %s", type, disk); + return ERROR_FAIL; + } - tap_ctl_destroy(tap.id, tap.minor); + err = tap_ctl_destroy(tap.id, tap.minor); + if (err < 0) { + LOGEV(ERROR, -err, "Failed to destroy tap device id %d minor %d", + tap.id, tap.minor); + return ERROR_FAIL; + } + + return 0; } /* diff -r f9d3acc755bd -r 2c21d5c75dcb tools/libxl/libxl_device.c --- a/tools/libxl/libxl_device.c Fri Aug 03 10:12:33 2012 +0100 +++ b/tools/libxl/libxl_device.c Fri Aug 03 10:12:54 2012 +0100 @@ -522,8 +522,10 @@ DEFINE_DEVICES_ADD(nic) int libxl__device_destroy(libxl__gc *gc, libxl__device *dev) { - char *be_path = libxl__device_backend_path(gc, dev); + const char *be_path = libxl__device_backend_path(gc, dev); const char *fe_path = libxl__device_frontend_path(gc, dev); + const char *tapdisk_path = GCSPRINTF("%s/%s", be_path, "tapdisk-params"); + const char *tapdisk_params; xs_transaction_t t = 0; int rc; @@ -531,6 +533,10 @@ int libxl__device_destroy(libxl__gc *gc, rc = libxl__xs_transaction_start(gc, &t); if (rc) goto out; + /* May not exist if this is not a tap device */ + rc = libxl__xs_read_checked(gc, t, tapdisk_path, &tapdisk_params); + if (rc) goto out; + libxl__xs_path_cleanup(gc, t, fe_path); libxl__xs_path_cleanup(gc, t, be_path); @@ -539,7 +545,8 @@ int libxl__device_destroy(libxl__gc *gc, if (rc < 0) goto out; } - libxl__device_destroy_tapdisk(gc, be_path); + if (tapdisk_params) + rc = libxl__device_destroy_tapdisk(gc, tapdisk_params); out: libxl__xs_transaction_abort(gc, &t); @@ -790,8 +797,6 @@ void libxl__initiate_device_remove(libxl if (rc < 0) goto out; } - libxl__device_destroy_tapdisk(gc, be_path); - rc = libxl__ev_devstate_wait(gc, &aodev->backend_ds, device_backend_callback, state_path, XenbusStateClosed, diff -r f9d3acc755bd -r 2c21d5c75dcb tools/libxl/libxl_internal.h --- a/tools/libxl/libxl_internal.h Fri Aug 03 10:12:33 2012 +0100 +++ b/tools/libxl/libxl_internal.h Fri Aug 03 10:12:54 2012 +0100 @@ -1344,8 +1344,9 @@ _hidden char *libxl__blktap_devpath(libx /* libxl__device_destroy_tapdisk: * Destroys any tapdisk process associated with the backend represented * by be_path. + * Always logs on failure. */ -_hidden void libxl__device_destroy_tapdisk(libxl__gc *gc, char *be_path); +_hidden int libxl__device_destroy_tapdisk(libxl__gc *gc, const char *params); _hidden int libxl__device_from_disk(libxl__gc *gc, uint32_t domid, libxl_device_disk *disk, diff -r f9d3acc755bd -r 2c21d5c75dcb tools/libxl/libxl_noblktap2.c --- a/tools/libxl/libxl_noblktap2.c Fri Aug 03 10:12:33 2012 +0100 +++ b/tools/libxl/libxl_noblktap2.c Fri Aug 03 10:12:54 2012 +0100 @@ -28,8 +28,9 @@ char *libxl__blktap_devpath(libxl__gc *g return NULL; } -void libxl__device_destroy_tapdisk(libxl__gc *gc, char *be_path) +int libxl__device_destroy_tapdisk(libxl__gc *gc, const char *params) { + return 0; } /* _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |