[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-changelog] [xen master] Revert "tools: remove blktap2 related code and documentation"



commit d5e9965ee449d3dc123ad9fe0038893dd595e1a0
Author:     Wei Liu <wei.liu2@xxxxxxxxxx>
AuthorDate: Thu Sep 8 16:15:59 2016 +0100
Commit:     Wei Liu <wei.liu2@xxxxxxxxxx>
CommitDate: Thu Sep 8 16:15:59 2016 +0100

    Revert "tools: remove blktap2 related code and documentation"
    
    This reverts commit 3f0ae679f2704ca5671eef5be59ec30982fbf08a.
---
 .gitignore                          | 14 ++++++
 .hgignore                           | 12 +++++
 INSTALL                             |  4 ++
 MAINTAINERS                         |  2 +
 config/Tools.mk.in                  |  1 +
 docs/misc/xl-disk-configuration.txt |  2 +-
 tools/Makefile                      |  1 +
 tools/Rules.mk                      | 17 ++++++-
 tools/config.h.in                   |  6 +++
 tools/configure                     | 83 ++++++++++++++++++++++++++++++++
 tools/configure.ac                  | 22 +++++++++
 tools/libxl/Makefile                |  8 +++-
 tools/libxl/check-xl-disk-parse     |  2 +-
 tools/libxl/libxl.c                 | 25 ++++++++--
 tools/libxl/libxl_blktap2.c         | 94 +++++++++++++++++++++++++++++++++++++
 tools/libxl/libxl_device.c          | 32 +++++++++++--
 tools/libxl/libxl_dm.c              | 17 +++++--
 tools/libxl/libxl_internal.h        | 19 ++++++++
 tools/libxl/libxl_noblktap2.c       | 42 +++++++++++++++++
 tools/xenstore/hashtable.c          |  5 ++
 tools/xenstore/hashtable.h          |  5 ++
 tools/xenstore/hashtable_private.h  |  5 ++
 22 files changed, 405 insertions(+), 13 deletions(-)

diff --git a/.gitignore b/.gitignore
index 848318e..cc64fc9 100644
--- a/.gitignore
+++ b/.gitignore
@@ -98,6 +98,19 @@ tools/libs/evtchn/headers.chk
 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
@@ -314,6 +327,7 @@ tools/libxl/*.pyc
 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
diff --git a/.hgignore b/.hgignore
index 80568bd..8342f36 100644
--- a/.hgignore
+++ b/.hgignore
@@ -128,6 +128,18 @@
 ^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$
diff --git a/INSTALL b/INSTALL
index 3b255c7..9759354 100644
--- a/INSTALL
+++ b/INSTALL
@@ -144,6 +144,10 @@ this detection and the sysv runlevel scripts have to be 
used.
   --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
diff --git a/MAINTAINERS b/MAINTAINERS
index d54795b..97720a8 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -322,6 +322,8 @@ M:  Shriram Rajagopalan <rshriram@xxxxxxxxx>
 M:     Yang Hongyang <imhy.yang@xxxxxxxxx>
 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
diff --git a/config/Tools.mk.in b/config/Tools.mk.in
index 511406c..0f79f4e 100644
--- a/config/Tools.mk.in
+++ b/config/Tools.mk.in
@@ -56,6 +56,7 @@ CONFIG_ROMBIOS      := @rombios@
 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@
 
diff --git a/docs/misc/xl-disk-configuration.txt 
b/docs/misc/xl-disk-configuration.txt
index 2e9345c..b3402bc 100644
--- a/docs/misc/xl-disk-configuration.txt
+++ b/docs/misc/xl-disk-configuration.txt
@@ -155,7 +155,7 @@ backendtype=<backend-type>
 --------------------------
 
 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.
 
diff --git a/tools/Makefile b/tools/Makefile
index b8fe2ce..71515b4 100644
--- a/tools/Makefile
+++ b/tools/Makefile
@@ -17,6 +17,7 @@ SUBDIRS-y += console
 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
diff --git a/tools/Rules.mk b/tools/Rules.mk
index bbeef14..5a80fec 100644
--- a/tools/Rules.mk
+++ b/tools/Rules.mk
@@ -19,6 +19,7 @@ XEN_LIBXC          = $(XEN_ROOT)/tools/libxc
 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)
@@ -142,8 +143,22 @@ CFLAGS += -O0 -g3
 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)
 
diff --git a/tools/config.h.in b/tools/config.h.in
index f86b40a..f65eec4 100644
--- a/tools/config.h.in
+++ b/tools/config.h.in
@@ -3,6 +3,9 @@
 /* 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
@@ -24,6 +27,9 @@
 /* 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
 
diff --git a/tools/configure b/tools/configure
index 29c6d77..7b22305 100755
--- a/tools/configure
+++ b/tools/configure
@@ -703,6 +703,7 @@ BCC
 LD86
 AS86
 qemu_traditional
+blktap2
 LINUX_BACKEND_MODULES
 seabios
 ovmf
@@ -801,6 +802,7 @@ enable_xsmpolicy
 enable_ovmf
 enable_seabios
 with_linux_backend_modules
+enable_blktap2
 enable_qemu_traditional
 enable_rombios
 with_system_qemu
@@ -1473,6 +1475,8 @@ Optional Features:
   --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)
@@ -4155,6 +4159,7 @@ xen-scsibk
 usbbk
 pciback
 xen-acpi-processor
+blktap2
 "
 ;;
 *)
@@ -4166,6 +4171,33 @@ fi
 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;
@@ -8276,6 +8308,57 @@ fi
 
 
 
+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; }
diff --git a/tools/configure.ac b/tools/configure.ac
index d00fa45..f010d72 100644
--- a/tools/configure.ac
+++ b/tools/configure.ac
@@ -108,6 +108,7 @@ xen-scsibk
 usbbk
 pciback
 xen-acpi-processor
+blktap2
 "
 ;;
 *)
@@ -117,6 +118,24 @@ esac])
 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)]),,[
@@ -350,6 +369,9 @@ AC_CHECK_HEADER([lzo/lzo1x.h], [
 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
diff --git a/tools/libxl/Makefile b/tools/libxl/Makefile
index 6994c58..14a1a8e 100644
--- a/tools/libxl/Makefile
+++ b/tools/libxl/Makefile
@@ -20,7 +20,7 @@ LIBUUID_LIBS += -luuid
 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
@@ -30,6 +30,7 @@ CFLAGS_LIBXL += $(CFLAGS_libxenevtchn)
 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
@@ -45,6 +46,11 @@ LIBXL_LIBS += $(LIBXL_LIBS-y)
 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
diff --git a/tools/libxl/check-xl-disk-parse b/tools/libxl/check-xl-disk-parse
index 643f4f4..03572e4 100755
--- a/tools/libxl/check-xl-disk-parse
+++ b/tools/libxl/check-xl-disk-parse
@@ -3,7 +3,7 @@
 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
diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c
index 577ed35..6a50e49 100644
--- a/tools/libxl/libxl.c
+++ b/tools/libxl/libxl.c
@@ -2218,6 +2218,7 @@ static void device_disk_add(libxl__egc *egc, uint32_t 
domid,
             case LIBXL_DISK_BACKEND_PHY:
                 dev = disk->pdev_path;
 
+        do_backend_phy:
                 flexarray_append(back, "params");
                 flexarray_append(back, dev);
 
@@ -2229,9 +2230,27 @@ static void device_disk_add(libxl__egc *egc, uint32_t 
domid,
                 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",
diff --git a/tools/libxl/libxl_blktap2.c b/tools/libxl/libxl_blktap2.c
new file mode 100644
index 0000000..5c9a0a2
--- /dev/null
+++ b/tools/libxl/libxl_blktap2.c
@@ -0,0 +1,94 @@
+/*
+ * Copyright (C) 2010      Advanced Micro Devices
+ * Author Christoph Egger <Christoph.Egger@xxxxxxx>
+ *
+ * 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:
+ */
diff --git a/tools/libxl/libxl_device.c b/tools/libxl/libxl_device.c
index 9c77b62..dbf157d 100644
--- a/tools/libxl/libxl_device.c
+++ b/tools/libxl/libxl_device.c
@@ -271,9 +271,26 @@ static int disk_try_backend(disk_try_backend_args *a,
         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;
@@ -665,6 +682,8 @@ int libxl__device_destroy(libxl__gc *gc, libxl__device *dev)
     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;
@@ -676,6 +695,10 @@ int libxl__device_destroy(libxl__gc *gc, libxl__device 
*dev)
         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
@@ -697,6 +720,9 @@ int libxl__device_destroy(libxl__gc *gc, libxl__device *dev)
         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;
diff --git a/tools/libxl/libxl_dm.c b/tools/libxl/libxl_dm.c
index 1da956e..e3bf28f 100644
--- a/tools/libxl/libxl_dm.c
+++ b/tools/libxl/libxl_dm.c
@@ -1362,9 +1362,20 @@ static int libxl__build_device_model_args_new(libxl__gc 
*gc,
                     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"
diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h
index f9ac09a..ce8e17a 100644
--- a/tools/libxl/libxl_internal.h
+++ b/tools/libxl/libxl_internal.h
@@ -1705,6 +1705,25 @@ struct libxl__cpuid_policy {
     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.
diff --git a/tools/libxl/libxl_noblktap2.c b/tools/libxl/libxl_noblktap2.c
new file mode 100644
index 0000000..5a86ed1
--- /dev/null
+++ b/tools/libxl/libxl_noblktap2.c
@@ -0,0 +1,42 @@
+/*
+ * Copyright (C) 2010      Advanced Micro Devices
+ * Author Christoph Egger <Christoph.Egger@xxxxxxx>
+ *
+ * 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:
+ */
diff --git a/tools/xenstore/hashtable.c b/tools/xenstore/hashtable.c
index 394b1cf..0ba1d55 100644
--- a/tools/xenstore/hashtable.c
+++ b/tools/xenstore/hashtable.c
@@ -1,5 +1,10 @@
 /* Copyright (C) 2004 Christopher Clark <firstname.lastname@xxxxxxxxxxxx> */
 
+/*
+ * There are duplicates of this code in:
+ *  - tools/blktap2/drivers/hashtable.c
+ */
+
 #include "hashtable.h"
 #include "hashtable_private.h"
 #include <stdlib.h>
diff --git a/tools/xenstore/hashtable.h b/tools/xenstore/hashtable.h
index b90781a..4d68223 100644
--- a/tools/xenstore/hashtable.h
+++ b/tools/xenstore/hashtable.h
@@ -1,5 +1,10 @@
 /* Copyright (C) 2002 Christopher Clark <firstname.lastname@xxxxxxxxxxxx> */
 
+/*
+ * There are duplicates of this code in:
+ *  - tools/blktap2/drivers/hashtable.h
+ */
+
 #ifndef __HASHTABLE_CWC22_H__
 #define __HASHTABLE_CWC22_H__
 
diff --git a/tools/xenstore/hashtable_private.h 
b/tools/xenstore/hashtable_private.h
index 3e95f60..a08559d 100644
--- a/tools/xenstore/hashtable_private.h
+++ b/tools/xenstore/hashtable_private.h
@@ -1,5 +1,10 @@
 /* Copyright (C) 2002, 2004 Christopher Clark 
<firstname.lastname@xxxxxxxxxxxx> */
 
+/*
+ * There are duplicates of this code in:
+ *  - tools/blktap2/drivers/hashtable_private.h
+ */
+
 #ifndef __HASHTABLE_PRIVATE_CWC22_H__
 #define __HASHTABLE_PRIVATE_CWC22_H__
 
--
generated by git-patchbot for /home/xen/git/xen.git#master

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxx
https://lists.xenproject.org/xen-changelog

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.