[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-devel] [PATCH] libxl: make is_hvm log on errors, and make callers check its error returns



Signed-off-by: Ian Jackson <Ian.Jackson@xxxxxxxxxxxxx>
---
 tools/libxl/libxl.c     |   31 +++++++++++++++++++++----------
 tools/libxl/libxl_dom.c |   14 ++++++++++----
 tools/libxl/libxl_pci.c |   14 ++++++++------
 3 files changed, 39 insertions(+), 20 deletions(-)

diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c
index 6eb17e8..c31e6bf 100644
--- a/tools/libxl/libxl.c
+++ b/tools/libxl/libxl.c
@@ -427,9 +427,10 @@ out:
 int libxl_domain_resume(libxl_ctx *ctx, uint32_t domid)
 {
     libxl_gc gc = LIBXL_INIT_GC(ctx);
-    int rc = 0;
+    int hvm, rc = 0;
 
-    if (is_hvm(ctx, domid)) {
+    hvm = is_hvm(ctx, domid);  if (hvm<0) { rc = hvm; goto out; }
+    if (hvm) {
         XL_LOG(ctx, XL_LOG_DEBUG, "Called domain_resume on "
                 "non-cooperative hvm domain %u", domid);
         rc = ERROR_NI;
@@ -645,11 +646,13 @@ libxl_vminfo * libxl_list_vm(libxl_ctx *ctx, int *nb_vm)
 int libxl_domain_suspend(libxl_ctx *ctx, libxl_domain_suspend_info *info,
                          uint32_t domid, int fd)
 {
-    int hvm = is_hvm(ctx, domid);
+    int hvm;
     int live = info != NULL && info->flags & XL_SUSPEND_LIVE;
     int debug = info != NULL && info->flags & XL_SUSPEND_DEBUG;
     int rc = 0;
 
+    hvm = is_hvm(ctx, domid);  if (hvm<0) return hvm;
+
     core_suspend(ctx, domid, fd, hvm, live, debug);
     if (hvm)
         rc = save_device_model(ctx, domid, fd);
@@ -685,9 +688,10 @@ int libxl_domain_unpause(libxl_ctx *ctx, uint32_t domid)
     libxl_gc gc = LIBXL_INIT_GC(ctx);
     char *path;
     char *state;
-    int ret, rc = 0;
+    int hvm, ret, rc = 0;
 
-    if (is_hvm(ctx, domid)) {
+    hvm = is_hvm(ctx, domid);  if (hvm<0) return hvm;
+    if (hvm) {
         path = libxl_sprintf(&gc, "/local/domain/0/device-model/%d/state", 
domid);
         state = libxl_xs_read(&gc, XBT_NULL, path);
         if (state != NULL && !strcmp(state, "paused")) {
@@ -717,6 +721,7 @@ int libxl_domain_shutdown(libxl_ctx *ctx, uint32_t domid, 
int req)
     libxl_gc gc = LIBXL_INIT_GC(ctx);
     char *shutdown_path;
     char *dom_path;
+    int hvm, rc = 0;
 
     if (req > ARRAY_SIZE(req_table)) {
         libxl_free_all(&gc);
@@ -732,7 +737,8 @@ int libxl_domain_shutdown(libxl_ctx *ctx, uint32_t domid, 
int req)
     shutdown_path = libxl_sprintf(&gc, "%s/control/shutdown", dom_path);
 
     xs_write(ctx->xsh, XBT_NULL, shutdown_path, req_table[req], 
strlen(req_table[req]));
-    if (is_hvm(ctx,domid)) {
+    hvm = is_hvm(ctx,domid);  if (hvm<0) { rc = hvm; goto out; }
+    if (hvm) {
         unsigned long acpi_s_state = 0;
         unsigned long pvdriver = 0;
         int ret;
@@ -754,8 +760,9 @@ int libxl_domain_shutdown(libxl_ctx *ctx, uint32_t domid, 
int req)
             }
        }
     }
+ out:
     libxl_free_all(&gc);
-    return 0;
+    return rc;
 }
 
 int libxl_get_wait_fd(libxl_ctx *ctx, int *fd)
@@ -920,9 +927,10 @@ int libxl_domain_destroy(libxl_ctx *ctx, uint32_t domid, 
int force)
     libxl_gc gc = LIBXL_INIT_GC(ctx);
     char *dom_path;
     char *vm_path;
-    int rc, dm_present;
+    int rc, hvm, dm_present;
 
-    if (is_hvm(ctx, domid)) {
+    hvm = is_hvm(ctx, domid);  if (hvm<0) { rc = hvm; goto out; }
+    if (hvm) {
         dm_present = 1;
     } else {
         char *pid;
@@ -1004,11 +1012,14 @@ out:
 
 int libxl_primary_console_exec(libxl_ctx *ctx, uint32_t domid_vm)
 {
+    int hvm;
     uint32_t stubdomid = libxl_get_stubdom_id(ctx, domid_vm);
+
     if (stubdomid)
         return libxl_console_exec(ctx, stubdomid, 1, LIBXL_CONSTYPE_PV);
     else {
-        if (is_hvm(ctx, domid_vm))
+        hvm = is_hvm(ctx, domid);  if (hvm<0) return hvm;
+        if (hvm)
             return libxl_console_exec(ctx, domid_vm, 0, LIBXL_CONSTYPE_SERIAL);
         else
             return libxl_console_exec(ctx, domid_vm, 0, LIBXL_CONSTYPE_PV);
diff --git a/tools/libxl/libxl_dom.c b/tools/libxl/libxl_dom.c
index 1691858..a56e890 100644
--- a/tools/libxl/libxl_dom.c
+++ b/tools/libxl/libxl_dom.c
@@ -37,10 +37,16 @@ int is_hvm(libxl_ctx *ctx, uint32_t domid)
     int ret;
 
     ret = xc_domain_getinfolist(ctx->xch, domid, 1, &info);
-    if (ret != 1)
-        return -1;
-    if (info.domain != domid)
-        return -1;
+    if (ret != 1) {
+        XL_LOG_ERRNO(ctx,XL_LOG_ERROR, "is_hvm: xc_domain_getinfolist failed");
+        return ERROR_FAIL;
+    }
+    if (info.domain != domid) {
+        XL_LOG(ctx, XL_LOG_ERROR, "is_hvm: xc_domain_getinfolist gave info "
+               "for %"PRIu32"d when we asked for %"PRIu32"d",
+               info.domain, domid);
+        return ERROR_FAIL;
+    }
     return !!(info.flags & XEN_DOMINF_hvm_guest);
 }
 
diff --git a/tools/libxl/libxl_pci.c b/tools/libxl/libxl_pci.c
index f32db3b..8bcabb0 100644
--- a/tools/libxl/libxl_pci.c
+++ b/tools/libxl/libxl_pci.c
@@ -266,7 +266,7 @@ static int libxl_device_pci_add_xenstore(libxl_gc *gc, 
uint32_t domid, libxl_dev
     libxl_ctx *ctx = libxl_gc_owner(gc);
     flexarray_t *back;
     char *num_devs, *be_path;
-    int num = 0;
+    int hvm, num = 0;
     unsigned int boffset = 0;
     xs_transaction_t t;
 
@@ -275,7 +275,8 @@ static int libxl_device_pci_add_xenstore(libxl_gc *gc, 
uint32_t domid, libxl_dev
     if (!num_devs)
         return libxl_create_pci_backend(gc, domid, pcidev, 1);
 
-    if (!is_hvm(ctx, domid)) {
+    hvm = is_hvm(ctx, domid);  if (hvm<0) return hvm;
+    if (!hvm) {
         if (libxl_wait_for_backend(ctx, be_path, "4") < 0)
             return ERROR_FAIL;
     }
@@ -330,7 +331,8 @@ static int libxl_device_pci_remove_xenstore(libxl_gc *gc, 
uint32_t domid, libxl_
         return ERROR_INVAL;
     num = atoi(num_devs);
 
-    if (!is_hvm(ctx, domid)) {
+    hvm = is_hvm(ctx, domid);  if (hvm<0) return hvm;
+    if (!hvm) {
         if (libxl_wait_for_backend(ctx, be_path, "4") < 0) {
             XL_LOG(ctx, XL_LOG_DEBUG, "pci backend at %s is not ready", 
be_path);
             return ERROR_FAIL;
@@ -358,7 +360,7 @@ retry_transaction:
         if (errno == EAGAIN)
             goto retry_transaction;
 
-    if (!is_hvm(ctx, domid)) {
+    if (!hvm) {
         if (libxl_wait_for_backend(ctx, be_path, "4") < 0) {
             XL_LOG(ctx, XL_LOG_DEBUG, "pci backend at %s is not ready", 
be_path);
             return ERROR_FAIL;
@@ -610,7 +612,7 @@ static int do_pci_add(libxl_gc *gc, uint32_t domid, 
libxl_device_pci *pcidev)
     char *state, *vdevfn;
     int rc, hvm;
 
-    hvm = is_hvm(ctx, domid);
+    hvm = is_hvm(ctx, domid);  if (hvm<0) return hvm;
     if (hvm) {
         if (libxl_wait_for_device_model(ctx, domid, "running", NULL, NULL) < 
0) {
             return ERROR_FAIL;
@@ -834,7 +836,7 @@ static int do_pci_remove(libxl_gc *gc, uint32_t domid, 
libxl_device_pci *pcidev)
 
     libxl_device_pci_remove_xenstore(gc, domid, pcidev);
 
-    hvm = is_hvm(ctx, domid);
+    hvm = is_hvm(ctx, domid);  if (hvm<0) return hvm;
     if (hvm) {
         if (libxl_wait_for_device_model(ctx, domid, "running", NULL, NULL) < 
0) {
             return ERROR_FAIL;
-- 
1.5.6.5


_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel


 


Rackspace

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