tools/libs/gnttab/headers.chk
tools/libs/call/headers.chk
tools/libs/foreignmemory/headers.chk
+tools/blktap2/daemon/blktapctrl
+tools/blktap2/drivers/img2qcow
+tools/blktap2/drivers/lock-util
+tools/blktap2/drivers/qcow-create
+tools/blktap2/drivers/qcow2raw
+tools/blktap2/drivers/tapdisk
+tools/blktap2/drivers/tapdisk-client
+tools/blktap2/drivers/tapdisk-diff
+tools/blktap2/drivers/tapdisk-stream
+tools/blktap2/drivers/tapdisk2
+tools/blktap2/drivers/td-util
+tools/blktap2/vhd/vhd-update
+tools/blktap2/vhd/vhd-util
tools/console/xenconsole
tools/console/xenconsoled
tools/console/client/_paths.h
tools/libxl/libxl-save-helper
tools/libxl/test_timedereg
tools/libxl/test_fdderegrace
+tools/blktap2/control/tap-ctl
tools/firmware/etherboot/eb-roms.h
tools/firmware/etherboot/gpxe-git-snapshot.tar.gz
tools/misc/xenwatchdogd
^stubdom/stubdompath\.sh$
^stubdom/vtpm/vtpm_manager\.h$
^tools/.*/build/lib.*/.*\.py$
+^tools/blktap2/control/tap-ctl$
+^tools/blktap2/drivers/img2qcow$
+^tools/blktap2/drivers/lock-util$
+^tools/blktap2/drivers/qcow-create$
+^tools/blktap2/drivers/qcow2raw$
+^tools/blktap2/drivers/tapdisk-client$
+^tools/blktap2/drivers/tapdisk-diff$
+^tools/blktap2/drivers/tapdisk-stream$
+^tools/blktap2/drivers/tapdisk2$
+^tools/blktap2/drivers/td-util$
+^tools/blktap2/vhd/vhd-update$
+^tools/blktap2/vhd/vhd-util$
^tools/check/\..*$
^tools/console/xenconsole$
^tools/console/xenconsoled$
--with-systemd=DIR
--with-systemd-modules-load=DIR
+The old backend drivers are disabled because qdisk is now the default.
+This option can be used to build them anyway.
+ --enable-blktap2
+
Build various stubom components, some are only example code. Its usually
enough to specify just --enable-stubdom and leave these options alone.
--enable-ioemu-stubdom
M: Yang Hongyang <imhy.yang@gmail.com>
S: Maintained
F: docs/README.remus
+F: tools/blktap2/drivers/block-remus.c
+F: tools/blktap2/drivers/hashtable*
F: tools/libxl/libxl_remus_*
F: tools/libxl/libxl_netbuffer.c
F: tools/libxl/libxl_nonetbuffer.c
CONFIG_SEABIOS := @seabios@
CONFIG_QEMU_TRAD := @qemu_traditional@
CONFIG_QEMU_XEN := @qemu_xen@
+CONFIG_BLKTAP2 := @blktap2@
CONFIG_QEMUU_EXTRA_ARGS:= @EXTRA_QEMUU_CONFIGURE_ARGS@
CONFIG_LIBNL := @libnl@
--------------------------
Description: Specifies the backend implementation to use
-Supported values: phy, qdisk
+Supported values: phy, tap, qdisk
Mandatory: No
Default value: Automatically determine which backend to use.
SUBDIRS-y += xenmon
SUBDIRS-y += xenstat
SUBDIRS-$(CONFIG_Linux) += memshr
+SUBDIRS-$(CONFIG_BLKTAP2) += blktap2
SUBDIRS-$(CONFIG_NetBSD) += xenbackendd
SUBDIRS-y += libfsimage
SUBDIRS-$(CONFIG_Linux) += libvchan
XEN_XENLIGHT = $(XEN_ROOT)/tools/libxl
XEN_XENSTORE = $(XEN_ROOT)/tools/xenstore
XEN_LIBXENSTAT = $(XEN_ROOT)/tools/xenstat/libxenstat/src
+XEN_BLKTAP2 = $(XEN_ROOT)/tools/blktap2
XEN_LIBVCHAN = $(XEN_ROOT)/tools/libvchan
CFLAGS_xeninclude = -I$(XEN_INCLUDE)
PY_CFLAGS += $(PY_NOOPT_CFLAGS)
endif
+LIBXL_BLKTAP ?= $(CONFIG_BLKTAP2)
+
+ifeq ($(LIBXL_BLKTAP),y)
+CFLAGS_libblktapctl = -I$(XEN_BLKTAP2)/control -I$(XEN_BLKTAP2)/include $(CFLAGS_xeninclude)
+SHDEPS_libblktapctl =
+LDLIBS_libblktapctl = $(SHDEPS_libblktapctl) $(XEN_BLKTAP2)/control/libblktapctl$(libextension)
+SHLIB_libblktapctl = $(SHDEPS_libblktapctl) -Wl,-rpath-link=$(XEN_BLKTAP2)/control
+else
+CFLAGS_libblktapctl =
+SHDEPS_libblktapctl =
+LDLIBS_libblktapctl =
+SHLIB_libblktapctl =
+endif
+
CFLAGS_libxenlight = -I$(XEN_XENLIGHT) $(CFLAGS_libxenctrl) $(CFLAGS_xeninclude)
-SHDEPS_libxenlight = $(SHLIB_libxenctrl) $(SHLIB_libxenstore)
+SHDEPS_libxenlight = $(SHLIB_libxenctrl) $(SHLIB_libxenstore) $(SHLIB_libblktapctl)
LDLIBS_libxenlight = $(SHDEPS_libxenlight) $(XEN_XENLIGHT)/libxenlight$(libextension)
SHLIB_libxenlight = $(SHDEPS_libxenlight) -Wl,-rpath-link=$(XEN_XENLIGHT)
/* Enabling support partial device tree in libxl */
#undef ENABLE_PARTIAL_DEVICE_TREE
+/* Blktap2 enabled */
+#undef HAVE_BLKTAP2
+
/* Define to 1 if you have the declaration of `fdt_first_subnode', and to 0 if
you don't. */
#undef HAVE_DECL_FDT_FIRST_SUBNODE
/* Define to 1 if you have the <inttypes.h> header file. */
#undef HAVE_INTTYPES_H
+/* Define to 1 if you have the `aio' library (-laio). */
+#undef HAVE_LIBAIO
+
/* Define to 1 if you have the `crypto' library (-lcrypto). */
#undef HAVE_LIBCRYPTO
LD86
AS86
qemu_traditional
+blktap2
LINUX_BACKEND_MODULES
seabios
ovmf
enable_ovmf
enable_seabios
with_linux_backend_modules
+enable_blktap2
enable_qemu_traditional
enable_rombios
with_system_qemu
--disable-xsmpolicy Disable XSM policy compilation (default is ENABLED)
--enable-ovmf Enable OVMF (default is DISABLED)
--disable-seabios Disable SeaBIOS (default is ENABLED)
+ --enable-blktap2 Enable blktap2, (DEFAULT is on for Linux, otherwise
+ off)
--enable-qemu-traditional
Enable qemu traditional device model, (DEFAULT is on
for Linux or NetBSD x86, otherwise off)
usbbk
pciback
xen-acpi-processor
+blktap2
"
;;
*)
LINUX_BACKEND_MODULES="`eval echo $LINUX_BACKEND_MODULES`"
+# Check whether --enable-blktap2 was given.
+if test "${enable_blktap2+set}" = set; then :
+ enableval=$enable_blktap2;
+else
+
+ case "$host_os" in
+ linux*)
+ enable_blktap2="yes";;
+ *) enable_blktap2="no";;
+ esac
+
+fi
+
+if test "x$enable_blktap2" = "xyes"; then :
+
+
+$as_echo "#define HAVE_BLKTAP2 1" >>confdefs.h
+
+ blktap2=y
+else
+
+ blktap2=n
+
+fi
+
+
+
# Check whether --enable-qemu-traditional was given.
if test "${enable_qemu_traditional+set}" = set; then :
enableval=$enable_qemu_traditional;
+if test "x$enable_blktap2" = "xyes"; then :
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for io_setup in -laio" >&5
+$as_echo_n "checking for io_setup in -laio... " >&6; }
+if ${ac_cv_lib_aio_io_setup+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-laio $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char io_setup ();
+int
+main ()
+{
+return io_setup ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_aio_io_setup=yes
+else
+ ac_cv_lib_aio_io_setup=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_aio_io_setup" >&5
+$as_echo "$ac_cv_lib_aio_io_setup" >&6; }
+if test "x$ac_cv_lib_aio_io_setup" = xyes; then :
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_LIBAIO 1
+_ACEOF
+
+ LIBS="-laio $LIBS"
+
+else
+ as_fn_error $? "Could not find libaio" "$LINENO" 5
+fi
+
+
+fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for MD5 in -lcrypto" >&5
$as_echo_n "checking for MD5 in -lcrypto... " >&6; }
usbbk
pciback
xen-acpi-processor
+blktap2
"
;;
*)
LINUX_BACKEND_MODULES="`eval echo $LINUX_BACKEND_MODULES`"
AC_SUBST(LINUX_BACKEND_MODULES)
+dnl Enable blktap2 on Linux only.
+AC_ARG_ENABLE([blktap2],
+ AS_HELP_STRING([--enable-blktap2],
+ [Enable blktap2, (DEFAULT is on for Linux, otherwise off)]),,[
+ case "$host_os" in
+ linux*)
+ enable_blktap2="yes";;
+ *) enable_blktap2="no";;
+ esac
+])
+AS_IF([test "x$enable_blktap2" = "xyes"], [
+AC_DEFINE([HAVE_BLKTAP2], [1], [Blktap2 enabled])
+ blktap2=y],[
+ blktap2=n
+])
+AC_SUBST(blktap2)
+
+
AC_ARG_ENABLE([qemu-traditional],
AS_HELP_STRING([--enable-qemu-traditional],
[Enable qemu traditional device model, (DEFAULT is on for Linux or NetBSD x86, otherwise off)]),,[
AC_CHECK_LIB([lzo2], [lzo1x_decompress], [zlib="$zlib -DHAVE_LZO1X -llzo2"])
])
AC_SUBST(zlib)
+AS_IF([test "x$enable_blktap2" = "xyes"], [
+AC_CHECK_LIB([aio], [io_setup], [], [AC_MSG_ERROR([Could not find libaio])])
+])
AC_SUBST(system_aio)
AC_CHECK_LIB([crypto], [MD5], [], [AC_MSG_ERROR([Could not find libcrypto])])
AX_CHECK_EXTFS
endif
LIBXL_LIBS =
-LIBXL_LIBS = $(LDLIBS_libxentoollog) $(LDLIBS_libxenevtchn) $(LDLIBS_libxenctrl) $(LDLIBS_libxenguest) $(LDLIBS_libxenstore) $(PTYFUNCS_LIBS) $(LIBUUID_LIBS)
+LIBXL_LIBS = $(LDLIBS_libxentoollog) $(LDLIBS_libxenevtchn) $(LDLIBS_libxenctrl) $(LDLIBS_libxenguest) $(LDLIBS_libxenstore) $(LDLIBS_libblktapctl) $(PTYFUNCS_LIBS) $(LIBUUID_LIBS)
ifeq ($(CONFIG_LIBNL),y)
LIBXL_LIBS += $(LIBNL3_LIBS)
endif
CFLAGS_LIBXL += $(CFLAGS_libxenctrl)
CFLAGS_LIBXL += $(CFLAGS_libxenguest)
CFLAGS_LIBXL += $(CFLAGS_libxenstore)
+CFLAGS_LIBXL += $(CFLAGS_libblktapctl)
ifeq ($(CONFIG_LIBNL),y)
CFLAGS_LIBXL += $(LIBNL3_CFLAGS)
endif
LIBXLU_LIBS = $(LDLIBS_libxenlight)
LIBXL_OBJS-y = osdeps.o libxl_paths.o libxl_bootloader.o flexarray.o
+ifeq ($(LIBXL_BLKTAP),y)
+LIBXL_OBJS-y += libxl_blktap2.o
+else
+LIBXL_OBJS-y += libxl_noblktap2.o
+endif
ifeq ($(CONFIG_LIBNL),y)
LIBXL_OBJS-y += libxl_netbuffer.o
set -e
if [ -x ./xl ] ; then
- export LD_LIBRARY_PATH=.:../libxc:../xenstore
+ export LD_LIBRARY_PATH=.:../libxc:../xenstore:../blktap2/control
XL=./xl
else
XL=xl
case LIBXL_DISK_BACKEND_PHY:
dev = disk->pdev_path;
+ do_backend_phy:
flexarray_append(back, "params");
flexarray_append(back, dev);
break;
case LIBXL_DISK_BACKEND_TAP:
- LOG(ERROR, "blktap is not supported");
- rc = ERROR_FAIL;
- goto out;
+ if (dev == NULL) {
+ dev = libxl__blktap_devpath(gc, disk->pdev_path,
+ disk->format);
+ if (!dev) {
+ LOG(ERROR, "failed to get blktap devpath for %p",
+ disk->pdev_path);
+ rc = ERROR_FAIL;
+ goto out;
+ }
+ }
+ flexarray_append(back, "tapdisk-params");
+ flexarray_append(back, GCSPRINTF("%s:%s",
+ libxl__device_disk_string_of_format(disk->format),
+ disk->pdev_path));
+
+ /* tap backends with scripts are rejected by
+ * libxl__device_disk_set_backend */
+ assert(!disk->script);
+
+ /* now create a phy device to export the device to the guest */
+ goto do_backend_phy;
case LIBXL_DISK_BACKEND_QDISK:
flexarray_append(back, "params");
flexarray_append(back, GCSPRINTF("%s:%s",
--- /dev/null
+/*
+ * Copyright (C) 2010 Advanced Micro Devices
+ * Author Christoph Egger <Christoph.Egger@amd.com>
+ *
+ * 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.
+ *
+ * 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_osdeps.h" /* must come before any other headers */
+#include "libxl_internal.h"
+
+#include "tap-ctl.h"
+
+int libxl__blktap_enabled(libxl__gc *gc)
+{
+ const char *msg;
+ return !tap_ctl_check(&msg);
+}
+
+char *libxl__blktap_devpath(libxl__gc *gc,
+ const char *disk,
+ libxl_disk_format format)
+{
+ const char *type;
+ char *params, *devname = NULL;
+ tap_list_t tap;
+ int err;
+
+ type = libxl__device_disk_string_of_format(format);
+ err = tap_ctl_find(type, disk, &tap);
+ if (err == 0) {
+ devname = GCSPRINTF("/dev/xen/blktap-2/tapdev%d", tap.minor);
+ if (devname)
+ return devname;
+ }
+
+ params = GCSPRINTF("%s:%s", type, disk);
+ err = tap_ctl_create(params, &devname);
+ if (!err) {
+ libxl__ptr_add(gc, devname);
+ return devname;
+ }
+
+ free(devname);
+ return NULL;
+}
+
+
+int libxl__device_destroy_tapdisk(libxl__gc *gc, const char *params)
+{
+ char *type, *disk;
+ int err;
+ tap_list_t tap;
+
+ type = libxl__strdup(gc, params);
+
+ disk = strchr(type, ':');
+ if (!disk) {
+ LOG(ERROR, "Unable to parse params %s", params);
+ return ERROR_INVAL;
+ }
+
+ *disk++ = '\0';
+
+ err = tap_ctl_find(type, disk, &tap);
+ if (err < 0) {
+ /* returns -errno */
+ LOGEV(ERROR, -err, "Unable to find type %s disk %s", type, disk);
+ return ERROR_FAIL;
+ }
+
+ err = tap_ctl_destroy(tap.id, tap.minor);
+ if (err < 0) {
+ LOGEV(ERROR, -err, "Failed to destroy tap device id %d minor %d",
+ tap.id, tap.minor);
+ return ERROR_FAIL;
+ }
+
+ return 0;
+}
+
+/*
+ * Local variables:
+ * mode: C
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
return 0;
case LIBXL_DISK_BACKEND_TAP:
- LOG(DEBUG, "Disk vdev=%s, backend tap unsuitable because blktap "
- "not supported", a->disk->vdev);
- return 0;
+ if (a->disk->script) goto bad_script;
+
+ if (libxl_defbool_val(a->disk->colo_enable))
+ goto bad_colo;
+
+ if (a->disk->is_cdrom) {
+ LOG(DEBUG, "Disk vdev=%s, backend tap unsuitable for cdroms",
+ a->disk->vdev);
+ return 0;
+ }
+ if (!libxl__blktap_enabled(a->gc)) {
+ LOG(DEBUG, "Disk vdev=%s, backend tap unsuitable because blktap "
+ "not available", a->disk->vdev);
+ return 0;
+ }
+ if (!(a->disk->format == LIBXL_DISK_FORMAT_RAW ||
+ a->disk->format == LIBXL_DISK_FORMAT_VHD)) {
+ goto bad_format;
+ }
+ return backend;
case LIBXL_DISK_BACKEND_QDISK:
if (a->disk->script) goto bad_script;
const char *be_path = libxl__device_backend_path(gc, dev);
const char *fe_path = libxl__device_frontend_path(gc, dev);
const char *libxl_path = libxl__device_libxl_path(gc, dev);
+ const char *tapdisk_path = GCSPRINTF("%s/%s", be_path, "tapdisk-params");
+ const char *tapdisk_params;
xs_transaction_t t = 0;
int rc;
uint32_t domid;
rc = libxl__xs_transaction_start(gc, &t);
if (rc) goto out;
+ /* May not exist if this is not a tap device */
+ rc = libxl__xs_read_checked(gc, t, tapdisk_path, &tapdisk_params);
+ if (rc) goto out;
+
if (domid == LIBXL_TOOLSTACK_DOMID) {
/*
* The toolstack domain is in charge of removing the
if (rc < 0) goto out;
}
+ if (tapdisk_params)
+ rc = libxl__device_destroy_tapdisk(gc, tapdisk_params);
+
out:
libxl__xs_transaction_abort(gc, &t);
return rc;
continue;
}
- assert(disks[i].backend != LIBXL_DISK_BACKEND_TAP);
- target_path = libxl__device_disk_find_local_path(gc,
- guest_domid, &disks[i], true);
+ /*
+ * We can't call libxl__blktap_devpath from
+ * libxl__device_disk_find_local_path for now because
+ * the bootloader is called before the disks are set
+ * up, so this function would set up a blktap node,
+ * but there's no TAP tear-down on error conditions in
+ * the bootloader path.
+ */
+ if (disks[i].backend == LIBXL_DISK_BACKEND_TAP)
+ target_path = libxl__blktap_devpath(gc, disks[i].pdev_path,
+ disks[i].format);
+ else
+ target_path = libxl__device_disk_find_local_path(gc,
+ guest_domid, &disks[i], true);
if (!target_path) {
LOG(WARN, "No way to get local access disk to image: %s\n"
char *policy[4];
};
+/*
+ * blktap2 support
+ */
+
+/* libxl__blktap_enabled:
+ * return true if blktap/blktap2 support is available.
+ */
+_hidden int libxl__blktap_enabled(libxl__gc *gc);
+
+/* libxl__blktap_devpath:
+ * Argument: path and disk image as specified in config file.
+ * The type specifies whether this is aio, qcow, qcow2, etc.
+ * returns device path xenstore wants to have. returns NULL
+ * if no device corresponds to the disk.
+ */
+_hidden char *libxl__blktap_devpath(libxl__gc *gc,
+ const char *disk,
+ libxl_disk_format format);
+
/* libxl__device_destroy_tapdisk:
* Destroys any tapdisk process associated with the backend represented
* by be_path.
--- /dev/null
+/*
+ * Copyright (C) 2010 Advanced Micro Devices
+ * Author Christoph Egger <Christoph.Egger@amd.com>
+ *
+ * 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.
+ *
+ * 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_osdeps.h" /* must come before any other headers */
+
+#include "libxl_internal.h"
+
+int libxl__blktap_enabled(libxl__gc *gc)
+{
+ return 0;
+}
+
+char *libxl__blktap_devpath(libxl__gc *gc,
+ const char *disk,
+ libxl_disk_format format)
+{
+ return NULL;
+}
+
+int libxl__device_destroy_tapdisk(libxl__gc *gc, const char *params)
+{
+ return 0;
+}
+
+/*
+ * Local variables:
+ * mode: C
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
/* Copyright (C) 2004 Christopher Clark <firstname.lastname@cl.cam.ac.uk> */
+/*
+ * There are duplicates of this code in:
+ * - tools/blktap2/drivers/hashtable.c
+ */
+
#include "hashtable.h"
#include "hashtable_private.h"
#include <stdlib.h>
/* Copyright (C) 2002 Christopher Clark <firstname.lastname@cl.cam.ac.uk> */
+/*
+ * There are duplicates of this code in:
+ * - tools/blktap2/drivers/hashtable.h
+ */
+
#ifndef __HASHTABLE_CWC22_H__
#define __HASHTABLE_CWC22_H__
/* Copyright (C) 2002, 2004 Christopher Clark <firstname.lastname@cl.cam.ac.uk> */
+/*
+ * There are duplicates of this code in:
+ * - tools/blktap2/drivers/hashtable_private.h
+ */
+
#ifndef __HASHTABLE_PRIVATE_CWC22_H__
#define __HASHTABLE_PRIVATE_CWC22_H__