Skip to contentSkip to conversation

Call hotplug scripts from libxl for NetBSD

PATCH New Roger Pau Monne 1 participant 10 messages Oct 14, 2011

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 Call hotplug scripts from libxl for NetBSD

This patch adds support for NetBSD to call hotplug scripts directly from libxl, instead of relying on xenbackendd. Also some patches contain general bug fixes that apply to both NetBSD and Linux. Currently Linux hotplug script call functions are empty, so Linux continues to use udev rules to call hotplug scripts. This patch should be applied after Ian Campbell's "libxl: rationalise libxl_device_* APIs" series.

Please review, Roger.

#1 lore raw

PATCH 1/1 xenbackendd: pass type of block device to hotplug script

# HG changeset patch
# User Roger Pau Monne <[email protected]> # Date 1317386335 -7200
# Node ID deb93254ad05ffa13caa64f0159800f04c82666b # Parent c9c228ec718a4c2d22b58ce306f269868af0d12f
xenbackendd: pass type of block device to hotplug script

Pass the type of block device to attach to the block script instead of reading it from xenstore, since new Xen versions don't make a difference between a block device or an image.

tools/hotplug/NetBSD/block +1 -1
diff -r c9c228ec718a -r deb93254ad05 tools/hotplug/NetBSD/block
@@ -19,7 +19,7 @@ error() {
 
 xpath=$1
 xstatus=$2
-xtype=$(xenstore-read "$xpath/type")
+xtype=$3
 xparams=$(xenstore-read "$xpath/params")
 
 case $xstatus in
tools/xenbackendd/xenbackendd.c +35 -5
diff -r c9c228ec718a -r deb93254ad05 tools/xenbackendd/xenbackendd.c
@@ -89,15 +89,15 @@ dodebug(const char *fmt, ...)
 }
 
 static void
-doexec(const char *cmd, const char *arg1, const char *arg2)
+doexec(const char *cmd, const char *arg1, const char *arg2, const char *arg3)
 {
-	dodebug("exec %s %s %s", cmd, arg1, arg2);
+	dodebug("exec %s %s %s %s", cmd, arg1, arg2, arg3);
 	switch(vfork()) {
 	case -1:
 		dolog(LOG_ERR, "can't vfork: %s", strerror(errno));
 		break;
 	case 0:
-		execl(cmd, cmd, arg1, arg2, NULL);
+		execl(cmd, cmd, arg1, arg2, arg3, NULL);
 		dolog(LOG_ERR, "can't exec %s: %s", cmd, strerror(errno));
 		exit(EXIT_FAILURE);
 		/* NOTREACHED */
@@ -145,11 +145,14 @@ xen_setup(void)
 int
 main(int argc, char * const argv[])
 {
+	struct stat stab;
 	char **vec;
 	unsigned int num;
 	char *s;
 	int state;
 	char *sstate;
+	char *stype;
+	char *params;
 	char *p;
 	char buf[80];
 	int type;
@@ -297,11 +300,38 @@ main(int argc, char * const argv[])
 				    strerror(errno));
 				goto next2;
 			}
-			doexec(s, vec[XS_WATCH_PATH], sstate);
+			doexec(s, vec[XS_WATCH_PATH], sstate, NULL);
 			break;
 
 		case DEVTYPE_VBD:
-			doexec(vbd_script, vec[XS_WATCH_PATH], sstate);
+			/* check if given file is a block device or a raw image */
+			snprintf(buf, sizeof(buf), "%s/params", vec[XS_WATCH_PATH]);
+			params = xs_read(xs, XBT_NULL, buf, 0);
+			if(params == NULL) {
+				dolog(LOG_ERR,
+					"Failed to read %s (%s)", buf, strerror(errno));
+				goto next2;
+			}
+			if (stat(params, &stab) < 0) {
+				dolog(LOG_ERR,
+					"Failed to get info about %s (%s)", params,
+					strerror(errno));
+				goto next3;
+			}
+			stype = NULL;
+			if (S_ISBLK(stab.st_mode))
+				stype = "phy";
+			if (S_ISREG(stab.st_mode))
+				stype = "file";
+			if (stype == NULL) {
+				dolog(LOG_ERR,
+					"Failed to attach %s (not a block device or raw image)",
+					params, strerror(errno));
+				goto next3;
+			}
+			doexec(vbd_script, vec[XS_WATCH_PATH], sstate, stype);
+next3:
+			free(params);
 			break;
 
 		default:
#2 lore raw

PATCH 1/1 libxl: fix for libxl not waiting for devices to disconnect

In reply to Roger Pau Monne

# HG changeset patch
# User Roger Pau Monne <[email protected]> # Date 1317386335 -7200
# Node ID 873e4a1309ce5da0305611ce2e2b460df052019b # Parent deb93254ad05ffa13caa64f0159800f04c82666b
libxl: fix for libxl not waiting for devices to disconnect

libxl was ignoring the timeout and the number of devices to wait before destroying them.

tools/libxl/libxl_device.c +4 -1
diff -r deb93254ad05 -r 873e4a1309ce tools/libxl/libxl_device.c
@@ -391,6 +391,9 @@ static int wait_for_dev_destroy(libxl__g
             }
             free(l1);
         }
