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

[Xen-changelog] Tidy up use of environment variables in xenbus-hotplug interaction.



# HG changeset patch
# User emellor@xxxxxxxxxxxxxxxxxxxxxx
# Node ID 5f574f9cb4bd2b5eebd98ce6fc43ce0c33d7b1d4
# Parent  91046e4a49dd4ab33451d7fee479a450a32d8684
Tidy up use of environment variables in xenbus-hotplug interaction.

I've changed this to only write "backend" (xenbus_backend.root) into
XENBUS_BASE_PATH.  After appending XENBUS_TYPE (also exported) you can
construct the "base path" easily in the scripts.  I've completely
removed writing XENBUS_FRONTEND_ID in favour of reading it from the
store at "$XENBUS_PATH/frontend-id".

Avoid re-reading the store over and over for the frontend domain's vm-path.

The patch also fixes a memory leak in backend_bus_id where we
leak the memory referenced by frontend if the function succeeds.

This work is by Christian Limpach.

Signed-off-by: Ewan Mellor <ewan@xxxxxxxxxxxxx>

diff -r 91046e4a49dd -r 5f574f9cb4bd 
linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_probe.c
--- a/linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_probe.c    Wed Dec  7 
11:51:31 2005
+++ b/linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_probe.c    Wed Dec  7 
11:57:26 2005
@@ -59,8 +59,6 @@
 
 #define streq(a, b) (strcmp((a), (b)) == 0)
 
-static char *kasprintf(const char *fmt, ...);
-
 static struct notifier_block *xenstore_chain;
 
 /* If something in array of ids matches this device, return it. */
@@ -209,14 +207,13 @@
                return err;
        if (strlen(frontend) == 0)
                err = -ERANGE;
-
        if (!err && !xenbus_exists(NULL, frontend, ""))
                err = -ENOENT;
 
-       if (err) {
-               kfree(frontend);
+       kfree(frontend);
+
+       if (err)
                return err;
-       }
 
        if (snprintf(bus_id, BUS_ID_SIZE,
                     "%.*s-%i-%s", typelen, type, domid, devid) >= BUS_ID_SIZE)
@@ -225,69 +222,7 @@
 }
 
 static int xenbus_hotplug_backend(struct device *dev, char **envp,
-                                 int num_envp, char *buffer, int buffer_size)
-{
-       struct xenbus_device *xdev;
-       struct xenbus_driver *drv = NULL;
-       int i = 0;
-       int length = 0;
-       char *basepath_end;
-       char *frontend_id;
-
-       DPRINTK("");
-
-       if (dev == NULL)
-               return -ENODEV;
-
-       xdev = to_xenbus_device(dev);
-       if (xdev == NULL)
-               return -ENODEV;
-
-       if (dev->driver)
-               drv = to_xenbus_driver(dev->driver);
-
-       /* stuff we want to pass to /sbin/hotplug */
-       add_hotplug_env_var(envp, num_envp, &i,
-                           buffer, buffer_size, &length,
-                           "XENBUS_TYPE=%s", xdev->devicetype);
-
-       add_hotplug_env_var(envp, num_envp, &i,
-                           buffer, buffer_size, &length,
-                           "XENBUS_PATH=%s", xdev->nodename);
-
-       add_hotplug_env_var(envp, num_envp, &i,
-                           buffer, buffer_size, &length,
-                           "XENBUS_BASE_PATH=%s", xdev->nodename);
-
-       basepath_end = strrchr(envp[i - 1], '/');
-       length -= strlen(basepath_end);
-       *basepath_end = '\0';
-       basepath_end = strrchr(envp[i - 1], '/');
-       length -= strlen(basepath_end);
-       *basepath_end = '\0';
-
-       basepath_end++;
-       frontend_id = kmalloc(strlen(basepath_end) + 1, GFP_KERNEL);
-       strcpy(frontend_id, basepath_end);
-       add_hotplug_env_var(envp, num_envp, &i,
-                           buffer, buffer_size, &length,
-                           "XENBUS_FRONTEND_ID=%s", frontend_id);
-       kfree(frontend_id);
-
-       /* terminate, set to next free slot, shrink available space */
-       envp[i] = NULL;
-       envp = &envp[i];
-       num_envp -= i;
-       buffer = &buffer[length];
-       buffer_size -= length;
-
-       if (drv && drv->hotplug)
-               return drv->hotplug(xdev, envp, num_envp, buffer,
-                                   buffer_size);
-
-       return 0;
-}
-
+                                 int num_envp, char *buffer, int buffer_size);
 static int xenbus_probe_backend(const char *type, const char *domid);
 static struct xen_bus_type xenbus_backend = {
        .root = "backend",
@@ -304,6 +239,52 @@
        },
 };
 
+static int xenbus_hotplug_backend(struct device *dev, char **envp,
+                                 int num_envp, char *buffer, int buffer_size)
+{
+       struct xenbus_device *xdev;
+       struct xenbus_driver *drv;
+       int i = 0;
+       int length = 0;
+
+       DPRINTK("");
+
+       if (dev == NULL)
+               return -ENODEV;
+
+       xdev = to_xenbus_device(dev);
+       if (xdev == NULL)
+               return -ENODEV;
+
+       /* stuff we want to pass to /sbin/hotplug */
+       add_hotplug_env_var(envp, num_envp, &i,
+                           buffer, buffer_size, &length,
+                           "XENBUS_TYPE=%s", xdev->devicetype);
+
+       add_hotplug_env_var(envp, num_envp, &i,
+                           buffer, buffer_size, &length,
+                           "XENBUS_PATH=%s", xdev->nodename);
+
+       add_hotplug_env_var(envp, num_envp, &i,
+                           buffer, buffer_size, &length,
+                           "XENBUS_BASE_PATH=%s", xenbus_backend.root);
+
+       /* terminate, set to next free slot, shrink available space */
+       envp[i] = NULL;
+       envp = &envp[i];
+       num_envp -= i;
+       buffer = &buffer[length];
+       buffer_size -= length;
+
+       if (dev->driver) {
+               drv = to_xenbus_driver(dev->driver);
+               if (drv && drv->hotplug)
+                       return drv->hotplug(xdev, envp, num_envp, buffer,
+                                           buffer_size);
+       }
+
+       return 0;
+}
 
 static void otherend_changed(struct xenbus_watch *watch,
                             const char **vec, unsigned int len)
diff -r 91046e4a49dd -r 5f574f9cb4bd tools/examples/block
--- a/tools/examples/block      Wed Dec  7 11:51:31 2005
+++ b/tools/examples/block      Wed Dec  7 11:57:26 2005
@@ -89,12 +89,12 @@
     fi
   done
 
-  for dom in $(xenstore-list "$XENBUS_BASE_PATH")
+  local base_path="$XENBUS_BASE_PATH/$XENBUS_TYPE"
+  for dom in $(xenstore-list "$base_path")
   do
-    for dev in $(xenstore-list "$XENBUS_BASE_PATH/$dom")
+    for dev in $(xenstore-list "$base_path/$dom")
     do
-      d=$(xenstore_read_default \
-            "$XENBUS_BASE_PATH/$dom/$dev/physical-device" "")
+      d=$(xenstore_read_default "$base_path/$dom/$dev/physical-device" "")
 
       if [ "$d" == "$devmm" ]
       then
@@ -106,7 +106,7 @@
             return
           fi
         else
-          local m=$(xenstore_read "$XENBUS_BASE_PATH/$dom/$dev/mode")
+          local m=$(xenstore_read "$base_path/$dom/$dev/mode")
           m=$(canonicalise_mode "$m")
 
           if [ "$m" == 'w' ]
@@ -128,12 +128,10 @@
 
 same_vm()
 {
-  local thisdom="$XENBUS_FRONTEND_ID"
   local otherdom="$1"
-  local thisvm=$(xenstore-read "/local/domain/$thisdom/vm")
   local othervm=$(xenstore-read "/local/domain/$otherdom/vm")
 
-  [ "$thisvm" == "$othervm" ]
+  [ "$FRONTEND_UUID" == "$othervm" ]
 }
 
 
@@ -240,6 +238,9 @@
     case $t in 
       phy)
         dev=$(expand_dev $p)
+        FRONTEND_ID=$(xenstore_read "$XENBUS_PATH/frontend-id")
+        FRONTEND_UUID=$(xenstore_read_default \
+            "/local/domain/$FRONTEND_ID/vm" 'unknown')
         claim_lock "block"
         check_device_sharing "$dev" "$mode"
        write_dev "$dev"

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


 


Rackspace

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