return 0;
case LIBXL_DISK_BACKEND_TAP:
- 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;
+
+ if (libxl_defbool_val(a->disk->colo_enable))
+ goto bad_colo;
+
+ LOG(DEBUG, "Disk vdev=%s, returning blktap", a->disk->vdev);
+ return backend;
case LIBXL_DISK_BACKEND_QDISK:
if (a->disk->script) goto bad_script;
{
switch (backend) {
case LIBXL_DISK_BACKEND_QDISK: return "qdisk";
- case LIBXL_DISK_BACKEND_TAP: return "phy";
+ case LIBXL_DISK_BACKEND_TAP: return "vbd3";
case LIBXL_DISK_BACKEND_PHY: return "phy";
case LIBXL_DISK_BACKEND_STANDALONE: return "standalone";
default: return NULL;
"/local/domain/%d/backend/%" TOSTRING(BACKEND_STRING_SIZE)
"[a-z]/%*d/%*d",
&disk->backend_domid, backend_type);
- if (!strcmp(backend_type, "tap") || !strcmp(backend_type, "vbd")) {
+ if (!strcmp(backend_type, "tap") ||
+ !strcmp(backend_type, "vbd") ||
+ !strcmp(backend_type, "vbd3")) {
disk->backend = LIBXL_DISK_BACKEND_TAP;
} else if (!strcmp(backend_type, "qdisk")) {
disk->backend = LIBXL_DISK_BACKEND_QDISK;
device->backend_kind = LIBXL__DEVICE_KIND_VBD;
break;
case LIBXL_DISK_BACKEND_TAP:
- device->backend_kind = LIBXL__DEVICE_KIND_VBD;
+ device->backend_kind = LIBXL__DEVICE_KIND_VBD3;
break;
case LIBXL_DISK_BACKEND_QDISK:
device->backend_kind = LIBXL__DEVICE_KIND_QDISK;
assert(device->backend_kind == LIBXL__DEVICE_KIND_VIRTIO_DISK);
break;
case LIBXL_DISK_BACKEND_TAP:
- LOG(ERROR, "blktap is not supported");
- rc = ERROR_FAIL;
- goto out;
+ flexarray_append(back, "params");
+ flexarray_append(back, GCSPRINTF("%s:%s",
+ libxl__device_disk_string_of_format(disk->format),
+ disk->pdev_path ? : ""));
+
+ script = libxl__abs_path(gc, disk->script?: "block-tap",
+ libxl__xen_script_dir_path());
+ flexarray_append_pair(back, "script", script);
+
+ assert(device->backend_kind == LIBXL__DEVICE_KIND_VBD3);
+ break;
case LIBXL_DISK_BACKEND_QDISK:
flexarray_append(back, "params");
flexarray_append(back, GCSPRINTF("%s:%s",
*backend = LIBXL_DISK_BACKEND_PHY;
} else if (!strcmp(s, "file")) {
*backend = LIBXL_DISK_BACKEND_TAP;
+ } else if (!strcmp(s, "vbd3")) {
+ *backend = LIBXL_DISK_BACKEND_TAP;
} else if (!strcmp(s, "qdisk")) {
*backend = LIBXL_DISK_BACKEND_QDISK;
} else if (!strcmp(s, "standalone")) {