Revert "tools: remove blktap2 related code and documentation"

This reverts commit 3f0ae679f2.
This commit is contained in:
Wei Liu committed 2016-09-08 16:15:59 +01:00
1 parent d383c07e8b
commit d5e9965ee4
22 files changed
+405 -13

No files matched your search

+14
View File
@@ -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
+12
View File
@@ -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$
+4
View File
@@ -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
+2
View File
@@ -322,6 +322,8 @@ M: Shriram Rajagopalan <rshriram@cs.ubc.ca>
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
+1
View File
@@ -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@
+1 -1
View File
@@ -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.
+1
View File
@@ -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
+16 -1
View File
@@ -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)
+6
View File
@@ -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
+83
View File
@@ -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; }
+22
View File
@@ -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
+7 -1
View File
@@ -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
+1 -1
View File
@@ -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
+22 -3
View File
@@ -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",
+94
View File
@@ -0,0 +1,94 @@
/*
* 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:
*/
+29 -3
View File
@@ -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;
+14 -3
View File
@@ -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"
+19
View File
@@ -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.
+42
View File
@@ -0,0 +1,42 @@
/*
* 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:
*/
+5
View File
@@ -1,5 +1,10 @@
/* 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>
+5
View File
@@ -1,5 +1,10 @@
/* 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__
+5
View File
@@ -1,5 +1,10 @@
/* 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__
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.