[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH RFC v2 2/3] libxl: Port libxl_blktap2.c to blktap2.5 API.
This is code is in preparation for building against an external blktap tree. tap_ctl_find() has gone away, so in some cases we use tap_ctl_find_minor(), and in other cases we use a locally-reimplemented version of tap_ctl_find(). tap_ctl_create() has an extra three parameters, including a flags parameter which can be used to designate a disk image as read-only. Pass the readwrite disk flag here so we can now open backends on read-only storage. tap_ctl_destroy() now has two extra arguments as well; add sensible default values. Signed-off-by: George Dunlap <george.dunlap@xxxxxxxxxxxxx> --- CC: Ian Campbell <ian.campbell@xxxxxxxxxx> CC: Ian Jackson <ian.jackson@xxxxxxxxxx> CC: Wei Liu <wei.liu2@xxxxxxxxxx> CC: Dave Scott <Dave.Scott@xxxxxxxxxxxxx> CC: Jonathan Ludlam <Jonathan.Ludlam@xxxxxxxxxxxxx> CC: Wen Congyang <wency@xxxxxxxxxxxxxx> CC: Yang Hongyang <yanghy@xxxxxxxxxxxxxx> --- tools/libxl/libxl.c | 6 +++-- tools/libxl/libxl_blktap2.c | 58 ++++++++++++++++++++++++++++++++++++-------- tools/libxl/libxl_dm.c | 3 ++- tools/libxl/libxl_internal.h | 3 ++- 4 files changed, 56 insertions(+), 14 deletions(-) diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c index debb20c..54a9fb7 100644 --- a/tools/libxl/libxl.c +++ b/tools/libxl/libxl.c @@ -2484,7 +2484,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->readwrite); if (!dev) { LOG(ERROR, "failed to get blktap devpath for %p\n", disk->pdev_path); @@ -3078,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->readwrite); 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 2053403..24939d7 100644 --- a/tools/libxl/libxl_blktap2.c +++ b/tools/libxl/libxl_blktap2.c @@ -23,26 +23,62 @@ int libxl__blktap_enabled(libxl__gc *gc) return !tap_ctl_check(&msg); } +static int tap_ctl_find(const char *type, const char *disk, tap_list_t *tap) +{ + int err; + struct list_head list = LIST_HEAD_INIT(list); + tap_list_t *entry; + + err = tap_ctl_list(&list); + if (err) + return err; + + err = ERROR_FAIL; + + tap_list_for_each_entry(entry, &list) { + if (type && (!entry->type || strcmp(entry->type, type))) + continue; + + if (disk && (!entry->path || strcmp(entry->path, disk))) + continue; + + tap->minor = entry->minor; + tap->pid = entry->pid; + err = 0; + break; + } + tap_ctl_list_free(&list); + + return err; +} + char *libxl__blktap_devpath(libxl__gc *gc, const char *disk, - libxl_disk_format format) + libxl_disk_format format, + int readwrite) { const char *type; char *params, *devname = NULL; - tap_list_t tap; int err; + int minor; + int flags; type = libxl__device_disk_string_of_format(format); - err = tap_ctl_find(type, disk, &tap); - if (err == 0) { - devname = libxl__sprintf(gc, "/dev/xen/blktap-2/tapdev%d", tap.minor); + + minor = tap_ctl_find_minor(type, disk); + if (minor >= 0) { + devname = libxl__sprintf(gc, "/dev/xen/blktap-2/tapdev%d", minor); if (devname) return devname; } params = libxl__sprintf(gc, "%s:%s", type, disk); - err = tap_ctl_create(params, &devname); + fprintf(stderr, "DEBUG %s %d %s\n", __func__, __LINE__, params); + flags = readwrite ? 0 : TAPDISK_MESSAGE_FLAG_RDONLY; + + err = tap_ctl_create(params, &devname, flags, -1, 0, 0); if (!err) { + fprintf(stderr, "DEBUG %s %d %s\n", __func__, __LINE__, devname); libxl__ptr_add(gc, devname); return devname; } @@ -55,7 +91,8 @@ int libxl__device_destroy_tapdisk(libxl__gc *gc, const char *params) { char *type, *disk; int err; - tap_list_t tap; + struct list_head list = LIST_HEAD_INIT(list); + tap_list_t tap = { .minor=-1, .pid=-1 }; type = libxl__strdup(gc, params); @@ -65,19 +102,20 @@ int libxl__device_destroy_tapdisk(libxl__gc *gc, const char *params) return ERROR_INVAL; } + fprintf(stderr, "DEBUG %s %d type=%s disk=%s\n",__func__,__LINE__,type,disk); *disk++ = '\0'; err = tap_ctl_find(type, disk, &tap); - if (err < 0) { + if (err) { /* 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); + err = tap_ctl_destroy(tap.pid, tap.minor, 1, NULL); if (err < 0) { LOGEV(ERROR, -err, "Failed to destroy tap device id %d minor %d", - tap.id, tap.minor); + tap.pid, tap.minor); return ERROR_FAIL; } diff --git a/tools/libxl/libxl_dm.c b/tools/libxl/libxl_dm.c index 30c1578..d13ef9e 100644 --- a/tools/libxl/libxl_dm.c +++ b/tools/libxl/libxl_dm.c @@ -835,7 +835,8 @@ static char ** libxl__build_device_model_args_new(libxl__gc *gc, if (disks[i].backend == LIBXL_DISK_BACKEND_TAP) { format = qemu_disk_format_string(LIBXL_DISK_FORMAT_RAW); pdev_path = libxl__blktap_devpath(gc, disks[i].pdev_path, - disks[i].format); + disks[i].format, + disks[i].readwrite); } else { pdev_path = disks[i].pdev_path; } diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h index 10d1252..46968f1 100644 --- a/tools/libxl/libxl_internal.h +++ b/tools/libxl/libxl_internal.h @@ -1574,7 +1574,8 @@ _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, + int readwrite); /* libxl__device_destroy_tapdisk: * Destroys any tapdisk process associated with the backend represented -- 1.9.1 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |