[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-devel] [PATCH] fix rename: xenstore not fully updated



Currently libxl__domain_rename only update /local/domain/<domid>/name,
still some places in xenstore are not updated, including:
/vm/<uuid>/name and /local/domain/0/backend/<device>/<domid>/.../domain.

Signed-off-by: Chunyan Liu <cyliu@xxxxxxxx>
---
 tools/libxl/libxl.c | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 55 insertions(+)

diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c
index f7961f6..6671b08 100644
--- a/tools/libxl/libxl.c
+++ b/tools/libxl/libxl.c
@@ -359,6 +359,9 @@ int libxl__domain_rename(libxl__gc *gc, uint32_t domid,
     uint32_t stub_dm_domid;
     const char *stub_dm_old_name = NULL, *stub_dm_new_name = NULL;
     int rc;
+    const char *vm_path, *vm_name_path;
+    char** be_dev = NULL;
+    unsigned int ndevs = 0;
 
     dom_path = libxl__xs_get_dompath(gc, domid);
     if (!dom_path) goto x_nomem;
@@ -429,6 +432,58 @@ int libxl__domain_rename(libxl__gc *gc, uint32_t domid,
         goto x_fail;
     }
 
+    /* update /vm/<uuid>/name */
+    vm_path = libxl__xs_read(gc, trans, libxl__sprintf(gc, "%s/vm", dom_path));
+    vm_name_path = libxl__sprintf(gc, "%s/name", vm_path);
+    if (libxl__xs_write_checked(gc, trans, vm_name_path, new_name)) {
+        LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "failed to write new name `%s'"
+                   " to %s", new_name, vm_name_path);
+        goto x_fail;
+    }
+
+
+    /* update backend /local/domain/0/backend/<device>/<domid>/.../domain */
+    be_dev = libxl__xs_directory(gc, trans, "/local/domain/0/backend", &ndevs);
+    if (be_dev && ndevs) {
+        for (int i = 0; i < ndevs; i++, be_dev++) {
+            /* <device>: vbd, vif, vkbd, ... */
+            char** be_dom = NULL;
+            unsigned int ndoms = 0;
+            be_dom = libxl__xs_directory(gc, trans,
+                     GCSPRINTF("/local/domain/0/backend/%s", *be_dev), &ndoms);
+            if (be_dom && ndoms) {
+                for (int j = 0; j < ndoms; j++, be_dom++) {
+                    /* <device>/<domid>: vif/1, vif/2, ...*/
+                    char ** be_devid = NULL;
+                    unsigned int ndevids = 0;
+
+                    if (strcmp(*be_dom, GCSPRINTF("%d", domid)))
+                        continue;
+
+                    be_devid = libxl__xs_directory(gc, trans,
+                                     GCSPRINTF("/local/domain/0/backend/%s/%s",
+                                     *be_dev, *be_dom),
+                                     &ndevids);
+                    if (be_devid && ndevids) {
+                        for (int k = 0; k < ndevids; k++, be_devid++) {
+                            /* <device>/<domid>/<devid>: vif/1/0, vif/1/1, ... 
*/
+                            char *tmp = 
GCSPRINTF("/local/domain/0/backend/%s/%s/%s/domain",
+                                                  *be_dev, *be_dom, *be_devid);
+                            if (!libxl__xs_read(gc, trans, tmp))
+                                continue;
+
+                            if (libxl__xs_write_checked(gc, trans, tmp, 
new_name)) {
+                                LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "failed to 
write new name `%s'"
+                                           " to %s", new_name, tmp);
+                                goto x_fail;
+                            }
+                        }
+                    }
+                }
+            }
+        }
+    }
+
     if (stub_dm_domid) {
         rc = libxl__domain_rename(gc, stub_dm_domid,
                                   stub_dm_old_name,
-- 
1.8.4.5


_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.