+    } else {
+        /* timeout reached */
+        rc = 0;
     }
     return rc;
 }
@@ -531,7 +534,7 @@ int libxl__devices_destroy(libxl__gc *gc
         tv.tv_usec = 0;
         while (n_watches > 0) {
             if (wait_for_dev_destroy(gc, &tv)) {
-                break;
+                continue;
             } else {
                 n_watches--;
             }
#3 lore raw

PATCH 1/1 libxl: add support for image files for NetBSD

In reply to Roger Pau Monne

# HG changeset patch
# User Roger Pau Monne <[email protected]> # Date 1317386335 -7200
# Node ID 0865f90beac01012dd0ff4a86b07d8fb62575163 # Parent 873e4a1309ce5da0305611ce2e2b460df052019b
libxl: add support for image files for NetBSD

Created a helper function to detect if the OS is capable of using image files as phy backends. Create two OS specific files, and changed the Makefile to choose the correct one at compile time.

tools/libxl/Makefile +2 -0
diff -r 873e4a1309ce -r 0865f90beac0 tools/libxl/Makefile
@@ -31,6 +31,8 @@ LIBXL_OBJS-y += libxl_noblktap2.o
 endif
 LIBXL_OBJS-$(CONFIG_X86) += libxl_cpuid.o
 LIBXL_OBJS-$(CONFIG_IA64) += libxl_nocpuid.o
+LIBXL_OBJS-$(CONFIG_NetBSD) += libxl_phybackend.o
+LIBXL_OBJS-$(CONFIG_Linux) += libxl_nophybackend.o
 
 LIBXL_LIBS += -lyajl
 
tools/libxl/libxl_device.c +7 -8
diff -r 873e4a1309ce -r 0865f90beac0 tools/libxl/libxl_device.c
@@ -138,15 +138,14 @@ static int disk_try_backend(disk_try_bac
               a->disk->format == LIBXL_DISK_FORMAT_EMPTY)) {
             goto bad_format;
         }
-        if (a->disk->format != LIBXL_DISK_FORMAT_EMPTY &&
-            !S_ISBLK(a->stab.st_mode)) {
-            LIBXL__LOG(ctx, LIBXL__LOG_DEBUG, "Disk vdev=%s, backend phy"
-                       " unsuitable as phys path not a block device",
-                       a->disk->vdev);
-            return 0;
-        }
 
-        return backend;
+        if (try_phy_backend(a->stab.st_mode))
+            return backend;
+
+        LIBXL__LOG(ctx, LIBXL__LOG_DEBUG, "Disk vdev=%s, backend phy"
+                   " unsuitable as phys path not a block device",
+                   a->disk->vdev);
+        return 0;
 
     case LIBXL_DISK_BACKEND_TAP:
         if (!libxl__blktap_enabled(a->gc)) {
tools/libxl/libxl_internal.h +3 -0
diff -r 873e4a1309ce -r 0865f90beac0 tools/libxl/libxl_internal.h
@@ -247,6 +247,9 @@ _hidden int libxl__device_destroy(libxl_
 _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);
 
+/* OS dependant helper function */
+_hidden int try_phy_backend(mode_t st_mode);
+
 /* from libxl_pci */
 
 _hidden int libxl__device_pci_add(libxl__gc *gc, uint32_t domid, libxl_device_pci *pcidev, int starting);
tools/libxl/libxl_nophybackend.c new file +27 -0
diff -r 873e4a1309ce -r 0865f90beac0 tools/libxl/libxl_nophybackend.c
@@ -0,0 +1,27 @@
+/*
+ * Copyright (C) 2011
+ * Author Roger Pau Monne <[email protected]>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published
+ * by the Free Software Foundation; version 2.1 only. with the special
+ * exception on linking described in file LICENSE.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Lesser General Public License for more details.
+ */
+ 
+#include <sys/stat.h>
+
+#include "libxl_internal.h"
+ 
+int try_phy_backend(mode_t st_mode)
+{
+    if (!S_ISBLK(st_mode)) {
+        return 0;
+    }
+
+    return 1;
+}
tools/libxl/libxl_phybackend.c new file +26 -0
diff -r 873e4a1309ce -r 0865f90beac0 tools/libxl/libxl_phybackend.c
@@ -0,0 +1,26 @@
+/*
+ * Copyright (C) 2011
+ * Author Roger Pau Monne <[email protected]>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published
+ * by the Free Software Foundation; version 2.1 only. with the special
+ * exception on linking described in file LICENSE.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Lesser General Public License for more details.
+ */
+ 
+#include <sys/stat.h>
+
+#include "libxl_internal.h"
+ 
+int try_phy_backend(mode_t st_mode)
+{
+    if (S_ISREG(st_mode) || S_ISBLK(st_mode))
+        return 1;
+
+    return 0;
+}
#4 lore raw

PATCH 1/1 libxl: add libxl__forkexec to execute hotplug scripts

In reply to Roger Pau Monne

# HG changeset patch
# User Roger Pau Monne <[email protected]> # Date 1318592310 -7200
# Node ID 0235e192a519e29ac3d77e91fe59b38e6a6f06ef # Parent 0865f90beac01012dd0ff4a86b07d8fb62575163
libxl: add libxl__forkexec to execute hotplug scripts

Add a new function to libxl_exec that performs a vfork and executes the passed arguments using libxl__exec.

tools/libxl/libxl_exec.c +22 -0
diff -r 0865f90beac0 -r 0235e192a519 tools/libxl/libxl_exec.c
@@ -308,3 +308,25 @@ int libxl__spawn_check(libxl__gc *gc, vo
     for_spawn->intermediate = 0;
     return ERROR_FAIL;
 }
+
+int libxl__forkexec(libxl__gc *gc, int stdinfd, int stdoutfd,
+                    int stderrfd, char **args)
+{
+    libxl_ctx *ctx = libxl__gc_owner(gc);
+
+    switch (vfork()) {
+    case -1:
+        LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, "failed to vfork\n");
+        return -1;
+    case 0:
+        libxl__exec(stdinfd, stdoutfd, stderrfd, args[0], args);
+        LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, "failed to execute %s\n",
+                         args[0]);
+        exit(EXIT_FAILURE);
+        break;
+    default:
+        wait(NULL);
+        break;
+    }
+    return 0;
+}
tools/libxl/libxl_internal.h +2 -0
diff -r 0865f90beac0 -r 0235e192a519 tools/libxl/libxl_internal.h
@@ -342,6 +342,8 @@ _hidden int libxl__spawn_check(libxl__gc
 
 _hidden void libxl__exec(int stdinfd, int stdoutfd, int stderrfd,
                const char *arg0, char **args); // logs errors, never returns
+_hidden int libxl__forkexec(libxl__gc *gc, int stdinfd, int stdoutfd,
+                            int stderrfd, char **args);
 _hidden void libxl__log_child_exitstatus(libxl__gc *gc,
                                 const char *what, pid_t pid, int status);
#5 lore raw

PATCH 1/1 libxl: wait for devices to initialize upon addition to the domain

In reply to Roger Pau Monne

# HG changeset patch
# User Roger Pau Monne <[email protected]>
# Date 1318592310 -7200
# Node ID d14479efe33c3955dcf41783a1b02c8d2bb572e6
# Parent 0235e192a519e29ac3d77e91fe59b38e6a6f06ef
libxl: wait for devices to initialize upon addition to the domain.

Block waiting for devices to initialize (switch to state 2).

tools/libxl/libxl.c +10 -1
diff -r 0235e192a519 -r d14479efe33c tools/libxl/libxl.c
@@ -1070,6 +1070,11 @@ int libxl_device_disk_add(libxl_ctx *ctx
                              libxl__xs_kvs_of_flexarray(&gc, back, back->count),
                              libxl__xs_kvs_of_flexarray(&gc, front, front->count));
 
+    if (libxl__wait_for_device_initialization(&gc, &device) < 0) {
+        rc = -1;
+        goto out_free;
+    }
+
     rc = 0;
 
 out_free:
@@ -1513,7 +1518,11 @@ int libxl_device_nic_add(libxl_ctx *ctx,
                              libxl__xs_kvs_of_flexarray(&gc, back, back->count),
                              libxl__xs_kvs_of_flexarray(&gc, front, front->count));
 
-    /* FIXME: wait for plug */
+    if (libxl__wait_for_device_initialization(&gc, &device) < 0) {
+        rc = -1;
+        goto out_free;
+    }
+
     rc = 0;
 out_free:
     flexarray_free(back);
tools/libxl/libxl_device.c +32 -0
diff -r 0235e192a519 -r d14479efe33c tools/libxl/libxl_device.c
@@ -366,6 +366,38 @@ int libxl__device_disk_dev_number(const 
     return -1;
 }
 
+int libxl__wait_for_device_initialization(libxl__gc *gc, libxl__device *device)
+{
+    libxl_ctx *ctx = libxl__gc_owner(gc);
+    char *be_path = libxl__device_backend_path(gc, device);
+    char *state_path = libxl__sprintf(gc, "%s/state", be_path);
+    char *state = libxl__xs_read(gc, XBT_NULL, state_path);
+    int rc = -1;
+    char **l1 = NULL;
+    unsigned int n;
+    
+    if (atoi(state) == 2) {
+        rc = 0;
+        goto out;
+    }
+
+    xs_watch(ctx->xsh, state_path, be_path);
+    while (atoi(state) != 2) {
+        l1 = xs_read_watch(ctx->xsh, &n);
+        if (l1 == NULL) {
+            goto out;
+        }
+        state = libxl__xs_read(gc, XBT_NULL, l1[XS_WATCH_PATH]);
+        if (state == NULL) {
+            goto out;
+        }
+    }
+    rc = 0;
+
+out:
+    return rc;
+}
+
 static int wait_for_dev_destroy(libxl__gc *gc, struct timeval *tv)
 {
     libxl_ctx *ctx = libxl__gc_owner(gc);
tools/libxl/libxl_internal.h +1 -1
diff -r 0235e192a519 -r d14479efe33c tools/libxl/libxl_internal.h
@@ -231,7 +231,7 @@ _hidden int libxl__device_disk_set_backe
 _hidden int libxl__device_physdisk_major_minor(const char *physpath, int *major, int *minor);
 _hidden int libxl__device_disk_dev_number(const char *virtpath,
                                           int *pdisk, int *ppartition);
-
+_hidden int libxl__wait_for_device_initialization(libxl__gc *gc, libxl__device *device);
 _hidden int libxl__device_console_add(libxl__gc *gc, uint32_t domid,
                                       libxl_device_console *console,
                                       libxl__domain_build_state *state);
#6 lore raw

PATCH 1/1 libxl: execute hotplug scripts directly from libxl

In reply to Roger Pau Monne

# HG changeset patch
# User Roger Pau Monne <[email protected]> # Date 1317386335 -7200
# Node ID 8800c37a5acba9e95ac8005ea123d3e9954be001 # Parent d14479efe33c3955dcf41783a1b02c8d2bb572e6
libxl: execute hotplug scripts directly from libxl.

Added the necessary handlers to execute hotplug scripts when necessary from libxl. Split NetBSD from Linux hotplug calls into two separate files, because parameters for hotplug scripts are different. Linux has empty functions, since the calling of hotplug scripts is still done using udev.

tools/libxl/Makefile +2 -0
diff -r d14479efe33c -r 8800c37a5acb tools/libxl/Makefile
@@ -33,6 +33,8 @@ LIBXL_OBJS-$(CONFIG_X86) += libxl_cpuid.
 LIBXL_OBJS-$(CONFIG_IA64) += libxl_nocpuid.o
 LIBXL_OBJS-$(CONFIG_NetBSD) += libxl_phybackend.o
 LIBXL_OBJS-$(CONFIG_Linux) += libxl_nophybackend.o
+LIBXL_OBJS-$(CONFIG_NetBSD) += hotplug_netbsd.o
+LIBXL_OBJS-$(CONFIG_Linux) += hotplug_linux.o
 
 LIBXL_LIBS += -lyajl
 
tools/libxl/hotplug_linux.c new file +26 -0
diff -r d14479efe33c -r 8800c37a5acb tools/libxl/hotplug_linux.c
@@ -0,0 +1,26 @@
+/*
+ * Copyright (C) 2011
+ * Author Roger Pau Monne <[email protected]>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published
+ * by the Free Software Foundation; version 2.1 only. with the special
+ * exception on linking described in file LICENSE.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Lesser General Public License for more details.
+ */
+
+#include "libxl_internal.h"
+
+int libxl_disk_hotplug(libxl__gc *gc, libxl__device *dev)
+{
+    return 0;
+}
+
+int libxl_nic_hotplug_connect(libxl__gc *gc, libxl__device *dev)
+{
+    return 0;
+}
tools/libxl/hotplug_netbsd.c new file +129 -0

129 lines not on this page · raw message

tools/libxl/libxl.c +20 -0
diff -r d14479efe33c -r 8800c37a5acb tools/libxl/libxl.c
@@ -1056,6 +1056,10 @@ int libxl_device_disk_add(libxl_ctx *ctx
     flexarray_append(back, disk->readwrite ? "w" : "r");
     flexarray_append(back, "device-type");
     flexarray_append(back, disk->is_cdrom ? "cdrom" : "disk");
+    flexarray_append(back, "script");
+    flexarray_append(back, libxl__sprintf(&gc, "%s/%s",
+                                          libxl_xen_script_dir_path(),
+                                          "block"));
 
     flexarray_append(front, "backend-id");
     flexarray_append(front, libxl__sprintf(&gc, "%d", disk->backend_domid));
@@ -1075,6 +1079,14 @@ int libxl_device_disk_add(libxl_ctx *ctx
         goto out_free;
     }
 
+    /* Call hotplug scripts to attach device */
+    if (libxl__device_execute_hotplug(&gc, &device) < 0) {
+        LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "unable to execute hotplug script for disk: %s\n",
+                   disk->pdev_path);
+        rc = -1;
+        goto out_free;
+    }
+
     rc = 0;
 
 out_free:
@@ -1523,6 +1535,14 @@ int libxl_device_nic_add(libxl_ctx *ctx,
         goto out_free;
     }
 
+    /* Call hotplug scripts to attach device */
+    if (libxl__device_execute_hotplug(&gc, &device) < 0) {
+        LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "unable to execute hotplug script for nic: %s\n",
+                   nic->ifname);
+        rc = -1;
+        goto out_free;       
+    }
+
     rc = 0;
 out_free:
     flexarray_free(back);
tools/libxl/libxl_device.c +29 -0
diff -r d14479efe33c -r 8800c37a5acb tools/libxl/libxl_device.c
@@ -68,6 +68,24 @@ int libxl__parse_backend_path(libxl__gc 
     return libxl__device_kind_from_string(strkind, &dev->backend_kind);
 }
 
+int libxl__device_execute_hotplug(libxl__gc *gc, libxl__device *dev)
+{
+    int rc = 0;
+
+    switch(dev->kind) {
+    case LIBXL__DEVICE_KIND_VIF:
+        rc = libxl__nic_hotplug(gc, dev);
+        break;
+    case LIBXL__DEVICE_KIND_VBD:
+        rc = libxl__disk_hotplug(gc, dev);
+        break;
+    default:
+        break;
+    }
+
+    return rc;
+}
+
 int libxl__device_generic_add(libxl__gc *gc, libxl__device *device,
                              char **bents, char **fents)
 {
@@ -405,6 +423,7 @@ static int wait_for_dev_destroy(libxl__g
     unsigned int n;
     fd_set rfds;
     char **l1 = NULL;
+    libxl__device dev;
 
     rc = 1;
     nfds = xs_fileno(ctx->xsh) + 1;
@@ -416,6 +435,8 @@ static int wait_for_dev_destroy(libxl__g
             char *state = libxl__xs_read(gc, XBT_NULL, l1[XS_WATCH_PATH]);
             if (!state || atoi(state) == 6) {
                 xs_unwatch(ctx->xsh, l1[0], l1[1]);
+                libxl__parse_backend_path(gc, l1[XS_WATCH_PATH], &dev);
+                libxl__device_execute_hotplug(gc, &dev);
                 xs_rm(ctx->xsh, XBT_NULL, l1[XS_WATCH_TOKEN]);
                 LIBXL__LOG(ctx, LIBXL__LOG_DEBUG, "Destroyed device backend at %s", l1[XS_WATCH_TOKEN]);
                 rc = 0;
@@ -442,6 +463,7 @@ int libxl__device_remove(libxl__gc *gc, 
     if (!state)
         goto out;
     if (atoi(state) != 4) {
+        libxl__device_execute_hotplug(gc, dev);
         libxl__device_destroy_tapdisk(gc, be_path);
         xs_rm(ctx->xsh, XBT_NULL, be_path);
         goto out;
@@ -462,6 +484,7 @@ retry_transaction:
 
     xs_watch(ctx->xsh, state_path, be_path);
     libxl__device_destroy_tapdisk(gc, be_path);
+    libxl__device_execute_hotplug(gc, dev);
 
     if (wait) {
         struct timeval tv;
@@ -482,6 +505,12 @@ int libxl__device_destroy(libxl__gc *gc,
     char *be_path = libxl__device_backend_path(gc, dev);
     char *fe_path = libxl__device_frontend_path(gc, dev);
 
+    /* 
+     * Run hotplug scripts, which will probably not be able to
+     * execute successfully since the device may still be plugged
+     */
+    libxl__device_execute_hotplug(gc, dev);
+
     xs_rm(ctx->xsh, XBT_NULL, be_path);
     xs_rm(ctx->xsh, XBT_NULL, fe_path);
 
tools/libxl/libxl_internal.h +5 -0
diff -r d14479efe33c -r 8800c37a5acb tools/libxl/libxl_internal.h
@@ -250,6 +250,11 @@ _hidden int libxl__wait_for_backend(libx
 /* OS dependant helper function */
 _hidden int try_phy_backend(mode_t st_mode);
 
+/* hotplug functions */
+_hidden int libxl__device_execute_hotplug(libxl__gc *gc, libxl__device *dev);
+_hidden int libxl__disk_hotplug(libxl__gc *gc, libxl__device *dev);
+_hidden int libxl__nic_hotplug(libxl__gc *gc, libxl__device *dev);
+
 /* from libxl_pci */
 
 _hidden int libxl__device_pci_add(libxl__gc *gc, uint32_t domid, libxl_device_pci *pcidev, int starting);
#7 lore raw

PATCH 1/1 hotplug NetBSD: detach devices when state is 5 or 6

In reply to Roger Pau Monne

# HG changeset patch
# User Roger Pau Monne <[email protected]> # Date 1317386335 -7200
# Node ID 2a7a580b84556a11e26be0f15864704ae5a7f0c0 # Parent 8800c37a5acba9e95ac8005ea123d3e9954be001 hotplug NetBSD: detach devices when state is 5 or 6

With the move of hotplug calls from xenbackendd to libxl, we can detach devices when the state is 5 or 6.

tools/hotplug/NetBSD/block +1 -1
diff -r 8800c37a5acb -r 2a7a580b8455 tools/hotplug/NetBSD/block
@@ -23,7 +23,7 @@ xtype=$3
 xparams=$(xenstore-read "$xpath/params")
 
 case $xstatus in
-6)
+5|6)
 	# device removed
 	case $xtype in
 	file)
tools/hotplug/NetBSD/vif-bridge +1 -1
diff -r 8800c37a5acb -r 2a7a580b8455 tools/hotplug/NetBSD/vif-bridge
@@ -14,7 +14,7 @@ xpath=$1
 xstatus=$2
 
 case $xstatus in
-6)
+5|6)
 	# device removed
 	xenstore-rm $xpath
 	exit 0
tools/hotplug/NetBSD/vif-ip +1 -1
diff -r 8800c37a5acb -r 2a7a580b8455 tools/hotplug/NetBSD/vif-ip
@@ -14,7 +14,7 @@ xpath=$1
 xstatus=$2
 
 case $xstatus in
-6)
+5|6)
 	# device removed
 	xenstore-rm $xpath
 	exit 0
#8 lore raw

PATCH 1/1 hotplug: remove debug messages from NetBSD hotplug scripts

In reply to Roger Pau Monne

# HG changeset patch
# User Roger Pau Monne <[email protected]> # Date 1318595892 -7200
# Node ID 07502345baca44478e3086515a071b24c5aa9a33 # Parent 2a7a580b84556a11e26be0f15864704ae5a7f0c0
hotplug: remove debug messages from NetBSD hotplug scripts

Remove unecessary debug messages from NetBSD hotplug scripts, left error messages only.

tools/hotplug/NetBSD/block +0 -4
diff -r 2a7a580b8455 -r 07502345baca tools/hotplug/NetBSD/block
@@ -64,14 +64,12 @@ 2)
 			if [ "$status" = "free" ] && \
 			    vnconfig /dev/${disk}d $xparams >/dev/null; then
 				device=/dev/${disk}d
-				echo vnconfig /dev/${disk}d $xparams
 				break	
 			fi
 		done
 		if [ x$device = x ] ; then
 			error "no available vnd device"
 		fi
-		echo xenstore-write $xpath/vnd $device
 		xenstore-write $xpath/vnd $device
 		;;
 	phy)
@@ -79,9 +77,7 @@ 2)
 		;;
 	esac
 	physical_device=$(stat -f '%r' "$device")
-	echo xenstore-write $xpath/physical-device $physical_device
 	xenstore-write $xpath/physical-device $physical_device
-	echo xenstore-write $xpath/hotplug-status connected
 	xenstore-write $xpath/hotplug-status connected
 	exit 0
 	;;
tools/hotplug/NetBSD/vif-bridge +0 -3
diff -r 2a7a580b8455 -r 07502345baca tools/hotplug/NetBSD/vif-bridge
@@ -24,12 +24,9 @@ 2)
 	xfid=$(xenstore-read "$xpath/frontend-id")
 	xhandle=$(xenstore-read "$xpath/handle")
 	iface=$(xenstore-read "$xpath/vifname")
-	echo ifconfig $iface up
 	ifconfig $iface up
 	brconfig $xbridge add $iface
-	echo brconfig $xbridge add $iface
 	xenstore-write $xpath/hotplug-status connected
-	echo xenstore-write $xpath/hotplug-status connected
 	exit 0
 	;;
 *)
tools/hotplug/NetBSD/vif-ip +0 -2
diff -r 2a7a580b8455 -r 07502345baca tools/hotplug/NetBSD/vif-ip
@@ -24,10 +24,8 @@ 2)
 	xfid=$(xenstore-read "$xpath/frontend-id")
 	xhandle=$(xenstore-read "$xpath/handle")
 	iface=$(xenstore-read "$xpath/vifname")
