From 8b173f5236c351dc4d2ce9e542d0a97949344fc2 Mon Sep 17 00:00:00 2001 From: Keir Fraser Date: Thu, 12 Mar 2009 18:42:31 +0000 Subject: blktapctrl: Select backend by prefix This patch adds support for specifying the backend (tapdisk or ioemu) to blktapctrl. Images can be specified e.g. as tap:tapdisk:aio, tap:ioemu:qcow2 or tap:vmdk. When omitting the backend, a default is chosen based on the image type (currently always tapdisk because ioemu as a backend is broken until a follow-up patch series against qemu-xen is applied) Signed-off-by: Kevin Wolf --- tools/blktap/drivers/blktapctrl.c | 35 ++++++++++++++++++++++++++++++----- tools/blktap/drivers/tapdisk.h | 20 ++++++++------------ 2 files changed, 38 insertions(+), 17 deletions(-) (limited to 'tools/blktap') diff --git a/tools/blktap/drivers/blktapctrl.c b/tools/blktap/drivers/blktapctrl.c index b8a872bbbb..b7ee572837 100644 --- a/tools/blktap/drivers/blktapctrl.c +++ b/tools/blktap/drivers/blktapctrl.c @@ -148,7 +148,8 @@ static int get_tapdisk_pid(blkif_t *blkif) * return 0 on success, -1 on error. */ -static int test_path(char *path, char **dev, int *type, blkif_t **blkif) +static int test_path(char *path, char **dev, int *type, blkif_t **blkif, + int* use_ioemu) { char *ptr, handle[10]; int i, size, found = 0; @@ -158,6 +159,17 @@ static int test_path(char *path, char **dev, int *type, blkif_t **blkif) *type = MAX_DISK_TYPES + 1; *blkif = NULL; + if (!strncmp(path, "tapdisk:", strlen("tapdisk:"))) { + *use_ioemu = 0; + path += strlen("tapdisk:"); + } else if (!strncmp(path, "ioemu:", strlen("ioemu:"))) { + *use_ioemu = 1; + path += strlen("ioemu:"); + } else { + // Use the default for the image type + *use_ioemu = -1; + } + if ( (ptr = strstr(path, ":"))!=NULL) { handle_len = (ptr - path); memcpy(handle, path, handle_len); @@ -174,6 +186,8 @@ static int test_path(char *path, char **dev, int *type, blkif_t **blkif) } if (found) { + if (*use_ioemu == -1) + *use_ioemu = dtypes[i]->use_ioemu; *type = dtypes[i]->idnum; if (dtypes[i]->single_handler == 1) { @@ -185,6 +199,7 @@ static int test_path(char *path, char **dev, int *type, blkif_t **blkif) *blkif = active_disks[dtypes[i] ->idnum]->blkif; } + return 0; } } @@ -504,7 +519,8 @@ static int connect_qemu(blkif_t *blkif, int domid) static int tapdisk_ioemu_pid = 0; static int dom0_readfd = 0; static int dom0_writefd = 0; - + int refresh_pid = 0; + if (asprintf(&rdctldev, BLKTAP_CTRL_DIR "/qemu-read-%d", domid) < 0) return -1; @@ -523,15 +539,23 @@ static int connect_qemu(blkif_t *blkif, int domid) if (tapdisk_ioemu_pid == 0 || kill(tapdisk_ioemu_pid, 0)) { /* No device model and tapdisk-ioemu doesn't run yet */ DPRINTF("Launching tapdisk-ioemu\n"); - tapdisk_ioemu_pid = launch_tapdisk_ioemu(); + launch_tapdisk_ioemu(); dom0_readfd = open_ctrl_socket(wrctldev); dom0_writefd = open_ctrl_socket(rdctldev); + + refresh_pid = 1; } DPRINTF("Using tapdisk-ioemu connection\n"); blkif->fds[READ] = dom0_readfd; blkif->fds[WRITE] = dom0_writefd; + + if (refresh_pid) { + get_tapdisk_pid(blkif); + tapdisk_ioemu_pid = blkif->tappid; + } + } else if (access(rdctldev, R_OK | W_OK) == 0) { /* Use existing pipe to the device model */ DPRINTF("Using qemu-dm connection\n"); @@ -605,13 +629,14 @@ static int blktapctrl_new_blkif(blkif_t *blkif) image_t *image; blkif_t *exist = NULL; static uint16_t next_cookie = 0; + int use_ioemu; DPRINTF("Received a poll for a new vbd\n"); if ( ((blk=blkif->info) != NULL) && (blk->params != NULL) ) { if (blktap_interface_create(ctlfd, &major, &minor, blkif) < 0) return -1; - if (test_path(blk->params, &ptr, &type, &exist) != 0) { + if (test_path(blk->params, &ptr, &type, &exist, &use_ioemu) != 0) { DPRINTF("Error in blktap device string(%s).\n", blk->params); goto fail; @@ -620,7 +645,7 @@ static int blktapctrl_new_blkif(blkif_t *blkif) blkif->cookie = next_cookie++; if (!exist) { - if (type == DISK_TYPE_IOEMU) { + if (use_ioemu) { if (connect_qemu(blkif, blkif->domid)) goto fail; } else { diff --git a/tools/blktap/drivers/tapdisk.h b/tools/blktap/drivers/tapdisk.h index 22450ff03b..38f3c40fa6 100644 --- a/tools/blktap/drivers/tapdisk.h +++ b/tools/blktap/drivers/tapdisk.h @@ -145,6 +145,8 @@ typedef struct disk_info { char handle[10]; /* xend handle, e.g. 'ram' */ int single_handler; /* is there a single controller for all */ /* instances of disk type? */ + int use_ioemu; /* backend provider: 0 = tapdisk; 1 = ioemu */ + #ifdef TAPDISK struct tap_disk *drv; #endif @@ -167,7 +169,6 @@ extern struct tap_disk tapdisk_qcow2; #define DISK_TYPE_RAM 3 #define DISK_TYPE_QCOW 4 #define DISK_TYPE_QCOW2 5 -#define DISK_TYPE_IOEMU 6 /*Define Individual Disk Parameters here */ @@ -176,6 +177,7 @@ static disk_info_t aio_disk = { "raw image (aio)", "aio", 0, + 0, #ifdef TAPDISK &tapdisk_aio, #endif @@ -186,6 +188,7 @@ static disk_info_t sync_disk = { "raw image (sync)", "sync", 0, + 0, #ifdef TAPDISK &tapdisk_sync, #endif @@ -196,6 +199,7 @@ static disk_info_t vmdk_disk = { "vmware image (vmdk)", "vmdk", 1, + 0, #ifdef TAPDISK &tapdisk_vmdk, #endif @@ -206,6 +210,7 @@ static disk_info_t ram_disk = { "ramdisk image (ram)", "ram", 1, + 0, #ifdef TAPDISK &tapdisk_ram, #endif @@ -216,6 +221,7 @@ static disk_info_t qcow_disk = { "qcow disk (qcow)", "qcow", 0, + 0, #ifdef TAPDISK &tapdisk_qcow, #endif @@ -226,21 +232,12 @@ static disk_info_t qcow2_disk = { "qcow2 disk (qcow2)", "qcow2", 0, + 0, #ifdef TAPDISK &tapdisk_qcow2, #endif }; -static disk_info_t ioemu_disk = { - DISK_TYPE_IOEMU, - "ioemu disk", - "ioemu", - 1, -#ifdef TAPDISK - NULL -#endif -}; - /*Main disk info array */ static disk_info_t *dtypes[] = { &aio_disk, @@ -249,7 +246,6 @@ static disk_info_t *dtypes[] = { &ram_disk, &qcow_disk, &qcow2_disk, - &ioemu_disk, }; typedef struct driver_list_entry { -- cgit v1.2.3