[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


 


Rackspace

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