Index: xen-3.3.0-testing/tools/blktap/drivers/tapdisk.h =================================================================== --- xen-3.3.0-testing.orig/tools/blktap/drivers/tapdisk.h +++ xen-3.3.0-testing/tools/blktap/drivers/tapdisk.h @@ -159,16 +159,6 @@ extern struct tap_disk tapdisk_ram; extern struct tap_disk tapdisk_qcow; extern struct tap_disk tapdisk_qcow2; -#define MAX_DISK_TYPES 20 - -#define DISK_TYPE_AIO 0 -#define DISK_TYPE_SYNC 1 -#define DISK_TYPE_VMDK 2 -#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 */ static disk_info_t aio_disk = { Index: xen-3.3.0-testing/tools/blktap/lib/blktaplib.h =================================================================== --- xen-3.3.0-testing.orig/tools/blktap/lib/blktaplib.h +++ xen-3.3.0-testing/tools/blktap/lib/blktaplib.h @@ -211,6 +211,17 @@ typedef struct msg_pid { #define CTLMSG_PID 9 #define CTLMSG_PID_RSP 10 +/* disk driver types */ +#define MAX_DISK_TYPES 20 + +#define DISK_TYPE_AIO 0 +#define DISK_TYPE_SYNC 1 +#define DISK_TYPE_VMDK 2 +#define DISK_TYPE_RAM 3 +#define DISK_TYPE_QCOW 4 +#define DISK_TYPE_QCOW2 5 +#define DISK_TYPE_IOEMU 6 + /* xenstore/xenbus: */ #define DOMNAME "Domain-0" int setup_probe_watch(struct xs_handle *h); Index: xen-3.3.0-testing/tools/ioemu-remote/hw/xen_blktap.c =================================================================== --- xen-3.3.0-testing.orig/tools/ioemu-remote/hw/xen_blktap.c +++ xen-3.3.0-testing/tools/ioemu-remote/hw/xen_blktap.c @@ -222,9 +222,10 @@ static int map_new_dev(struct td_state * return -1; } -static int open_disk(struct td_state *s, char *path, int readonly) +static int open_disk(struct td_state *s, char *path, int driver, int readonly) { BlockDriverState* bs; + BlockDriver* drv; char* devname; static int devnumber = 0; int i; @@ -234,7 +235,22 @@ static int open_disk(struct td_state *s, bs = bdrv_new(devname); free(devname); - if (bdrv_open(bs, path, 0) != 0) { + /* Search for disk driver */ + for (i = 0; blktap_drivers[i].idnum >= 0; i++) { + if (blktap_drivers[i].idnum == driver) + break; + } + + if (blktap_drivers[i].idnum < 0) { + fprintf(stderr, "Could not find image format id %d\n", driver); + return -ENOMEM; + } + + drv = blktap_drivers[i].drv; + DPRINTF("%s driver specified\n", drv ? drv->format_name : "No"); + + /* Open the image */ + if (bdrv_open2(bs, path, 0, drv) != 0) { fprintf(stderr, "Could not open image file %s\n", path); return -ENOMEM; } @@ -529,7 +545,7 @@ static void handle_blktap_ctrlmsg(void* s = state_init(); /*Open file*/ - if (s == NULL || open_disk(s, path, msg->readonly)) { + if (s == NULL || open_disk(s, path, msg->drivertype, msg->readonly)) { msglen = sizeof(msg_hdr_t); msg->type = CTLMSG_IMG_FAIL; msg->len = msglen; Index: xen-3.3.0-testing/tools/ioemu-remote/hw/xen_blktap.h =================================================================== --- xen-3.3.0-testing.orig/tools/ioemu-remote/hw/xen_blktap.h +++ xen-3.3.0-testing/tools/ioemu-remote/hw/xen_blktap.h @@ -50,4 +50,19 @@ typedef struct fd_list_entry { struct fd_list_entry **pprev, *next; } fd_list_entry_t; +typedef struct disk_info { + int idnum; + struct BlockDriver *drv; +} disk_info_t; + +static disk_info_t blktap_drivers[] = { + { DISK_TYPE_AIO, &bdrv_raw }, + { DISK_TYPE_SYNC, &bdrv_raw }, + { DISK_TYPE_VMDK, &bdrv_vmdk }, + { DISK_TYPE_QCOW, &bdrv_qcow }, + { DISK_TYPE_QCOW2, &bdrv_qcow2 }, + { DISK_TYPE_IOEMU, NULL }, + { -1, NULL } +}; + #endif /*XEN_BLKTAP_H_*/