libxl: report failure to reboot/shutdown due to lackof PV interfaces to caller
authorIan Campbell <ian.campbell@citrix.com>
Wed, 21 Dec 2011 10:47:30 +0000 (10:47 +0000)
committerIan Campbell <ian.campbell@citrix.com>
Wed, 21 Dec 2011 10:47:30 +0000 (10:47 +0000)
This allow the caller to react as they think is appropriate. xl now prints a
message much like the library did previously, although hopefully somewhat more
informative.

Update the xl(1) man page to be similarly more informative.

Signed-off-by: Ian Campbell <ian.campbell@citrix.com>
Committed-by: Ian Jackson <ian.jackson.citrix.com>
Acked-by: Ian Jackson <ian.jackson.citrix.com>
docs/man/xl.pod.1
tools/libxl/libxl.c
tools/libxl/libxl.h
tools/libxl/xl_cmdimpl.c

index 72196ee28b5413e0577e19f40144c021206c2af2..17789b476610394e52ae633587a888964b9f4cc3 100644 (file)
@@ -360,7 +360,11 @@ Reboot a domain.  This acts just as if the domain had the B<reboot>
 command run from the console.  The command returns as soon as it has
 executed the reboot action, which may be significantly before the
 domain actually reboots.
-It requires PV drivers installed in your guest OS.
+
+For HVM domains this requires PV drivers to be installed in your guest
+OS. If PV drivers are not present but you have configured the guest OS
+to behave appropriately you may be able to use the I<button-press>
+subcommand to trigger a power button press.
 
 The behavior of what happens to a domain when it reboots is set by the
 B<on_reboot> parameter of the domain configuration file when the
@@ -412,9 +416,15 @@ Leave domain running after creating the snapshot.
 Gracefully shuts down a domain.  This coordinates with the domain OS
 to perform graceful shutdown, so there is no guarantee that it will
 succeed, and may take a variable length of time depending on what
-services must be shutdown in the domain.  The command returns
-immediately after signally the domain unless that B<-w> flag is used.
-For HVM domains it requires PV drivers to be installed in your guest OS.
+services must be shutdown in the domain.
+
+For HVM domains this requires PV drivers to be installed in your guest
+OS. If PV drivers are not present but you have configured the guest OS
+to behave appropriately you may be able to use the I<button-press>
+subcommand to trigger a power button press.
+
+The command returns immediately after signally the domain unless that
+B<-w> flag is used.
 
 The behavior of what happens to a domain when it reboots is set by the
 B<on_shutdown> parameter of the domain configuration file when the
index 1407e98e84f4607d9dfef9077772e7e6462ecb27..2b8f8f4ab654098367c05efab5478b377f9aa9d3 100644 (file)
@@ -603,11 +603,8 @@ static int libxl__domain_pvcontrol(libxl__gc *gc, uint32_t domid,
     if (ret < 0)
         return ret;
 
-    if (!ret) {
-        LIBXL__LOG(CTX, LIBXL__LOG_ERROR,
-                   "PV control interface not available\n");
-        return ERROR_FAIL;
-    }
+    if (!ret)
+        return ERROR_NOPARAVIRT;
 
     return libxl__domain_pvcontrol_write(gc, XBT_NULL, domid, cmd);
 }
index 5344cd07a1e55883da6b21d1f1a3c48215b22765..723eac2ca107d65ed71a7b06053123b6691aff43 100644 (file)
@@ -222,6 +222,7 @@ enum {
     ERROR_BADFAIL = -7,
     ERROR_GUEST_TIMEDOUT = -8,
     ERROR_TIMEDOUT = -9,
+    ERROR_NOPARAVIRT = -10,
 };
 
 #define LIBXL_VERSION 0
index f81b6bb4ac48be56573fa4d0c7a6d50bd9780558..8270f342450bd4291c8606500edc07ea9c8c3e87 100644 (file)
@@ -2266,7 +2266,15 @@ static void shutdown_domain(const char *p, int wait)
 
     find_domain(p);
     rc=libxl_domain_shutdown(ctx, domid);
-    if (rc) { fprintf(stderr,"shutdown failed (rc=%d)\n",rc);exit(-1); }
+    if (rc) {
+        if (rc == ERROR_NOPARAVIRT) {
+            fprintf(stderr, "PV control interface not available:"
+                    " external graceful shutdown not possible.\n");
+            fprintf(stderr, "Use \"xl button-press <dom> power\" or"
+                    " \"xl destroy <dom>\".\n");
+        }
+        fprintf(stderr,"shutdown failed (rc=%d)\n",rc);exit(-1);
+    }
 
     if (wait) {
         libxl_waiter waiter;
@@ -2308,7 +2316,14 @@ static void reboot_domain(const char *p)
     int rc;
     find_domain(p);
     rc=libxl_domain_reboot(ctx, domid);
-    if (rc) { fprintf(stderr,"reboot failed (rc=%d)\n",rc);exit(-1); }
+    if (rc) {
+        if (rc == ERROR_NOPARAVIRT) {
+            fprintf(stderr, "PV control interface not available:"
+                    " external graceful reboot not possible.\n");
+            fprintf(stderr, "Use \"xl button-press <dom> power\" or"
+                    " \"xl destroy <dom>\".\n");
+        }
+        fprintf(stderr,"reboot failed (rc=%d)\n",rc);exit(-1); }
 }
 
 static void list_domains_details(const libxl_dominfo *info, int nb_domain)