From: Roger Pau Monne <roger.pau@entel.upc.edu>
To: xen-devel@lists.xensource.com
Subject: [PATCH 6 of 9] libxl: execute hotplug scripts directly from libxl
Date: Fri, 14 Oct 2011 15:35:38 +0200 [thread overview]
Message-ID: <8800c37a5acba9e95ac8.1318599338@loki> (raw)
In-Reply-To: <patchbomb.1318599332@loki>
# HG changeset patch
# User Roger Pau Monne <roger.pau@entel.upc.edu>
# 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.
Signed-off-by: Roger Pau Monne <roger.pau@entel.upc.edu>
diff -r d14479efe33c -r 8800c37a5acb tools/libxl/Makefile
--- a/tools/libxl/Makefile Fri Oct 14 13:38:30 2011 +0200
+++ b/tools/libxl/Makefile Fri Sep 30 14:38:55 2011 +0200
@@ -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
diff -r d14479efe33c -r 8800c37a5acb tools/libxl/hotplug_linux.c
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/tools/libxl/hotplug_linux.c Fri Sep 30 14:38:55 2011 +0200
@@ -0,0 +1,26 @@
+/*
+ * Copyright (C) 2011
+ * Author Roger Pau Monne <roger.pau@entel.upc.edu>
+ *
+ * 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;
+}
diff -r d14479efe33c -r 8800c37a5acb tools/libxl/hotplug_netbsd.c
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/tools/libxl/hotplug_netbsd.c Fri Sep 30 14:38:55 2011 +0200
@@ -0,0 +1,129 @@
+/*
+ * Copyright (C) 2011
+ * Author Roger Pau Monne <roger.pau@entel.upc.edu>
+ *
+ * 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 libxl__disk_hotplug(libxl__gc *gc, libxl__device *dev)
+{
+ libxl_ctx *ctx = libxl__gc_owner(gc);
+ char *be_path = libxl__device_backend_path(gc, dev);
+ struct stat stab;
+ char *stype, *sstate, *script, *params;
+ char **args;
+ int nr = 0;
+ flexarray_t *f_args;
+
+ script = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, "%s/%s", be_path, "script"));
+ if (!script) {
+ LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "Unable to read script from %s",
+ be_path);
+ return -1;
+ }
+
+ params = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, "%s/%s", be_path, "params"));
+ if (!params)
+ return -1;
+
+ sstate = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, "%s/%s", be_path, "state"));
+ if (!sstate) {
+ LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "Unable to read state from %s",
+ be_path);
+ return -1;
+ }
+
+ if (stat(params, &stab) < 0) {
+ LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, "failed to get stat info\n");
+ return -1;
+ }
+ if (S_ISBLK(stab.st_mode))
+ stype = "phy";
+ if (S_ISREG(stab.st_mode))
+ stype = "file";
+ if (stype == NULL) {
+ LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "Not block or regular file");
+ return -1;
+ }
+
+ f_args = flexarray_make(5, 1);
+ if (!f_args)
+ return -1;
+
+ flexarray_set(f_args, nr++, script);
+ flexarray_set(f_args, nr++, be_path);
+ flexarray_set(f_args, nr++, sstate);
+ flexarray_set(f_args, nr++, stype);
+ flexarray_set(f_args, nr++, NULL);
+
+ args = (char **) flexarray_contents(f_args);
+
+ LIBXL__LOG(ctx, LIBXL__LOG_DEBUG, "Calling disk hotplug script: %s %s %s %s",
+ args[0], args[1], args[2], args[3]);
+ if (libxl__forkexec(gc, -1, -1, -1, args) < 0) {
+ free(args);
+ return -1;
+ }
+
+ free(args);
+ return 0;
+}
+
+int libxl__nic_hotplug(libxl__gc *gc, libxl__device *dev)
+{
+ libxl_ctx *ctx = libxl__gc_owner(gc);
+ char *be_path = libxl__device_backend_path(gc, dev);
+ char *sstate, *script;
+ char **args;
+ int nr = 0;
+ int rc = -1;
+ flexarray_t *f_args;
+
+ script = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, "%s/%s", be_path, "script"));
+ if (!script) {
+ LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "Unable to read script from %s",
+ be_path);
+ return -1;
+ }
+
+ sstate = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, "%s/%s", be_path, "state"));
+ if (!sstate) {
+ LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "Unable to read state from %s",
+ be_path);
+ return -1;
+ }
+
+ f_args = flexarray_make(4, 1);
+ if (!f_args)
+ return -1;
+
+ flexarray_set(f_args, nr++, script);
+ flexarray_set(f_args, nr++, be_path);
+ flexarray_set(f_args, nr++, sstate);
+ flexarray_set(f_args, nr++, NULL);
+
+ args = (char **) flexarray_contents(f_args);
+
+ LIBXL__LOG(ctx, LIBXL__LOG_DEBUG, "Calling nic hotplug script: %s %s %s",
+ args[0], args[1], args[2]);
+ if (libxl__forkexec(gc, -1, -1, -1, args) < 0) {
+ goto out;
+ }
+ rc = 0;
+
+out:
+ free(args);
+ return rc;
+}
diff -r d14479efe33c -r 8800c37a5acb tools/libxl/libxl.c
--- a/tools/libxl/libxl.c Fri Oct 14 13:38:30 2011 +0200
+++ b/tools/libxl/libxl.c Fri Sep 30 14:38:55 2011 +0200
@@ -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);
diff -r d14479efe33c -r 8800c37a5acb tools/libxl/libxl_device.c
--- a/tools/libxl/libxl_device.c Fri Oct 14 13:38:30 2011 +0200
+++ b/tools/libxl/libxl_device.c Fri Sep 30 14:38:55 2011 +0200
@@ -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);
diff -r d14479efe33c -r 8800c37a5acb tools/libxl/libxl_internal.h
--- a/tools/libxl/libxl_internal.h Fri Oct 14 13:38:30 2011 +0200
+++ b/tools/libxl/libxl_internal.h Fri Sep 30 14:38:55 2011 +0200
@@ -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);
next prev parent reply other threads:[~2011-10-14 13:35 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-10-14 13:35 [PATCH 0 of 9] Call hotplug scripts from libxl for NetBSD Roger Pau Monne
2011-10-14 13:35 ` [PATCH 1 of 9] xenbackendd: pass type of block device to hotplug script Roger Pau Monne
2011-10-14 13:35 ` [PATCH 2 of 9] libxl: fix for libxl not waiting for devices to disconnect Roger Pau Monne
2011-10-14 13:35 ` [PATCH 3 of 9] libxl: add support for image files for NetBSD Roger Pau Monne
2011-10-14 13:35 ` [PATCH 4 of 9] libxl: add libxl__forkexec to execute hotplug scripts Roger Pau Monne
2011-10-14 13:35 ` [PATCH 5 of 9] libxl: wait for devices to initialize upon addition to the domain Roger Pau Monne
2011-10-14 13:35 ` Roger Pau Monne [this message]
2011-10-14 13:35 ` [PATCH 7 of 9] hotplug NetBSD: detach devices when state is 5 or 6 Roger Pau Monne
2011-10-14 13:35 ` [PATCH 8 of 9] hotplug: remove debug messages from NetBSD hotplug scripts Roger Pau Monne
2011-10-14 13:35 ` [PATCH 9 of 9] rc.d NetBSD: don't start xenbackendd by default, only when xend needs it Roger Pau Monne
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=8800c37a5acba9e95ac8.1318599338@loki \
--to=roger.pau@entel.upc.edu \
--cc=xen-devel@lists.xensource.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.