Re: [Xen-devel] [PATCH v4 1/4] libxl: add function to remove usb controller xenstore entries

2016-09-20 Thread Wei Liu
On Tue, Sep 20, 2016 at 04:18:07PM +0200, Juergen Gross wrote:
> In case of failure when trying to add a new USB controller to a domain
> libxl might leak xenstore entries. Add a function to remove them and
> call this function in case of failure.
> 
> Signed-off-by: Juergen Gross 

Acked-by: Wei Liu 

___
Xen-devel mailing list
Xen-devel@lists.xen.org
https://lists.xen.org/xen-devel


[Xen-devel] [PATCH v4 1/4] libxl: add function to remove usb controller xenstore entries

2016-09-20 Thread Juergen Gross
In case of failure when trying to add a new USB controller to a domain
libxl might leak xenstore entries. Add a function to remove them and
call this function in case of failure.

Signed-off-by: Juergen Gross 
---
This patch might be a backport candidate to 4.7 (will have to modify
tools/libxl/libxl_pvusb.c instead).
---
 tools/libxl/libxl_usb.c | 58 +
 1 file changed, 44 insertions(+), 14 deletions(-)

diff --git a/tools/libxl/libxl_usb.c b/tools/libxl/libxl_usb.c
index 6b30e0f..2493464 100644
--- a/tools/libxl/libxl_usb.c
+++ b/tools/libxl/libxl_usb.c
@@ -194,6 +194,47 @@ out:
 return rc;
 }
 
+static const char *vusb_be_from_xs_libxl(libxl__gc *gc, const char *libxl_path)
+{
+const char *be_path;
+int r;
+
+r = libxl__xs_read_checked(gc, XBT_NULL,
+   GCSPRINTF("%s/backend", libxl_path),
+   _path);
+if (r || !be_path) return NULL;
+
+return be_path;
+}
+
+static void libxl__device_usbctrl_del_xenstore(libxl__gc *gc, uint32_t domid,
+   libxl_device_usbctrl *usbctrl)
+{
+const char *libxl_path, *be_path;
+xs_transaction_t t = XBT_NULL;
+int rc;
+
+libxl_path = GCSPRINTF("%s/device/vusb/%d",
+   libxl__xs_libxl_path(gc, domid), usbctrl->devid);
+be_path = vusb_be_from_xs_libxl(gc, libxl_path);
+
+for (;;) {
+rc = libxl__xs_transaction_start(gc, );
+if (rc) goto out;
+
+libxl__xs_path_cleanup(gc, t, be_path);
+
+rc = libxl__xs_transaction_commit(gc, );
+if (!rc) break;
+if (rc < 0) goto out;
+}
+
+return;
+
+out:
+libxl__xs_transaction_abort(gc, );
+}
+
 static char *pvusb_get_device_type(libxl_usbctrl_type type)
 {
 switch (type) {
@@ -250,13 +291,15 @@ static void libxl__device_usbctrl_add(libxl__egc *egc, 
uint32_t domid,
 
 GCNEW(device);
 rc = libxl__device_from_usbctrl(gc, domid, usbctrl, device);
-if (rc) goto out;
+if (rc) goto outrm;
 
 aodev->dev = device;
 aodev->action = LIBXL__DEVICE_ACTION_ADD;
 libxl__wait_device_connection(egc, aodev);
 return;
 
+outrm:
+libxl__device_usbctrl_del_xenstore(gc, domid, usbctrl);
 out:
 aodev->rc = rc;
 aodev->callback(egc, aodev);
@@ -340,19 +383,6 @@ out:
 return;
 }
 
-static const char *vusb_be_from_xs_libxl(libxl__gc *gc, const char *libxl_path)
-{
-const char *be_path;
-int r;
-
-r = libxl__xs_read_checked(gc, XBT_NULL,
-   GCSPRINTF("%s/backend", libxl_path),
-   _path);
-if (r || !be_path) return NULL;
-
-return be_path;
-}
-
 libxl_device_usbctrl *
 libxl_device_usbctrl_list(libxl_ctx *ctx, uint32_t domid, int *num)
 {
-- 
2.6.6


___
Xen-devel mailing list
Xen-devel@lists.xen.org
https://lists.xen.org/xen-devel