]> xenbits.xensource.com Git - xenclient/ioemu.git/commitdiff
Fix open_disk for blktap disks to use real bdrv_new
authorIan Jackson <ian.jackson@eu.citrix.com>
Thu, 9 Oct 2008 13:50:51 +0000 (14:50 +0100)
committerIan Jackson <Ian.Jackson@eu.citrix.com>
Thu, 9 Oct 2008 13:50:51 +0000 (14:50 +0100)
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 <kwolf@suse.de>
hw/xen_blktap.c
hw/xen_blktap.h
sysemu.h
vl.c

index 3821aa44ff55ffbcd581e27785e61e6856f534ba..05478890db07c24f8913b0302136f1690869247d 100644 (file)
 #include <errno.h>
 #include <stdlib.h>
 
+#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;
 }
 
index 81f735f05a01783d79de2a1182952cf744feace4..92cc08efa5507a019d50cac2e92576266a0c728a 100644 (file)
@@ -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;
index 55b3ad64f6d899616fd92cc22d4e3af93ed424af..c294c12b9b5202dad42963bd3c70473580efacba 100644 (file)
--- 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 b97435f1f66bd73b28403b339ab64ce49741a6bf..182346af469228e9e67b6adf0f422a8f34b6e33d 100644 (file)
--- 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;