[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH v3 04/15] libxl: libxl-json format and internal functions to get / set it
Introduce a new format in libxl userdata store called "libxl-json". This file format contains JSON version of libxl_domain_config, generated by libxl. Applications are not supposed to access this file directly. Two internal functions to get and set libxl_domain_configuration are also introduced. Also introduce a new error code to indicate abnormal state that libxl-json config file is empty. Signed-off-by: Wei Liu <wei.liu2@xxxxxxxxxx> Acked-by: Ian Jackson <ian.jackson@xxxxxxxxxxxxx> --- change in v3: Update registry entry description to cover what lock is used --- tools/libxl/libxl.h | 5 ++++ tools/libxl/libxl_internal.c | 56 ++++++++++++++++++++++++++++++++++++++++++ tools/libxl/libxl_internal.h | 11 +++++++++ tools/libxl/libxl_types.idl | 1 + 4 files changed, 73 insertions(+) diff --git a/tools/libxl/libxl.h b/tools/libxl/libxl.h index 1ca25ae..dab3a67 100644 --- a/tools/libxl/libxl.h +++ b/tools/libxl/libxl.h @@ -1223,6 +1223,11 @@ void libxl_cpuid_set(libxl_ctx *ctx, uint32_t domid, * "domain-userdata-lock" lock file to protect domain userdata in libxl. * It's a per-domain lock. Applications should * not touch this file. + * "libxl-json" libxl_domain_config object in JSON format, generated + * by libxl. Applications should not access this file + * directly. This file is protected by domain-userdata-lock + * for against Read-Modify-Write operation and domain + * destruction. * * libxl does not enforce the registration of userdata userids or the * semantics of the data. For specifications of the data formats diff --git a/tools/libxl/libxl_internal.c b/tools/libxl/libxl_internal.c index edf864b..8ac1c14 100644 --- a/tools/libxl/libxl_internal.c +++ b/tools/libxl/libxl_internal.c @@ -450,6 +450,62 @@ void libxl__unlock_domain_userdata(libxl__carefd *lock_carefd) libxl__carefd_close(lock_carefd); } +int libxl__get_domain_configuration(libxl__gc *gc, uint32_t domid, + libxl_domain_config *d_config) +{ + uint8_t *data = NULL; + int rc, len; + + rc = libxl__userdata_retrieve(gc, domid, "libxl-json", &data, &len); + if (rc) { + LOGEV(ERROR, rc, + "failed to retrieve domain configuration for domain %d", domid); + rc = ERROR_FAIL; + goto out; + } + + if (len == 0) { + /* No logging, not necessary an error from caller's PoV. */ + rc = ERROR_JSON_CONFIG_EMPTY; + goto out; + } + rc = libxl_domain_config_from_json(CTX, d_config, (const char *)data); + +out: + free(data); + return rc; +} + +int libxl__set_domain_configuration(libxl__gc *gc, uint32_t domid, + libxl_domain_config *d_config) +{ + char *d_config_json; + int rc; + + d_config_json = libxl_domain_config_to_json(CTX, d_config); + if (!d_config_json) { + LOGE(ERROR, + "failed to convert domain configuration to JSON for domain %d", + domid); + rc = ERROR_FAIL; + goto out; + } + + rc = libxl__userdata_store(gc, domid, "libxl-json", + (const uint8_t *)d_config_json, + strlen(d_config_json) + 1 /* include '\0' */); + if (rc) { + LOGEV(ERROR, rc, "failed to store domain configuration for domain %d", + domid); + rc = ERROR_FAIL; + goto out; + } + +out: + free(d_config_json); + return rc; +} + /* * Local variables: * mode: C diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h index bc89e79..22c564f 100644 --- a/tools/libxl/libxl_internal.h +++ b/tools/libxl/libxl_internal.h @@ -3238,6 +3238,17 @@ int libxl__cpuid_policy_is_empty(libxl_cpuid_policy_list *pl); libxl__carefd *libxl__lock_domain_userdata(libxl__gc *gc, uint32_t domid); void libxl__unlock_domain_userdata(libxl__carefd *lock_carefd); +/* + * Retrieve / store domain configuration from / to libxl private + * data store. The registry entry in libxl private data store + * is "libxl-json". + * Caller must hold user data lock. + */ +int libxl__get_domain_configuration(libxl__gc *gc, uint32_t domid, + libxl_domain_config *d_config); +int libxl__set_domain_configuration(libxl__gc *gc, uint32_t domid, + libxl_domain_config *d_config); + #endif /* diff --git a/tools/libxl/libxl_types.idl b/tools/libxl/libxl_types.idl index 95681d5..1cd635e 100644 --- a/tools/libxl/libxl_types.idl +++ b/tools/libxl/libxl_types.idl @@ -59,6 +59,7 @@ libxl_error = Enumeration("error", [ (-13, "BUFFERFULL"), (-14, "UNKNOWN_CHILD"), (-15, "LOCK_FAIL"), + (-16, "JSON_CONFIG_EMPTY"), ], value_namespace = "") libxl_domain_type = Enumeration("domain_type", [ -- 1.7.10.4 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |