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

[Xen-devel] [PATCH 10 of 23] libxl: separate forced and non-forced device remove



# HG changeset patch
# User Ian Campbell <ian.campbell@xxxxxxxxxx>
# Date 1317389247 -3600
# Node ID dd195d45be273cf85ef0a614ac69b4498bac6d10
# Parent  cefb64e94c5e47858ebe2d76d2448da3d9caa7fb
libxl: separate forced and non-forced device remove.

The function libxl__device_destroy currently takes a force parameter however:

  * in the forced case we initiate a graceful shutdown and then immediately
    nuke the backend directory, quite likely before anyone got a chance to 
react.
  * the callers all have a "wait" variable and pass in "!wait" as the force
    argument which is confusing since not waiting is not really the same thing
    as forcing the destroy.
  * the term "destroy" is normally used in libxl for data-type destructors.

Therefore split the function into libxl__device_remove and
libxl__device_force_remove. The latter simply nukes the backend directory.

This makes some of the callers look a bit odd but that should fall out as I
continue to pull this piece of string.

Signed-off-by: Ian Campbell <ian.campbell@xxxxxxxxxx>

diff -r cefb64e94c5e -r dd195d45be27 tools/libxl/libxl_device.c
--- a/tools/libxl/libxl_device.c        Fri Sep 30 14:27:27 2011 +0100
+++ b/tools/libxl/libxl_device.c        Fri Sep 30 14:27:27 2011 +0100
@@ -365,7 +365,7 @@ int libxl__device_disk_dev_number(const 
     return -1;
 }
 
-int libxl__device_destroy(libxl__gc *gc, char *be_path, int force)
+int libxl__device_remove(libxl__gc *gc, char *be_path)
 {
     libxl_ctx *ctx = libxl__gc_owner(gc);
     xs_transaction_t t;
@@ -393,17 +393,22 @@ retry_transaction:
             goto out;
         }
     }
-    if (!force) {
-        xs_watch(ctx->xsh, state_path, be_path);
-        rc = 1;
-    } else {
-        xs_rm(ctx->xsh, XBT_NULL, be_path);
-    }
+
+    xs_watch(ctx->xsh, state_path, be_path);
     libxl__device_destroy_tapdisk(gc, be_path);
+    rc = 1;
 out:
     return rc;
 }
 
+int libxl__device_force_remove(libxl__gc *gc, char *be_path)
+{
+    libxl_ctx *ctx = libxl__gc_owner(gc);
+    xs_rm(ctx->xsh, XBT_NULL, be_path);
+    libxl__device_destroy_tapdisk(gc, be_path);
+    return 0;
+}
+
 static int wait_for_dev_destroy(libxl__gc *gc, struct timeval *tv)
 {
     libxl_ctx *ctx = libxl__gc_owner(gc);
@@ -461,7 +466,9 @@ int libxl__devices_destroy(libxl__gc *gc
             fe_path = libxl__sprintf(gc, "/local/domain/%d/device/%s/%s", 
domid, l1[i], l2[j]);
             be_path = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, 
"%s/backend", fe_path));
             if (be_path != NULL) {
-                if (libxl__device_destroy(gc, be_path, force) > 0)
+                int rc = force ? libxl__device_force_remove(gc, be_path)
+                               : libxl__device_remove(gc, be_path);
+                if (rc > 0)
                     n_watches++;
             } else {
                 xs_rm(ctx->xsh, XBT_NULL, path);
@@ -473,7 +480,9 @@ int libxl__devices_destroy(libxl__gc *gc
     fe_path = libxl__sprintf(gc, "/local/domain/%d/console", domid);
     be_path = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, "%s/backend", 
fe_path));
     if (be_path && strcmp(be_path, "")) {
-        if (libxl__device_destroy(gc, be_path, force) > 0)
+        int rc = force ? libxl__device_force_remove(gc, be_path)
+                       : libxl__device_remove(gc, be_path);
+        if (rc > 0)
             n_watches++;
     }
 
@@ -506,7 +515,10 @@ int libxl__device_del(libxl__gc *gc, lib
 
     backend_path = libxl__device_backend_path(gc, dev);
 
-    rc = libxl__device_destroy(gc, backend_path, !wait);
+    if (wait)
+        rc = libxl__device_remove(gc, backend_path);
+    else
+        rc = libxl__device_force_remove(gc, backend_path);
     if (rc == -1) {
         rc = ERROR_FAIL;
         goto out;
diff -r cefb64e94c5e -r dd195d45be27 tools/libxl/libxl_internal.h
--- a/tools/libxl/libxl_internal.h      Fri Sep 30 14:27:27 2011 +0100
+++ b/tools/libxl/libxl_internal.h      Fri Sep 30 14:27:27 2011 +0100
@@ -253,7 +253,8 @@ _hidden int libxl__device_generic_add(li
 _hidden char *libxl__device_backend_path(libxl__gc *gc, libxl__device *device);
 _hidden char *libxl__device_frontend_path(libxl__gc *gc, libxl__device 
*device);
 _hidden int libxl__device_del(libxl__gc *gc, libxl__device *dev, int wait);
-_hidden int libxl__device_destroy(libxl__gc *gc, char *be_path, int force);
+_hidden int libxl__device_remove(libxl__gc *gc, char *be_path);
+_hidden int libxl__device_force_remove(libxl__gc *gc, char *be_path);
 _hidden int libxl__devices_destroy(libxl__gc *gc, uint32_t domid, int force);
 _hidden int libxl__wait_for_backend(libxl__gc *gc, char *be_path, char *state);
 
diff -r cefb64e94c5e -r dd195d45be27 tools/libxl/libxl_pci.c
--- a/tools/libxl/libxl_pci.c   Fri Sep 30 14:27:27 2011 +0100
+++ b/tools/libxl/libxl_pci.c   Fri Sep 30 14:27:27 2011 +0100
@@ -411,8 +411,7 @@ retry_transaction2:
 
     if (num == 1) {
         char *fe_path = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, 
"%s/frontend", be_path));
-        libxl__device_destroy(gc, be_path, 1);
-        xs_rm(ctx->xsh, XBT_NULL, be_path);
+        libxl__device_force_remove(gc, be_path);
         xs_rm(ctx->xsh, XBT_NULL, fe_path);
         return 0;
     }

_______________________________________________
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®.