From 18b7f09f366d518050f467d0944c81c82fd5e39e Mon Sep 17 00:00:00 2001 From: "Richard W.M. Jones" Date: Fri, 5 Oct 2012 14:56:35 +0100 Subject: Add support for hotplugging (adding disks) to the libvirt attach-method. When libvirt is used, we can allow disks to be hotplugged. guestfs_add_drive can be called after launch to hot-add a disk. When a disk is hot-added, we first ask libvirt to add the disk to the appliance, then we make an internal call into the appliance to get it to wait for the disk to appear (ie. udev_settle ()). Hot-added disks are tracked in the g->drives array. This also adds a test. --- Makefile.am | 1 + configure.ac | 1 + daemon/Makefile.am | 1 + daemon/hotplug.c | 67 +++++++++++++++++++++++++++++ fish/alloc.c | 5 --- generator/actions.ml | 24 +++++++++-- po/POTFILES | 1 + src/MAX_PROC_NR | 2 +- src/guestfs-internal.h | 3 ++ src/guestfs.pod | 38 +++++++++++++++-- src/launch-libvirt.c | 99 +++++++++++++++++++++++++++++++++++++++---- src/launch.c | 80 +++++++++++++++++++++++++++++++--- tests/hotplug/Makefile.am | 26 ++++++++++++ tests/hotplug/test-hot-add.pl | 66 +++++++++++++++++++++++++++++ 14 files changed, 386 insertions(+), 28 deletions(-) create mode 100644 daemon/hotplug.c create mode 100644 tests/hotplug/Makefile.am create mode 100755 tests/hotplug/test-hot-add.pl diff --git a/Makefile.am b/Makefile.am index 4e476ea9..50bfb322 100644 --- a/Makefile.am +++ b/Makefile.am @@ -52,6 +52,7 @@ SUBDIRS += tests/9p SUBDIRS += tests/rsync SUBDIRS += tests/bigdirs SUBDIRS += tests/disk-labels +SUBDIRS += tests/hotplug SUBDIRS += tests/regressions endif diff --git a/configure.ac b/configure.ac index 0422bcb4..b4720bce 100644 --- a/configure.ac +++ b/configure.ac @@ -1379,6 +1379,7 @@ AC_CONFIG_FILES([Makefile tests/disk-labels/Makefile tests/extra/Makefile tests/guests/Makefile + tests/hotplug/Makefile tests/luks/Makefile tests/lvm/Makefile tests/md/Makefile diff --git a/daemon/Makefile.am b/daemon/Makefile.am index 2a25c695..9ffff152 100644 --- a/daemon/Makefile.am +++ b/daemon/Makefile.am @@ -125,6 +125,7 @@ guestfsd_SOURCES = \ guestfsd.c \ headtail.c \ hexdump.c \ + hotplug.c \ hivex.c \ htonl.c \ initrd.c \ diff --git a/daemon/hotplug.c b/daemon/hotplug.c new file mode 100644 index 00000000..aae638e7 --- /dev/null +++ b/daemon/hotplug.c @@ -0,0 +1,67 @@ +/* libguestfs - the guestfsd daemon + * Copyright (C) 2012 Red Hat Inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#include + +#include +#include +#include +#include +#include + +#include "guestfs_protocol.h" +#include "daemon.h" +#include "actions.h" + +#define HOT_ADD_TIMEOUT 30 /* seconds */ + +/* Wait for /dev/disk/guestfs/