|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH] fix rename: xenstore not fully updated
Is this a regression? Can it wait until 4.6?
On Mon, Nov 17, 2014 at 05:19:47PM +0800, Chunyan Liu wrote:
> 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.
>
I noticed this problem a few days ago and thanks for looking into this.
I have some comments, though.
> 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);
The hard-coded 0 cannot work if you have driver domain.
At the very least it should be using LIBXL_TOOLSTACK_DOMID.
> + 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);
Same here.
And I would like to request this hunk to be in a separate function if
possible. I got lost when counting the closing "}". ;-)
Wei.
> + 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
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |