[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH v3 2/7] libxl: Add to libxl__domain_type a new return value (LIBXL_DOMAIN_TYPE_NOTFOUND)
So that the callers can distinguish between an error and an domain not found. The exposed API calls that are effected by this are: libxl_domain_[remus_start,suspend,unpause,cdrom_insert, set_vcpuonline] We add an helper function to deal with the two types of errors: libxl_domain_type2err. However for libxl_[pci,dom].c we just add the extra check for LIBXL_DOMAIN_TYPE_NOTFOUND for simplicity reasons. Suggested-by: Ian Campbell <ian.campbell@xxxxxxxxxx> Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@xxxxxxxxxx> --- tools/libxl/libxl.c | 53 ++++++++++++++++++++++++++------------------- tools/libxl/libxl.h | 5 +++++ tools/libxl/libxl_dom.c | 5 ++++- tools/libxl/libxl_pci.c | 6 +++++ tools/libxl/libxl_types.idl | 2 ++ 5 files changed, 48 insertions(+), 23 deletions(-) diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c index 0b57bae..4152ee4 100644 --- a/tools/libxl/libxl.c +++ b/tools/libxl/libxl.c @@ -354,6 +354,16 @@ const char *libxl_defbool_to_string(libxl_defbool b) return LIBXL__DEFBOOL_STR_DEFAULT; } +static int libxl_domain_type2error(libxl_domain_type type) +{ + switch (type) { + case LIBXL_DOMAIN_TYPE_INVALID: return ERROR_FAIL; + case LIBXL_DOMAIN_TYPE_NOTFOUND: return ERROR_DOMAIN_NOTFOUND; + default: break; + } + return 0; +} + /******************************************************************************/ @@ -512,7 +522,7 @@ int libxl_domain_rename(libxl_ctx *ctx, uint32_t domid, int libxl__domain_resume(libxl__gc *gc, uint32_t domid, int suspend_cancel) { - int rc = 0; + int rc; if (xc_domain_resume(CTX->xch, domid, suspend_cancel)) { LOGE(ERROR, "xc_domain_resume failed for domain %u", domid); @@ -521,10 +531,9 @@ int libxl__domain_resume(libxl__gc *gc, uint32_t domid, int suspend_cancel) } libxl_domain_type type = libxl__domain_type(gc, domid); - if (type == LIBXL_DOMAIN_TYPE_INVALID) { - rc = ERROR_FAIL; + rc = libxl_domain_type2error(type); + if (rc) goto out; - } if (type == LIBXL_DOMAIN_TYPE_HVM) { rc = libxl__domain_resume_device_model(gc, domid); @@ -842,10 +851,9 @@ int libxl_domain_remus_start(libxl_ctx *ctx, libxl_domain_remus_info *info, int rc; libxl_domain_type type = libxl__domain_type(gc, domid); - if (type == LIBXL_DOMAIN_TYPE_INVALID) { - rc = ERROR_FAIL; + rc = libxl_domain_type2error(type); + if (rc) goto out; - } libxl_defbool_setdefault(&info->allow_unsafe, false); libxl_defbool_setdefault(&info->blackhole, false); @@ -961,10 +969,9 @@ int libxl_domain_suspend(libxl_ctx *ctx, uint32_t domid, int fd, int flags, int rc; libxl_domain_type type = libxl__domain_type(gc, domid); - if (type == LIBXL_DOMAIN_TYPE_INVALID) { - rc = ERROR_FAIL; + rc = libxl_domain_type2error(type); + if (rc) goto out_err; - } libxl__domain_suspend_state *dss; GCNEW(dss); @@ -1024,13 +1031,12 @@ int libxl_domain_unpause(libxl_ctx *ctx, uint32_t domid) GC_INIT(ctx); char *path; char *state; - int ret, rc = 0; + int ret, rc; libxl_domain_type type = libxl__domain_type(gc, domid); - if (type == LIBXL_DOMAIN_TYPE_INVALID) { - rc = ERROR_FAIL; + rc = libxl_domain_type2error(type); + if (rc) goto out; - } if (type == LIBXL_DOMAIN_TYPE_HVM) { path = libxl__sprintf(gc, "/local/domain/0/device-model/%d/state", domid); @@ -1059,8 +1065,9 @@ int libxl__domain_pvcontrol_available(libxl__gc *gc, uint32_t domid) int ret; libxl_domain_type domtype = libxl__domain_type(gc, domid); - if (domtype == LIBXL_DOMAIN_TYPE_INVALID) - return ERROR_FAIL; + ret = libxl_domain_type2error(domtype); + if (ret) + return ret; if (domtype == LIBXL_DOMAIN_TYPE_PV) return 1; @@ -2390,10 +2397,9 @@ static void device_disk_add(libxl__egc *egc, uint32_t domid, libxl_device_disk_copy(ctx, &disk_saved, disk); libxl_domain_type type = libxl__domain_type(gc, domid); - if (type == LIBXL_DOMAIN_TYPE_INVALID) { - rc = ERROR_FAIL; + rc = libxl_domain_type2error(type); + if (rc) goto out; - } /* * get_vdev != NULL -> local attach @@ -2840,10 +2846,10 @@ int libxl_cdrom_insert(libxl_ctx *ctx, uint32_t domid, libxl_device_disk *disk, libxl__device_disk_setdefault(gc, &disk_empty); libxl_domain_type type = libxl__domain_type(gc, domid); - if (type == LIBXL_DOMAIN_TYPE_INVALID) { - rc = ERROR_FAIL; + rc = libxl_domain_type2error(type); + if (rc) goto out; - } + if (type != LIBXL_DOMAIN_TYPE_HVM) { LOG(ERROR, "cdrom-insert requires an HVM domain"); rc = ERROR_INVAL; @@ -5526,6 +5532,9 @@ int libxl_set_vcpuonline(libxl_ctx *ctx, uint32_t domid, libxl_bitmap *cpumap) case LIBXL_DOMAIN_TYPE_PV: rc = libxl__set_vcpuonline_xenstore(gc, domid, cpumap); break; + case LIBXL_DOMAIN_TYPE_NOTFOUND: + rc = ERROR_DOMAIN_NOTFOUND; + break; default: rc = ERROR_INVAL; } diff --git a/tools/libxl/libxl.h b/tools/libxl/libxl.h index 1cf5699..f03fa3b 100644 --- a/tools/libxl/libxl.h +++ b/tools/libxl/libxl.h @@ -181,6 +181,11 @@ /* * libxl_domain_info returns ERROR_DOMAIN_NOTFOUND if the domain * is not present, instead of ERROR_INVAL. + * + * libxl_set_vcpuonline, libxl_domain_remus_start, libx_domain_suspend, + * libxl_domain_unpause, and libxl_cdrom_insert can return + * LIBLX_DOMAIN_TYPE_NOTFOUND if the domain is not present, instead of + * LIBXL_DOMAIN_TYPE_INVALID. */ #define LIBXL_HAVE_ERROR_DOMAIN_NOTFOUND 1 /* diff --git a/tools/libxl/libxl_dom.c b/tools/libxl/libxl_dom.c index ace8a66..1d11729 100644 --- a/tools/libxl/libxl_dom.c +++ b/tools/libxl/libxl_dom.c @@ -32,10 +32,13 @@ libxl_domain_type libxl__domain_type(libxl__gc *gc, uint32_t domid) int ret; ret = xc_domain_getinfolist(ctx->xch, domid, 1, &info); - if (ret != 1 || info.domain != domid) { + if (ret != 1) { LOG(ERROR, "unable to get domain type for domid=%"PRIu32, domid); return LIBXL_DOMAIN_TYPE_INVALID; } + if (info.domain != domid) + return LIBXL_DOMAIN_TYPE_NOTFOUND; + if (info.flags & XEN_DOMINF_hvm_guest) return LIBXL_DOMAIN_TYPE_HVM; else diff --git a/tools/libxl/libxl_pci.c b/tools/libxl/libxl_pci.c index f3ae132..958c1a3 100644 --- a/tools/libxl/libxl_pci.c +++ b/tools/libxl/libxl_pci.c @@ -143,6 +143,9 @@ static int libxl__device_pci_add_xenstore(libxl__gc *gc, uint32_t domid, libxl_d if (domtype == LIBXL_DOMAIN_TYPE_INVALID) return ERROR_FAIL; + if (domtype == LIBXL_DOMAIN_TYPE_NOTFOUND) + return ERROR_DOMAIN_NOTFOUND; + if (!starting && domtype == LIBXL_DOMAIN_TYPE_PV) { if (libxl__wait_for_backend(gc, be_path, "4") < 0) return ERROR_FAIL; @@ -212,6 +215,9 @@ static int libxl__device_pci_remove_xenstore(libxl__gc *gc, uint32_t domid, libx if (domtype == LIBXL_DOMAIN_TYPE_INVALID) return ERROR_FAIL; + if (domtype == LIBXL_DOMAIN_TYPE_NOTFOUND) + return ERROR_DOMAIN_NOTFOUND; + if (domtype == LIBXL_DOMAIN_TYPE_PV) { if (libxl__wait_for_backend(gc, be_path, "4") < 0) { LIBXL__LOG(ctx, LIBXL__LOG_DEBUG, "pci backend at %s is not ready", be_path); diff --git a/tools/libxl/libxl_types.idl b/tools/libxl/libxl_types.idl index 117b61d..d81e0c2 100644 --- a/tools/libxl/libxl_types.idl +++ b/tools/libxl/libxl_types.idl @@ -69,6 +69,7 @@ libxl_error = Enumeration("error", [ libxl_domain_type = Enumeration("domain_type", [ (-1, "INVALID"), + (-2, "NOTFOUND"), (1, "HVM"), (2, "PV"), ], init_val = "LIBXL_DOMAIN_TYPE_INVALID") @@ -469,6 +470,7 @@ libxl_domain_build_info = Struct("domain_build_info",[ ("e820_host", libxl_defbool), ])), ("invalid", None), + ("notfound", None), ], keyvar_init_val = "LIBXL_DOMAIN_TYPE_INVALID")), ], dir=DIR_IN ) -- 2.1.0 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |