From 18b7f09f366d518050f467d0944c81c82fd5e39e Mon Sep 17 00:00:00 2001 From: "Richard W.M. Jones" Date: Fri, 5 Oct 2012 14:56:35 +0100 Subject: [PATCH] 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 4e476ea92..50bfb322f 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 0422bcb40..b4720bce3 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 2a25c695f..9ffff152b 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 000000000..aae638e7a --- /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/