File ioemu-blktap-fix-open.patch of Package xen

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
@@ -5416,6 +5416,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;
openSUSE Build Service is sponsored by