-	echo ifconfig $iface $xip up
 	ifconfig $iface $xip up
 	xenstore-write $xpath/hotplug-status connected
-	echo xenstore-write $xpath/hotplug-status connected
 	exit 0
 	;;
 *)
#9 lore raw

PATCH 1/1 rc.d NetBSD: don't start xenbackendd by default, only when xend needs it

In reply to Roger Pau Monne

# HG changeset patch
# User Roger Pau Monne <[email protected]>
# Date 1317386335 -7200
# Node ID 40f928cba711eed3823158bc6aa1c8f5ea54bfb1
# Parent 07502345baca44478e3086515a071b24c5aa9a33
rc.d NetBSD: don't start xenbackendd by default, only when xend needs it.

With the move of hotplug scripts from xenbackendd to libxl xenbackendd is no longer needed by libxl, only start it when xend is started.

tools/hotplug/NetBSD/rc.d/xenbackendd new file +27 -0
diff -r 07502345baca -r 40f928cba711 tools/hotplug/NetBSD/rc.d/xenbackendd
@@ -0,0 +1,27 @@
+#!/bin/sh
+#
+# PROVIDE: xenbackendd
+# REQUIRE: xencommons
+
+. /etc/rc.subr
+
+DIR=$(dirname "$0")
+. "${DIR}/xen-hotplugpath.sh"
+
+LD_LIBRARY_PATH="${LIBDIR}"
+export LD_LIBRARY_PATH PYTHONPATH
+PATH="${PATH}:${SBINDIR}"
+export PATH
+
+name="xenbackendd"
+rcvar=$name
+command="${SBINDIR}/xenbackendd"
+if [ -n "${XENBACKENDD_DEBUG}" ]; then
+	command_args="${XENBACKENDD_ARGS} -d"
+else
+	command_args="${XENBACKENDD_ARGS}"
+fi
+
+load_rc_config $name
+run_rc_command "$1"
+
tools/hotplug/NetBSD/rc.d/xencommons +4 -25
diff -r 07502345baca -r 40f928cba711 tools/hotplug/NetBSD/rc.d/xencommons
@@ -22,8 +22,6 @@ required_files="/kern/xen/privcmd"
 
 XENSTORED_PIDFILE="/var/run/xenstored.pid"
 XENCONSOLED_PIDFILE="/var/run/xenconsoled.pid"
