All of lore.kernel.org
 help / color / mirror / Atom feed
From: Kevin Wolf <kwolf@suse.de>
To: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
Cc: Jim Fehlig <jfehlig@novell.com>
Subject: [PATCH 1/4] blktapctrl: Select backend by prefix
Date: Thu, 12 Mar 2009 19:31:08 +0100	[thread overview]
Message-ID: <49B954EC.6040107@suse.de> (raw)
In-Reply-To: <49B9544C.4030006@suse.de>

[-- Attachment #1: Type: text/plain, Size: 400 bytes --]

This patch adds support for specifying the backend (tapdisk or ioemu)
to blktapctrl. Images can be specified e.g. as tap:tapdisk:aio,
tap:ioemu:qcow2 or tap:vmdk. When omitting the backend, a default is
chosen based on the image type (currently always tapdisk because ioemu
as a backend is broken until a follow-up patch series against qemu-xen
is applied)

Signed-off-by: Kevin Wolf <kwolf@suse.de>

[-- Attachment #2: blktapctrl-select-backend.patch --]
[-- Type: text/x-patch, Size: 6490 bytes --]

blktapctrl: Select backend by prefix

This patch adds support for specifying the backend (tapdisk or ioemu)
to blktapctrl. Images can be specified e.g. as tap:tapdisk:aio,
tap:ioemu:qcow2 or tap:vmdk. When omitting the backend, a default is
chosen based on the image type (currently always tapdisk because ioemu
as a backend is broken until a follow-up patch series against qemu-xen
is applied)

Signed-off-by: Kevin Wolf <kwolf@suse.de>

Index: xen-unstable.hg/tools/blktap/drivers/blktapctrl.c
===================================================================
--- xen-unstable.hg.orig/tools/blktap/drivers/blktapctrl.c
+++ xen-unstable.hg/tools/blktap/drivers/blktapctrl.c
@@ -148,7 +148,8 @@ static int get_tapdisk_pid(blkif_t *blki
  *   return 0 on success, -1 on error.
  */
 
-static int test_path(char *path, char **dev, int *type, blkif_t **blkif)
+static int test_path(char *path, char **dev, int *type, blkif_t **blkif,
+	int* use_ioemu)
 {
 	char *ptr, handle[10];
 	int i, size, found = 0;
@@ -158,6 +159,17 @@ static int test_path(char *path, char **
 	*type = MAX_DISK_TYPES + 1;
         *blkif = NULL;
 
+	if (!strncmp(path, "tapdisk:", strlen("tapdisk:"))) {
+		*use_ioemu = 0;
+		path += strlen("tapdisk:");
+	} else if (!strncmp(path, "ioemu:", strlen("ioemu:"))) {
+		*use_ioemu = 1;
+		path += strlen("ioemu:");
+	} else {
+		// Use the default for the image type
+		*use_ioemu = -1;
+	}
+
 	if ( (ptr = strstr(path, ":"))!=NULL) {
 		handle_len = (ptr - path);
 		memcpy(handle, path, handle_len);
@@ -174,6 +186,8 @@ static int test_path(char *path, char **
                         }
 
 			if (found) {
+				if (*use_ioemu == -1)
+					*use_ioemu = dtypes[i]->use_ioemu;
 				*type = dtypes[i]->idnum;
                         
                         if (dtypes[i]->single_handler == 1) {
@@ -185,6 +199,7 @@ static int test_path(char *path, char **
                                         *blkif = active_disks[dtypes[i]
                                                              ->idnum]->blkif;
                         }
+
                         return 0;
                 }
             }
@@ -504,7 +519,8 @@ static int connect_qemu(blkif_t *blkif,
 	static int tapdisk_ioemu_pid = 0;
 	static int dom0_readfd = 0;
 	static int dom0_writefd = 0;
-	
+	int refresh_pid = 0;
+
 	if (asprintf(&rdctldev, BLKTAP_CTRL_DIR "/qemu-read-%d", domid) < 0)
 		return -1;
 
@@ -523,15 +539,23 @@ static int connect_qemu(blkif_t *blkif,
 		if (tapdisk_ioemu_pid == 0 || kill(tapdisk_ioemu_pid, 0)) {
 			/* No device model and tapdisk-ioemu doesn't run yet */
 			DPRINTF("Launching tapdisk-ioemu\n");
-			tapdisk_ioemu_pid = launch_tapdisk_ioemu();
+			launch_tapdisk_ioemu();
 			
 			dom0_readfd = open_ctrl_socket(wrctldev);
 			dom0_writefd = open_ctrl_socket(rdctldev);
+
+			refresh_pid = 1;
 		}
 
 		DPRINTF("Using tapdisk-ioemu connection\n");
 		blkif->fds[READ] = dom0_readfd;
 		blkif->fds[WRITE] = dom0_writefd;
+
+		if (refresh_pid) {
+			get_tapdisk_pid(blkif);
+			tapdisk_ioemu_pid = blkif->tappid;
+		}
+
 	} else if (access(rdctldev, R_OK | W_OK) == 0) {
 		/* Use existing pipe to the device model */
 		DPRINTF("Using qemu-dm connection\n");
@@ -605,13 +629,14 @@ static int blktapctrl_new_blkif(blkif_t
 	image_t *image;
 	blkif_t *exist = NULL;
 	static uint16_t next_cookie = 0;
+	int use_ioemu;
 
 	DPRINTF("Received a poll for a new vbd\n");
 	if ( ((blk=blkif->info) != NULL) && (blk->params != NULL) ) {
 		if (blktap_interface_create(ctlfd, &major, &minor, blkif) < 0)
 			return -1;
 
-		if (test_path(blk->params, &ptr, &type, &exist) != 0) {
+		if (test_path(blk->params, &ptr, &type, &exist, &use_ioemu) != 0) {
                         DPRINTF("Error in blktap device string(%s).\n",
                                 blk->params);
                         goto fail;
@@ -620,7 +645,7 @@ static int blktapctrl_new_blkif(blkif_t
 		blkif->cookie = next_cookie++;
 
 		if (!exist) {
-			if (type == DISK_TYPE_IOEMU) {
+			if (use_ioemu) {
 				if (connect_qemu(blkif, blkif->domid))
 					goto fail;
 			} else {
Index: xen-unstable.hg/tools/blktap/drivers/tapdisk.h
===================================================================
--- xen-unstable.hg.orig/tools/blktap/drivers/tapdisk.h
+++ xen-unstable.hg/tools/blktap/drivers/tapdisk.h
@@ -145,6 +145,8 @@ typedef struct disk_info {
 	char handle[10];     /* xend handle, e.g. 'ram' */
 	int  single_handler; /* is there a single controller for all */
 	                     /* instances of disk type? */
+	int  use_ioemu;      /* backend provider: 0 = tapdisk; 1 = ioemu */
+
 #ifdef TAPDISK
 	struct tap_disk *drv;	
 #endif
@@ -167,7 +169,6 @@ extern struct tap_disk tapdisk_qcow2;
 #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 */
@@ -176,6 +177,7 @@ static disk_info_t aio_disk = {
 	"raw image (aio)",
 	"aio",
 	0,
+	0,
 #ifdef TAPDISK
 	&tapdisk_aio,
 #endif
@@ -186,6 +188,7 @@ static disk_info_t sync_disk = {
 	"raw image (sync)",
 	"sync",
 	0,
+	0,
 #ifdef TAPDISK
 	&tapdisk_sync,
 #endif
@@ -196,6 +199,7 @@ static disk_info_t vmdk_disk = {
 	"vmware image (vmdk)",
 	"vmdk",
 	1,
+	0,
 #ifdef TAPDISK
 	&tapdisk_vmdk,
 #endif
@@ -206,6 +210,7 @@ static disk_info_t ram_disk = {
 	"ramdisk image (ram)",
 	"ram",
 	1,
+	0,
 #ifdef TAPDISK
 	&tapdisk_ram,
 #endif
@@ -216,6 +221,7 @@ static disk_info_t qcow_disk = {
 	"qcow disk (qcow)",
 	"qcow",
 	0,
+	0,
 #ifdef TAPDISK
 	&tapdisk_qcow,
 #endif
@@ -226,21 +232,12 @@ static disk_info_t qcow2_disk = {
 	"qcow2 disk (qcow2)",
 	"qcow2",
 	0,
+	0,
 #ifdef TAPDISK
 	&tapdisk_qcow2,
 #endif
 };
 
-static disk_info_t ioemu_disk = {
-	DISK_TYPE_IOEMU,
-	"ioemu disk",
-	"ioemu",
-	1,
-#ifdef TAPDISK
-	NULL
-#endif
-};
-
 /*Main disk info array */
 static disk_info_t *dtypes[] = {
 	&aio_disk,
@@ -249,7 +246,6 @@ static disk_info_t *dtypes[] = {
 	&ram_disk,
 	&qcow_disk,
 	&qcow2_disk,
-	&ioemu_disk,
 };
 
 typedef struct driver_list_entry {
Index: xen-unstable.hg/tools/python/xen/xend/server/BlktapController.py
===================================================================
--- xen-unstable.hg.orig/tools/python/xen/xend/server/BlktapController.py
+++ xen-unstable.hg/tools/python/xen/xend/server/BlktapController.py
@@ -15,7 +15,8 @@ blktap_disk_types = [
     'qcow',
     'qcow2',
 
-    'ioemu'
+    'ioemu',
+    'tapdisk',
     ]
 
 class BlktapController(BlkifController):

[-- Attachment #3: Type: text/plain, Size: 138 bytes --]

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

  reply	other threads:[~2009-03-12 18:31 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-03-12 18:28 [PATCH 0/4] Various blktap related patches (xen part) Kevin Wolf
2009-03-12 18:31 ` Kevin Wolf [this message]
2009-03-12 18:32 ` [PATCH 2/4] blktap: Export disk type constants for ioemu Kevin Wolf
2009-03-12 18:33 ` [PATCH 3/4] blktapctrl: Fix too early close of pipes Kevin Wolf
2009-03-12 18:33 ` [PATCH 4/4] blktap: Move error signaling to blktapctrl Kevin Wolf

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=49B954EC.6040107@suse.de \
    --to=kwolf@suse.de \
    --cc=jfehlig@novell.com \
    --cc=xen-devel@lists.xensource.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.