[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH V2 04/11] libxl, Introduce dm-version xenstore key.
On Thu, 2011-10-20 at 18:59 +0100, Anthony PERARD wrote: > The all key is /libxl/$domid/dm-version. > > The /libxl/$domid dir is created with the domain and should be only accessible > by the toolstack domain. > > This come with libxl__device_model_version_running helper function. > > Signed-off-by: Anthony PERARD <anthony.perard@xxxxxxxxxx> > --- > tools/libxl/libxl.c | 2 ++ > tools/libxl/libxl_create.c | 28 ++++++++++++++++++++++++++++ > tools/libxl/libxl_internal.c | 19 +++++++++++++++++++ > tools/libxl/libxl_internal.h | 5 +++++ > 4 files changed, 54 insertions(+), 0 deletions(-) > > diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c > index 064fbc4..50b97c2 100644 > --- a/tools/libxl/libxl.c > +++ b/tools/libxl/libxl.c > @@ -777,6 +777,8 @@ int libxl_domain_destroy(libxl_ctx *ctx, uint32_t domid, > int force) > if (!xs_rm(ctx->xsh, XBT_NULL, dom_path)) > LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, "xs_rm failed for %s", > dom_path); > > + xs_rm(ctx->xsh, XBT_NULL, libxl__sprintf(&gc, "/libxl/%d", domid)); > + > libxl__userdata_destroyall(&gc, domid); > > rc = xc_domain_destroy(ctx->xch, domid); > diff --git a/tools/libxl/libxl_create.c b/tools/libxl/libxl_create.c > index 68d0fc3..bed991c 100644 > --- a/tools/libxl/libxl_create.c > +++ b/tools/libxl/libxl_create.c > @@ -322,6 +322,9 @@ int libxl__domain_make(libxl__gc *gc, > libxl_domain_create_info *info, > xs_transaction_t t = 0; > xen_domain_handle_t handle; > > + struct xs_permissions libxlperm[1]; > + char *libxl_path = NULL; > + The variable declaration block has little sections of perms and *_path -- you might as well include those there. libxlperm might be better called noperm (assuming that really is it's meaning, xs's permission scheme confuses the hell out of me). > assert(!libxl_domid_valid_guest(*domid)); > > uuid_string = libxl__uuid2string(gc, info->uuid); > @@ -368,6 +371,15 @@ int libxl__domain_make(libxl__gc *gc, > libxl_domain_create_info *info, > goto out; > } > > + libxl_path = libxl__sprintf(gc, "/libxl/%i", *domid); This is probably worthy of a little helper, similar to libxl__xs_get_dom_path(). (/vm/blah ought to have one too but doesn't). > + if (!libxl_path) { > + LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "cannot allocate create paths"); > + rc = ERROR_FAIL; > + goto out; > + } > + libxlperm[0].id = 0; > + libxlperm[0].perms = XS_PERM_NONE; > + > roperm[0].id = 0; > roperm[0].perms = XS_PERM_NONE; > roperm[1].id = *domid; > @@ -386,6 +398,10 @@ retry_transaction: > xs_mkdir(ctx->xsh, t, vm_path); > xs_set_permissions(ctx->xsh, t, vm_path, roperm, ARRAY_SIZE(roperm)); > > + xs_rm(ctx->xsh, t, libxl_path); > + xs_mkdir(ctx->xsh, t, libxl_path); > + xs_set_permissions(ctx->xsh, t, libxl_path, libxlperm, > ARRAY_SIZE(libxlperm)); > + > xs_write(ctx->xsh, t, libxl__sprintf(gc, "%s/vm", dom_path), vm_path, > strlen(vm_path)); > rc = libxl__domain_rename(gc, *domid, 0, info->name, t); > if (rc) > @@ -429,6 +445,16 @@ retry_transaction: > return rc; > } > > +static int store_libxl_entry(libxl__gc *gc, uint32_t domid, > + libxl_device_model_info *dm_info) > +{ > + char *path = NULL; > + > + path = libxl__sprintf(gc, "/libxl/%i/dm-version", domid); > + return libxl__xs_write(gc, XBT_NULL, path, libxl__strdup(gc, > + > libxl_device_model_version_to_string(dm_info->device_model_version))); > +} > + > static int do_domain_create(libxl__gc *gc, libxl_domain_config *d_config, > libxl_console_ready cb, void *priv, > uint32_t *domid_out, int restore_fd) > @@ -485,6 +511,8 @@ static int do_domain_create(libxl__gc *gc, > libxl_domain_config *d_config, > goto error_out; > } > > + store_libxl_entry(gc, domid, dm_info); > + > for (i = 0; i < d_config->num_disks; i++) { > ret = libxl_device_disk_add(ctx, domid, &d_config->disks[i]); > if (ret) { > diff --git a/tools/libxl/libxl_internal.c b/tools/libxl/libxl_internal.c > index 3993d8e..5d0a2d4 100644 > --- a/tools/libxl/libxl_internal.c > +++ b/tools/libxl/libxl_internal.c > @@ -319,6 +319,25 @@ int libxl__fd_set_cloexec(int fd) > return fcntl(fd, F_SETFD, flags | FD_CLOEXEC); > } > > +libxl_device_model_version libxl__device_model_version_running(libxl__gc *gc, > + uint32_t > domid) > +{ > + char *path = NULL; > + char *dm_version = NULL; > + libxl_device_model_version value; > + > + path = libxl__sprintf(gc, "/libxl/%d/dm-version", domid); > + dm_version = libxl__xs_read(gc, XBT_NULL, path); > + if (!dm_version) { > + return LIBXL_DEVICE_MODEL_VERSION_QEMU_XEN_TRADITIONAL; > + } > + > + if (libxl_device_model_version_from_string(dm_version, &value) < 0) { I think this should be a fatal error, if you've managed to read something from this key and it isn't one of the expect values then something bad has happened. > + return LIBXL_DEVICE_MODEL_VERSION_QEMU_XEN_TRADITIONAL; > + } > + return value; > +} > + > /* > * Local variables: > * mode: C > diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h > index 2e26ac6..5720b31 100644 > --- a/tools/libxl/libxl_internal.h > +++ b/tools/libxl/libxl_internal.h > @@ -554,6 +554,11 @@ _hidden void libxl__json_object_free(libxl__gc *gc, > libxl__json_object *obj); > > _hidden libxl__json_object *libxl__json_parse(libxl__gc *gc, const char *s); > > + /* Based on /local/domain/$domid/dm-version xenstore key > + * default is qemu xen traditional */ > +_hidden libxl_device_model_version > +libxl__device_model_version_running(libxl__gc *gc, uint32_t domid); > + > #endif > > /* _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |