[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH 3 of 3] blktap3/libxl: Handles blktap3 device in libxl
Handling of blktap3 devices is similar to blktap2, except that libxl doesn't spawn the tapdisk and doesn't create the physical device in dom0. Signed-off-by: Thanos Makatos <thanos.makatos@xxxxxxxxxx> --- Changed since v1: * Don't duplicate code for writing the type:/path/to/file to XenStore. diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c --- a/tools/libxl/libxl.c +++ b/tools/libxl/libxl.c @@ -1159,6 +1159,8 @@ static void disk_eject_xswatch_callback( disk->backend = LIBXL_DISK_BACKEND_TAP; } else if (!strcmp(backend_type, "qdisk")) { disk->backend = LIBXL_DISK_BACKEND_QDISK; + } else if (!strcmp(backend_type, "tap3")) { + disk->backend = LIBXL_DISK_BACKEND_TAP3; } else { disk->backend = LIBXL_DISK_BACKEND_UNKNOWN; } @@ -2012,6 +2014,9 @@ int libxl__device_from_disk(libxl__gc *g case LIBXL_DISK_BACKEND_QDISK: device->backend_kind = LIBXL__DEVICE_KIND_QDISK; break; + case LIBXL_DISK_BACKEND_TAP3: + device->backend_kind = LIBXL__DEVICE_KIND_VBD3; + break; default: LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "unrecognized disk backend type: %d\n", disk->backend); @@ -2130,11 +2135,15 @@ static void device_disk_add(libxl__egc * /* now create a phy device to export the device to the guest */ goto do_backend_phy; + case LIBXL_DISK_BACKEND_TAP3: case LIBXL_DISK_BACKEND_QDISK: flexarray_append(back, "params"); flexarray_append(back, libxl__sprintf(gc, "%s:%s", libxl__device_disk_string_of_format(disk->format), disk->pdev_path)); - assert(device->backend_kind == LIBXL__DEVICE_KIND_QDISK); + assert( + (disk->backend == LIBXL_DISK_BACKEND_QDISK + && device->backend_kind == LIBXL__DEVICE_KIND_QDISK) + || (disk->backend == LIBXL_DISK_BACKEND_TAP3)); break; default: LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "unrecognized disk backend type: %d\n", disk->backend); diff --git a/tools/libxl/libxl_device.c b/tools/libxl/libxl_device.c --- a/tools/libxl/libxl_device.c +++ b/tools/libxl/libxl_device.c @@ -190,6 +190,23 @@ static int disk_try_backend(disk_try_bac } return backend; + case LIBXL_DISK_BACKEND_TAP3: + /* TODO What's that script thing? */ + if (a->disk->script) goto bad_script; + + if (!libxl__blktap3_enabled(a->gc)) { + LIBXL__LOG(ctx, LIBXL__LOG_DEBUG, "Disk vdev=%s, backend tap" + " unsuitable because blktap3 not available", + a->disk->vdev); + return 0; + } + /* TODO other formats supported by blktap3? */ + 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; return backend; @@ -258,6 +275,7 @@ int libxl__device_disk_set_backend(libxl ok= disk_try_backend(&a, LIBXL_DISK_BACKEND_PHY) ?: disk_try_backend(&a, LIBXL_DISK_BACKEND_TAP) ?: + disk_try_backend(&a, LIBXL_DISK_BACKEND_TAP3) ?: disk_try_backend(&a, LIBXL_DISK_BACKEND_QDISK); if (ok) LIBXL__LOG(ctx, LIBXL__LOG_DEBUG, "Disk vdev=%s, using backend %s", @@ -290,6 +308,7 @@ char *libxl__device_disk_string_of_backe switch (backend) { case LIBXL_DISK_BACKEND_QDISK: return "qdisk"; case LIBXL_DISK_BACKEND_TAP: return "phy"; + case LIBXL_DISK_BACKEND_TAP3: return "phy"; case LIBXL_DISK_BACKEND_PHY: return "phy"; default: return NULL; } _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |