aboutsummaryrefslogtreecommitdiffstats
path: root/tools/blktap
diff options
context:
space:
mode:
authorKeir Fraser <keir.fraser@citrix.com>2008-03-18 10:58:47 +0000
committerKeir Fraser <keir.fraser@citrix.com>2008-03-18 10:58:47 +0000
commit45b676a245020c41675e97fd6a5d5a629d110d0e (patch)
tree5351bb610bd772195d3f00cfc31dd8fe7c8b8819 /tools/blktap
parent566fa0e0bfb4a864e1d52cafd9bb5d6412792863 (diff)
downloadxen-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.c102
-rw-r--r--tools/blktap/drivers/tapdisk.h12
-rw-r--r--tools/blktap/lib/blktaplib.h10
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__ */