xen/ioemu-blktap-fix-open.patch

107 lines
3.0 KiB
Diff

commit 51259318c6d40d5dd962c92c561826714361120a
Author: Kevin Wolf <kwolf@suse.de>
Date: Wed Jul 23 10:51:07 2008 +0200
qemu-xen: Fix open_disk for blktap disks
Signed-off-by: Kevin Wolf <kwolf@suse.de>
Index: xen-3.3.1-testing/tools/ioemu-remote/hw/xen_blktap.c
===================================================================
--- xen-3.3.1-testing.orig/tools/ioemu-remote/hw/xen_blktap.c
+++ xen-3.3.1-testing/tools/ioemu-remote/hw/xen_blktap.c
@@ -32,6 +32,11 @@
#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 *
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,
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: xen-3.3.1-testing/tools/ioemu-remote/hw/xen_blktap.h
===================================================================
--- xen-3.3.1-testing.orig/tools/ioemu-remote/hw/xen_blktap.h
+++ xen-3.3.1-testing/tools/ioemu-remote/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;
Index: xen-3.3.1-testing/tools/ioemu-remote/sysemu.h
===================================================================
--- xen-3.3.1-testing.orig/tools/ioemu-remote/sysemu.h
+++ xen-3.3.1-testing/tools/ioemu-remote/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;
Index: xen-3.3.1-testing/tools/ioemu-remote/vl.c
===================================================================
--- xen-3.3.1-testing.orig/tools/ioemu-remote/vl.c
+++ xen-3.3.1-testing/tools/ioemu-remote/vl.c
@@ -5414,6 +5414,9 @@ static int drive_init(struct drive_opt *
case IF_PFLASH:
case IF_MTD:
break;
+ case IF_BLKTAP:
+ /* Cannot happen - silence gcc warning */
+ break;
}
if (!file[0])
return 0;