-XENBACKENDD_PIDFILE="/var/run/xenbackendd.pid"
-#XENBACKENDD_DEBUG=1
 #XENCONSOLED_TRACE="/var/log/xen/xenconsole-trace.log"
 #XENSTORED_TRACE="/var/log/xen/xenstore-trace.log"
 
@@ -46,7 +44,7 @@ xen_startcmd()
 			XENSTORED_ROOTDIR="/var/lib/xenstored"
 		fi
 		rm -f ${XENSTORED_ROOTDIR}/tdb* >/dev/null 2>&1
-		printf "Starting xenservices: xenstored, xenconsoled, xenbackendd."
+		printf "Starting xenservices: xenstored, xenconsoled."
 		XENSTORED_ARGS=" --pid-file ${XENSTORED_PIDFILE}"
 		if [ -n "${XENSTORED_TRACE}" ]; then
 			XENSTORED_ARGS="${XENSTORED_ARGS} -T /var/log/xen/xenstored-trace.log"
@@ -58,7 +56,7 @@ xen_startcmd()
 			sleep 1
 		done
 	else
-		printf "Starting xenservices: xenconsoled, xenbackendd."
+		printf "Starting xenservices: xenconsoled."
 	fi
 
 	XENCONSOLED_ARGS=""
@@ -68,13 +66,6 @@ xen_startcmd()
 
 	${SBINDIR}/xenconsoled ${XENCONSOLED_ARGS}
 
