[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen-unstable] libxl: unify libxl__device_destroy and device_hotplug_done
# HG changeset patch # User Ian Jackson <ian.jackson@xxxxxxxxxxxxx> # Date 1343984047 -3600 # Node ID e661d09c5117fa271291a1780521344a345426e5 # Parent d153e1abe5b665b88737fed35ca46be6555a27e0 libxl: unify libxl__device_destroy and device_hotplug_done device_hotplug_done contains an open-coded but improved version of libxl__device_destroy. So move the contents of device_hotplug_done into libxl__device_destroy, deleting the old code, and replace it at its old location with a function call. Add the missing call to libxl__xs_transaction_abort (which was present in neither version and technically speaking is always a no-op with this code as it stands at the moment because no-one does "goto out" other than after libxl__xs_transaction_start or _commit). Also fix the error handling: the rc from the destroy should be propagated into the aodev. Reported-by: Ian Campbell <Ian.Campbell@xxxxxxxxxx> Signed-off-by: Ian Jackson <ian.jackson@xxxxxxxxxxxxx> Acked-by: Ian Campbell <ian.campbell@xxxxxxxxxx> Committed-by: Ian Campbell <ian.campbell@xxxxxxxxxx> --- diff -r d153e1abe5b6 -r e661d09c5117 tools/libxl/libxl_device.c --- a/tools/libxl/libxl_device.c Fri Aug 03 09:54:07 2012 +0100 +++ b/tools/libxl/libxl_device.c Fri Aug 03 09:54:07 2012 +0100 @@ -513,22 +513,24 @@ int libxl__device_destroy(libxl__gc *gc, char *be_path = libxl__device_backend_path(gc, dev); char *fe_path = libxl__device_frontend_path(gc, dev); xs_transaction_t t = 0; - int rc = 0; + int rc; - do { - t = xs_transaction_start(CTX->xsh); + for (;;) { + rc = libxl__xs_transaction_start(gc, &t); + if (rc) goto out; + libxl__xs_path_cleanup(gc, t, fe_path); libxl__xs_path_cleanup(gc, t, be_path); - rc = !xs_transaction_end(CTX->xsh, t, 0); - } while (rc && errno == EAGAIN); - if (rc) { - LOGE(ERROR, "unable to finish transaction"); - goto out; + + rc = libxl__xs_transaction_commit(gc, &t); + if (!rc) break; + if (rc < 0) goto out; } libxl__device_destroy_tapdisk(gc, be_path); out: + libxl__xs_transaction_abort(gc, &t); return rc; } @@ -993,29 +995,17 @@ error: static void device_hotplug_done(libxl__egc *egc, libxl__ao_device *aodev) { STATE_AO_GC(aodev->ao); - char *be_path = libxl__device_backend_path(gc, aodev->dev); - char *fe_path = libxl__device_frontend_path(gc, aodev->dev); - xs_transaction_t t = 0; int rc; device_hotplug_clean(gc, aodev); /* Clean xenstore if it's a disconnection */ if (aodev->action == DEVICE_DISCONNECT) { - for (;;) { - rc = libxl__xs_transaction_start(gc, &t); - if (rc) goto out; - - libxl__xs_path_cleanup(gc, t, fe_path); - libxl__xs_path_cleanup(gc, t, be_path); - - rc = libxl__xs_transaction_commit(gc, &t); - if (!rc) break; - if (rc < 0) goto out; - } + rc = libxl__device_destroy(gc, aodev->dev); + if (!aodev->rc) + aodev->rc = rc; } -out: aodev->callback(egc, aodev); return; } _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |