[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-devel] [PATCH 1/4] 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@xxxxxxx>
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@xxxxxxx>

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):
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.