[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH 16/17] support blktap remus in xl
With this patch, we can use blktap remus like this: disk = [ 'format=raw,devtype=disk,access=w,vdev=hda,backendtype=tap,filter=remus,filter-params=192.168.3.1:9000,target=filename' ] Signed-off-by: Wen Congyang <wency@xxxxxxxxxxxxxx> Cc: Shriram Rajagopalan <rshriram@xxxxxxxxx> --- tools/libxl/libxl.c | 25 +++++++++++++++++++++++-- tools/libxl/libxl_blktap2.c | 38 +++++++++++++++++++++++++++++++++----- tools/libxl/libxl_device.c | 35 ++++++++++++++++++++++++++++++++++- tools/libxl/libxl_dm.c | 4 +++- tools/libxl/libxl_internal.h | 8 ++++++-- tools/libxl/libxl_noblktap2.c | 8 ++++++-- tools/libxl/libxl_types.idl | 2 ++ tools/libxl/libxlu_disk_l.l | 2 ++ 8 files changed, 109 insertions(+), 13 deletions(-) diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c index efc3ca6..f96c73b 100644 --- a/tools/libxl/libxl.c +++ b/tools/libxl/libxl.c @@ -2394,7 +2394,8 @@ static void device_disk_add(libxl__egc *egc, uint32_t domid, case LIBXL_DISK_BACKEND_TAP: if (dev == NULL) { dev = libxl__blktap_devpath(gc, disk->pdev_path, - disk->format); + disk->format, disk->filter, + disk->filter_params); if (!dev) { LOG(ERROR, "failed to get blktap devpath for %p\n", disk->pdev_path); @@ -2406,6 +2407,11 @@ static void device_disk_add(libxl__egc *egc, uint32_t domid, flexarray_append(back, libxl__sprintf(gc, "%s:%s", libxl_disk_format_to_string(disk->format), disk->pdev_path)); + if (disk->filter) { + flexarray_append(back, "filter-params"); + flexarray_append(back, libxl__sprintf(gc, "%s:%s", + disk->filter, disk->filter_params)); + } /* tap backends with scripts are rejected by * libxl__device_disk_set_backend */ @@ -2607,6 +2613,20 @@ static int libxl__device_disk_from_xs_be(libxl__gc *gc, * phy in type(see device_disk_add()) */ disk->backend = LIBXL_DISK_BACKEND_TAP; + + rc = read_params(gc, GCSPRINTF("%s/filter-params", be_path), + &tmp, &disk->filter_params); + if (rc) + goto cleanup; + if (!tmp) { + LOG(ERROR, "corrupted filter-params: %s", disk->filter_params); + goto cleanup; + } + disk->filter = strdup(tmp); + if (!disk->filter) { + LOGE(ERROR, "no memory to store filter"); + goto cleanup; + } } else { /* "params" may not be present; but everything else must be. */ rc = read_params(gc, GCSPRINTF("%s/params", be_path), @@ -3059,7 +3079,8 @@ void libxl__device_disk_local_initiate_attach(libxl__egc *egc, break; case LIBXL_DISK_FORMAT_VHD: dev = libxl__blktap_devpath(gc, disk->pdev_path, - disk->format); + disk->format, disk->filter, + disk->filter_params); break; case LIBXL_DISK_FORMAT_QCOW: case LIBXL_DISK_FORMAT_QCOW2: diff --git a/tools/libxl/libxl_blktap2.c b/tools/libxl/libxl_blktap2.c index 7656fe4..ebe0271 100644 --- a/tools/libxl/libxl_blktap2.c +++ b/tools/libxl/libxl_blktap2.c @@ -25,22 +25,33 @@ int libxl__blktap_enabled(libxl__gc *gc) char *libxl__blktap_devpath(libxl__gc *gc, const char *disk, - libxl_disk_format format) + libxl_disk_format format, + const char *filter, + const char *filter_params) { - const char *type; + const char *type, *disk_params; 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 (!type) + return NULL; + + if (filter) { + disk_params = libxl__sprintf(gc, "%s|%s:%s", filter_params, type, disk); + type = filter; + } else { + disk_params = disk; + } + err = tap_ctl_find(type, disk_params, &tap); if (err == 0) { devname = libxl__sprintf(gc, "/dev/xen/blktap-2/tapdev%d", tap.minor); if (devname) return devname; } - params = libxl__sprintf(gc, "%s:%s", type, disk); + params = libxl__sprintf(gc, "%s:%s", type, disk_params); err = tap_ctl_create(params, &devname); if (!err) { libxl__ptr_add(gc, devname); @@ -51,7 +62,9 @@ char *libxl__blktap_devpath(libxl__gc *gc, } -int libxl__device_destroy_tapdisk(libxl__gc *gc, const char *params) +int libxl__device_destroy_tapdisk(libxl__gc *gc, + const char *params, + const char *filter_params) { char *type, *disk; int err, rc; @@ -77,6 +90,21 @@ int libxl__device_destroy_tapdisk(libxl__gc *gc, const char *params) type = libxl__device_disk_string_of_format(format); + if (filter_params) { + char *tmp; + char *tmp_type = type, *tmp_disk = disk; + + type = libxl__strdup(gc, filter_params); + tmp = strchr(type, ':'); + + if (!tmp) { + LOG(ERROR, "Unable to parse filter-params %s", filter_params); + return ERROR_FAIL; + } + *tmp++ = '\0'; + disk = libxl__sprintf(gc, "%s|%s:%s", tmp, tmp_type, tmp_disk); + } + err = tap_ctl_find(type, disk, &tap); if (err < 0) { /* returns -errno */ diff --git a/tools/libxl/libxl_device.c b/tools/libxl/libxl_device.c index 4b51ded..0b2a68d 100644 --- a/tools/libxl/libxl_device.c +++ b/tools/libxl/libxl_device.c @@ -196,6 +196,9 @@ static int disk_try_backend(disk_try_backend_args *a, goto bad_format; } + if (a->disk->filter) goto bad_filter; + if (a->disk->filter_params) goto bad_filter_params; + if (a->disk->backend_domid != LIBXL_TOOLSTACK_DOMID) { LOG(DEBUG, "Disk vdev=%s, is using a storage driver domain, " "skipping physical device check", a->disk->vdev); @@ -232,10 +235,25 @@ static int disk_try_backend(disk_try_backend_args *a, a->disk->format == LIBXL_DISK_FORMAT_VHD)) { goto bad_format; } + + if (a->disk->filter && !a->disk->filter_params) { + LOG(DEBUG, "Disk vdev=%s, backend tap unsuitable due to missing " + "filter_params=...", a->disk->vdev); + return 0; + } + + if (!a->disk->filter && a->disk->filter_params) { + LOG(DEBUG, "Disk vdev=%s, backend tap unsuitable due to missing " + "filter=...", a->disk->vdev); + return 0; + } + return backend; case LIBXL_DISK_BACKEND_QDISK: if (a->disk->script) goto bad_script; + if (a->disk->filter) goto bad_filter; + if (a->disk->filter_params) goto bad_filter_params; return backend; default: @@ -256,6 +274,16 @@ static int disk_try_backend(disk_try_backend_args *a, LOG(DEBUG, "Disk vdev=%s, backend %s not compatible with script=...", a->disk->vdev, libxl_disk_backend_to_string(backend)); return 0; + + bad_filter: + LOG(DEBUG, "Disk vdev=%s, backend %s not compatible with filter=...", + a->disk->vdev, libxl_disk_backend_to_string(backend)); + return 0; + + bad_filter_params: + LOG(DEBUG, "Disk vdev=%s, backend %s not compatible with filter-params=...", + a->disk->vdev, libxl_disk_backend_to_string(backend)); + return 0; } int libxl__device_disk_set_backend(libxl__gc *gc, libxl_device_disk *disk) { @@ -572,6 +600,8 @@ int libxl__device_destroy(libxl__gc *gc, libxl__device *dev) const char *fe_path = libxl__device_frontend_path(gc, dev); const char *tapdisk_path = GCSPRINTF("%s/%s", be_path, "tapdisk-params"); const char *tapdisk_params; + const char *filter_path = GCSPRINTF("%s/%s", be_path, "filter-params"); + const char *filter_params; xs_transaction_t t = 0; int rc; uint32_t domid; @@ -587,6 +617,9 @@ int libxl__device_destroy(libxl__gc *gc, libxl__device *dev) rc = libxl__xs_read_checked(gc, t, tapdisk_path, &tapdisk_params); if (rc) goto out; + rc = libxl__xs_read_checked(gc, t, filter_path, &filter_params); + if (rc) goto out; + if (domid == LIBXL_TOOLSTACK_DOMID) { /* * The toolstack domain is in charge for removing both the @@ -608,7 +641,7 @@ int libxl__device_destroy(libxl__gc *gc, libxl__device *dev) } if (tapdisk_params) - rc = libxl__device_destroy_tapdisk(gc, tapdisk_params); + rc = libxl__device_destroy_tapdisk(gc, tapdisk_params, filter_params); out: libxl__xs_transaction_abort(gc, &t); diff --git a/tools/libxl/libxl_dm.c b/tools/libxl/libxl_dm.c index d8992bb..a39d46c 100644 --- a/tools/libxl/libxl_dm.c +++ b/tools/libxl/libxl_dm.c @@ -750,7 +750,9 @@ static char ** libxl__build_device_model_args_new(libxl__gc *gc, if (disks[i].backend == LIBXL_DISK_BACKEND_TAP) pdev_path = libxl__blktap_devpath(gc, disks[i].pdev_path, - disks[i].format); + disks[i].format, + disks[i].filter, + disks[i].filter_params); else pdev_path = disks[i].pdev_path; diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h index 83bef59..282b03f 100644 --- a/tools/libxl/libxl_internal.h +++ b/tools/libxl/libxl_internal.h @@ -1541,14 +1541,18 @@ _hidden int libxl__blktap_enabled(libxl__gc *gc); */ _hidden char *libxl__blktap_devpath(libxl__gc *gc, const char *disk, - libxl_disk_format format); + libxl_disk_format format, + const char *filter, + const char *filter_params); /* libxl__device_destroy_tapdisk: * Destroys any tapdisk process associated with the backend represented * by be_path. * Always logs on failure. */ -_hidden int libxl__device_destroy_tapdisk(libxl__gc *gc, const char *params); +_hidden int libxl__device_destroy_tapdisk(libxl__gc *gc, + const char *params, + const char *filter_params); _hidden int libxl__device_from_disk(libxl__gc *gc, uint32_t domid, libxl_device_disk *disk, diff --git a/tools/libxl/libxl_noblktap2.c b/tools/libxl/libxl_noblktap2.c index 5a86ed1..ba3120b 100644 --- a/tools/libxl/libxl_noblktap2.c +++ b/tools/libxl/libxl_noblktap2.c @@ -23,12 +23,16 @@ int libxl__blktap_enabled(libxl__gc *gc) char *libxl__blktap_devpath(libxl__gc *gc, const char *disk, - libxl_disk_format format) + libxl_disk_format format, + const char *filter, + const char *filter_params) { return NULL; } -int libxl__device_destroy_tapdisk(libxl__gc *gc, const char *params) +int libxl__device_destroy_tapdisk(libxl__gc *gc, + const char *params, + const char *filter_params) { return 0; } diff --git a/tools/libxl/libxl_types.idl b/tools/libxl/libxl_types.idl index bbb03e2..275be93 100644 --- a/tools/libxl/libxl_types.idl +++ b/tools/libxl/libxl_types.idl @@ -465,6 +465,8 @@ libxl_device_disk = Struct("device_disk", [ ("is_cdrom", integer), ("direct_io_safe", bool), ("discard_enable", libxl_defbool), + ("filter", string), + ("filter_params", string), ]) libxl_device_nic = Struct("device_nic", [ diff --git a/tools/libxl/libxlu_disk_l.l b/tools/libxl/libxlu_disk_l.l index 1a5deb5..cfd2e3f 100644 --- a/tools/libxl/libxlu_disk_l.l +++ b/tools/libxl/libxlu_disk_l.l @@ -176,6 +176,8 @@ script=[^,]*,? { STRIP(','); SAVESTRING("script", script, FROMEQUALS); } direct-io-safe,? { DPC->disk->direct_io_safe = 1; } discard,? { libxl_defbool_set(&DPC->disk->discard_enable, true); } no-discard,? { libxl_defbool_set(&DPC->disk->discard_enable, false); } +filter=[^,]*,? { STRIP(','); SAVESTRING("filter", filter, FROMEQUALS); } +filter-params=[^,]*,? { STRIP(','); SAVESTRING("filter-params", filter_params, FROMEQUALS); } /* the target magic parameter, eats the rest of the string */ -- 1.9.3 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |