Index: xen-3.3.1-testing/tools/blktap/drivers/blktapctrl.c =================================================================== --- xen-3.3.1-testing.orig/tools/blktap/drivers/blktapctrl.c +++ xen-3.3.1-testing/tools/blktap/drivers/blktapctrl.c @@ -65,6 +65,8 @@ #define MAX_RAND_VAL 0xFFFF #define MAX_ATTEMPTS 10 +#undef ALWAYS_USE_IOEMU + int run = 1; int max_timeout = MAX_TIMEOUT; int ctlfd = 0; @@ -148,7 +150,8 @@ static int get_tapdisk_pid(blkif_t *blki * 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; @@ -174,6 +177,7 @@ static int test_path(char *path, char ** } if (found) { + *use_ioemu = dtypes[i]->use_ioemu; *type = dtypes[i]->idnum; if (dtypes[i]->single_handler == 1) { @@ -185,6 +189,7 @@ static int test_path(char *path, char ** *blkif = active_disks[dtypes[i] ->idnum]->blkif; } + return 0; } } @@ -474,6 +479,7 @@ static int launch_tapdisk_provider(char return child; } +#ifndef ALWAYS_USE_IOEMU static int launch_tapdisk(char *wrctldev, char *rdctldev) { char *argv[] = { "tapdisk", wrctldev, rdctldev, NULL }; @@ -483,6 +489,7 @@ static int launch_tapdisk(char *wrctldev return 0; } +#endif static int launch_tapdisk_ioemu(void) { @@ -505,7 +512,8 @@ static int connect_qemu(blkif_t *blkif, 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; @@ -524,15 +532,23 @@ static int connect_qemu(blkif_t *blkif, 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"); @@ -554,6 +570,7 @@ static int connect_qemu(blkif_t *blkif, return 0; } +#ifndef ALWAYS_USE_IOEMU /* Launch tapdisk instance */ static int connect_tapdisk(blkif_t *blkif, int minor) { @@ -597,6 +614,7 @@ fail: return ret; } +#endif static int blktapctrl_new_blkif(blkif_t *blkif) { @@ -606,13 +624,14 @@ static int blktapctrl_new_blkif(blkif_t 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; @@ -621,13 +640,18 @@ static int blktapctrl_new_blkif(blkif_t blkif->cookie = next_cookie++; if (!exist) { - if (type == DISK_TYPE_IOEMU) { +#ifdef ALWAYS_USE_IOEMU + if (connect_qemu(blkif, blkif->domid)) + goto fail; +#else + if (use_ioemu) { if (connect_qemu(blkif, blkif->domid)) goto fail; } else { if (connect_tapdisk(blkif, minor)) goto fail; } +#endif } else { DPRINTF("Process exists!\n"); Index: xen-3.3.1-testing/tools/blktap/drivers/tapdisk.h =================================================================== --- xen-3.3.1-testing.orig/tools/blktap/drivers/tapdisk.h +++ xen-3.3.1-testing/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 @@ -166,6 +168,7 @@ static disk_info_t aio_disk = { "raw image (aio)", "aio", 0, + 1, #ifdef TAPDISK &tapdisk_aio, #endif @@ -176,6 +179,7 @@ static disk_info_t sync_disk = { "raw image (sync)", "sync", 0, + 1, #ifdef TAPDISK &tapdisk_sync, #endif @@ -186,6 +190,7 @@ static disk_info_t vmdk_disk = { "vmware image (vmdk)", "vmdk", 1, + 1, #ifdef TAPDISK &tapdisk_vmdk, #endif @@ -196,6 +201,7 @@ static disk_info_t ram_disk = { "ramdisk image (ram)", "ram", 1, + 0, #ifdef TAPDISK &tapdisk_ram, #endif @@ -206,6 +212,7 @@ static disk_info_t qcow_disk = { "qcow disk (qcow)", "qcow", 0, + 1, #ifdef TAPDISK &tapdisk_qcow, #endif @@ -216,6 +223,7 @@ static disk_info_t qcow2_disk = { "qcow2 disk (qcow2)", "qcow2", 0, + 1, #ifdef TAPDISK &tapdisk_qcow2, #endif @@ -226,6 +234,7 @@ static disk_info_t ioemu_disk = { "ioemu disk", "ioemu", 1, + 1, #ifdef TAPDISK NULL #endif