diff options
author | Keir Fraser <keir.fraser@citrix.com> | 2008-03-18 10:58:47 +0000 |
---|---|---|
committer | Keir Fraser <keir.fraser@citrix.com> | 2008-03-18 10:58:47 +0000 |
commit | 45b676a245020c41675e97fd6a5d5a629d110d0e (patch) | |
tree | 5351bb610bd772195d3f00cfc31dd8fe7c8b8819 /tools/blktap | |
parent | 566fa0e0bfb4a864e1d52cafd9bb5d6412792863 (diff) | |
download | xen-45b676a245020c41675e97fd6a5d5a629d110d0e.tar.gz xen-45b676a245020c41675e97fd6a5d5a629d110d0e.tar.bz2 xen-45b676a245020c41675e97fd6a5d5a629d110d0e.zip |
Use ioemu block drivers through blktap.
Add support for a tap:ioemu pseudo driver. Devices using this driver
won't use tapdisk (containing the code duplication) any more, but will
connect to the qemu-dm of the domain. In this way no working
configuration should be broken right now as you can still choose to
use the tapdisk drivers.
Signed-off-by: Kevin Wolf <kwolf@suse.de>
Diffstat (limited to 'tools/blktap')
-rw-r--r-- | tools/blktap/drivers/blktapctrl.c | 102 | ||||
-rw-r--r-- | tools/blktap/drivers/tapdisk.h | 12 | ||||
-rw-r--r-- | tools/blktap/lib/blktaplib.h | 10 |
3 files changed, 92 insertions, 32 deletions
diff --git a/tools/blktap/drivers/blktapctrl.c b/tools/blktap/drivers/blktapctrl.c index 8cbf185f03..8825e919c4 100644 --- a/tools/blktap/drivers/blktapctrl.c +++ b/tools/blktap/drivers/blktapctrl.c @@ -501,6 +501,80 @@ int launch_tapdisk(char *wrctldev, char *rdctldev) return 0; } +/* Connect to qemu-dm */ +static int connect_qemu(blkif_t *blkif) +{ + char *rdctldev, *wrctldev; + + if (asprintf(&rdctldev, BLKTAP_CTRL_DIR "/qemu-read-%d", + blkif->domid) < 0) + return -1; + + if (asprintf(&wrctldev, BLKTAP_CTRL_DIR "/qemu-write-%d", + blkif->domid) < 0) { + free(rdctldev); + return -1; + } + + DPRINTF("Using qemu blktap pipe: %s\n", rdctldev); + + blkif->fds[READ] = open_ctrl_socket(wrctldev); + blkif->fds[WRITE] = open_ctrl_socket(rdctldev); + + free(rdctldev); + free(wrctldev); + + if (blkif->fds[READ] == -1 || blkif->fds[WRITE] == -1) + return -1; + + DPRINTF("Attached to qemu blktap pipes\n"); + return 0; +} + +/* Launch tapdisk instance */ +static int connect_tapdisk(blkif_t *blkif, int minor) +{ + char *rdctldev = NULL, *wrctldev = NULL; + int ret = -1; + + DPRINTF("tapdisk process does not exist:\n"); + + if (asprintf(&rdctldev, + "%s/tapctrlread%d", BLKTAP_CTRL_DIR, minor) == -1) + goto fail; + + if (asprintf(&wrctldev, + "%s/tapctrlwrite%d", BLKTAP_CTRL_DIR, minor) == -1) + goto fail; + + blkif->fds[READ] = open_ctrl_socket(rdctldev); + blkif->fds[WRITE] = open_ctrl_socket(wrctldev); + + if (blkif->fds[READ] == -1 || blkif->fds[WRITE] == -1) + goto fail; + + /*launch the new process*/ + DPRINTF("Launching process, CMDLINE [tapdisk %s %s]\n", + wrctldev, rdctldev); + + if (launch_tapdisk(wrctldev, rdctldev) == -1) { + DPRINTF("Unable to fork, cmdline: [tapdisk %s %s]\n", + wrctldev, rdctldev); + goto fail; + } + + ret = 0; + +fail: + if (rdctldev) + free(rdctldev); + + if (wrctldev) + free(wrctldev); + + return ret; +} + int blktapctrl_new_blkif(blkif_t *blkif) { blkif_info_t *blk; @@ -524,30 +598,14 @@ int blktapctrl_new_blkif(blkif_t *blkif) blkif->cookie = next_cookie++; if (!exist) { - DPRINTF("Process does not exist:\n"); - if (asprintf(&rdctldev, - "%s/tapctrlread%d", BLKTAP_CTRL_DIR, minor) == -1) - goto fail; - if (asprintf(&wrctldev, - "%s/tapctrlwrite%d", BLKTAP_CTRL_DIR, minor) == -1) { - free(rdctldev); - goto fail; - } - blkif->fds[READ] = open_ctrl_socket(rdctldev); - blkif->fds[WRITE] = open_ctrl_socket(wrctldev); - - if (blkif->fds[READ] == -1 || blkif->fds[WRITE] == -1) - goto fail; - - /*launch the new process*/ - DPRINTF("Launching process, CMDLINE [tapdisk %s %s]\n",wrctldev, rdctldev); - if (launch_tapdisk(wrctldev, rdctldev) == -1) { - DPRINTF("Unable to fork, cmdline: [tapdisk %s %s]\n",wrctldev, rdctldev); - goto fail; + if (type == DISK_TYPE_IOEMU) { + if (connect_qemu(blkif)) + goto fail; + } else { + if (connect_tapdisk(blkif, minor)) + goto fail; } - free(rdctldev); - free(wrctldev); } else { DPRINTF("Process exists!\n"); blkif->fds[READ] = exist->fds[READ]; diff --git a/tools/blktap/drivers/tapdisk.h b/tools/blktap/drivers/tapdisk.h index 7b11d775de..77b7fd8c83 100644 --- a/tools/blktap/drivers/tapdisk.h +++ b/tools/blktap/drivers/tapdisk.h @@ -167,6 +167,7 @@ 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 */ @@ -230,6 +231,16 @@ static disk_info_t qcow2_disk = { #endif }; +static disk_info_t ioemu_disk = { + DISK_TYPE_IOEMU, + "ioemu disk", + "ioemu", + 0, +#ifdef TAPDISK + NULL +#endif +}; + /*Main disk info array */ static disk_info_t *dtypes[] = { &aio_disk, @@ -238,6 +249,7 @@ static disk_info_t *dtypes[] = { &ram_disk, &qcow_disk, &qcow2_disk, + &ioemu_disk, }; typedef struct driver_list_entry { diff --git a/tools/blktap/lib/blktaplib.h b/tools/blktap/lib/blktaplib.h index d31a7fac92..77aca53651 100644 --- a/tools/blktap/lib/blktaplib.h +++ b/tools/blktap/lib/blktaplib.h @@ -221,15 +221,5 @@ int xs_fire_next_watch(struct xs_handle *h); ((_req) * BLKIF_MAX_SEGMENTS_PER_REQUEST * getpagesize()) + \ ((_seg) * getpagesize())) -/* Defines that are only used by library clients */ - -#ifndef __COMPILING_BLKTAP_LIB - -static char *blkif_op_name[] = { - [BLKIF_OP_READ] = "READ", - [BLKIF_OP_WRITE] = "WRITE", -}; - -#endif /* __COMPILING_BLKTAP_LIB */ #endif /* __BLKTAPLIB_H__ */ |