From: Ian Jackson Date: Thu, 9 Oct 2008 13:50:51 +0000 (+0100) Subject: Fix open_disk for blktap disks to use real bdrv_new X-Git-Tag: t.master-before-merge~75 X-Git-Url: http://xenbits.xensource.com/gitweb?a=commitdiff_plain;h=c7e7d60b18b9aa26cb29d925e956faadf5d31ad8;p=qemu-xen-4.5-testing.git Fix open_disk for blktap disks to use real bdrv_new If blktap drives are registered properly, qemu code is much less likely to get confused by them. Use bdrv_new(), assign a device name and create an entry in drives_table for them. Signed-off-by: Kevin Wolf --- diff --git a/hw/xen_blktap.c b/hw/xen_blktap.c index 3821aa44f..05478890d 100644 --- a/hw/xen_blktap.c +++ b/hw/xen_blktap.c @@ -32,6 +32,11 @@ #include #include +#ifndef QEMU_TOOL +#include "qemu-common.h" +#include "sysemu.h" +#endif + #include "xen_blktap.h" #include "block_int.h" #include "qemu-char.h" @@ -217,13 +222,15 @@ static int map_new_dev(struct td_state *s, int minor) static int open_disk(struct td_state *s, char *path, int readonly) { - struct disk_id id; BlockDriverState* bs; + char* devname; + static int devnumber = 0; + int i; - DPRINTF("Opening %s\n", path); - bs = calloc(1, sizeof(*bs)); - - memset(&id, 0, sizeof(struct disk_id)); + DPRINTF("Opening %s as blktap%d\n", path, devnumber); + asprintf(&devname, "blktap%d", devnumber++); + bs = bdrv_new(devname); + free(devname); if (bdrv_open(bs, path, 0) != 0) { fprintf(stderr, "Could not open image file %s\n", path); @@ -237,6 +244,18 @@ static int open_disk(struct td_state *s, char *path, int readonly) s->info = ((s->flags & TD_RDONLY) ? VDISK_READONLY : 0); +#ifndef QEMU_TOOL + for (i = 0; i < MAX_DRIVES + 1; i++) { + if (drives_table[i].bdrv == NULL) { + drives_table[i].bdrv = bs; + drives_table[i].type = IF_BLKTAP; + drives_table[i].bus = 0; + drives_table[i].unit = 0; + break; + } + } +#endif + return 0; } diff --git a/hw/xen_blktap.h b/hw/xen_blktap.h index 81f735f05..92cc08efa 100644 --- a/hw/xen_blktap.h +++ b/hw/xen_blktap.h @@ -30,11 +30,6 @@ typedef uint32_t td_flag_t; #define TD_RDONLY 1 -struct disk_id { - char *name; - int drivertype; -}; - /* This structure represents the state of an active virtual disk. */ struct td_state { BlockDriverState* bs; diff --git a/sysemu.h b/sysemu.h index 55b3ad64f..c294c12b9 100644 --- a/sysemu.h +++ b/sysemu.h @@ -116,6 +116,7 @@ extern unsigned int nb_prom_envs; #endif typedef enum { + IF_BLKTAP, IF_IDE, IF_SCSI, IF_FLOPPY, IF_PFLASH, IF_MTD, IF_SD } BlockInterfaceType; diff --git a/vl.c b/vl.c index b97435f1f..182346af4 100644 --- a/vl.c +++ b/vl.c @@ -5408,6 +5408,9 @@ static int drive_init(struct drive_opt *arg, int snapshot, case IF_PFLASH: case IF_MTD: break; + case IF_BLKTAP: + /* Cannot happen - silence gcc warning */ + break; } if (!file[0]) return 0;