-	XENBACKENDD_ARGS=""
-	if [ -n "${XENBACKENDD_DEBUG}" ]; then
-		XENBACKENDD_ARGS="${XENBACKENDD_ARGS} -d"
-	fi
-
-	${SBINDIR}/xenbackendd ${XENBACKENDD_ARGS}
-
 	printf "\n"
 
 	printf "Setting domain 0 name.\n"
@@ -87,8 +78,6 @@ xen_stop()
 	printf "Stopping xencommons.\n"
 	printf "WARNING: Not stopping xenstored, as it cannot be restarted.\n"
 
-	rc_pid=$(check_pidfile ${XENBACKENDD_PIDFILE} ${SBINDIR}/xenbackendd)
-	pids="$pids $rc_pid"
 	rc_pid=$(check_pidfile ${XENCONSOLED_PIDFILE} ${SBINDIR}/xenconsoled)
 	pids="$pids $rc_pid"
 
@@ -108,17 +97,12 @@ xen_status()
 		pids="$pids $xenconsoled_pid"
 	fi
 
-	xenbackend_pid=$(check_pidfile ${XENBACKENDD_PIDFILE} ${SBINDIR}/xenbackendd)
-	if test -n ${xenbackend_pid}; then
-		pids="$pids $xenbackend_pid"
-	fi
-
-	if test -n "$xenbackend_pid" -a -n "$xenconsoled_pid" -a -n "$xenstored_pid";
+	if test -n "$xenconsoled_pid" -a -n "$xenstored_pid";
 	then
 		echo "xencommons are running as pids $pids."
 		return 0
 	fi
-	if test -z "$xenbackend_pid" -a -z "$xenconsoled_pid" -a -z "$xenstored_pid";
+	if test -z "$xenconsoled_pid" -a -z "$xenstored_pid";
 	then
 		echo "xencommons are not running."
 		return 0
@@ -134,11 +118,6 @@ xen_status()
 	else
 		echo "xenconsoled is not running."
 	fi
-	if test -n $xenbackend_pid; then
-		echo "xenbackendd is running as pid $xenbackend_pid."
-	else
-		echo "xenbackendd is not running."
-	fi
 }
 
 load_rc_config $name
tools/hotplug/NetBSD/rc.d/xend +1 -1
diff -r 07502345baca -r 40f928cba711 tools/hotplug/NetBSD/rc.d/xend
@@ -1,7 +1,7 @@
 #!/bin/sh
 #
 # PROVIDE: xend
-# REQUIRE: xencommons
+# REQUIRE: xencommons xenbackendd
 
 . /etc/rc.subr