aboutsummaryrefslogtreecommitdiffstats
path: root/tools/blktap
diff options
context:
space:
mode:
authorKeir Fraser <keir.fraser@citrix.com>2008-07-14 10:03:09 +0100
committerKeir Fraser <keir.fraser@citrix.com>2008-07-14 10:03:09 +0100
commit121068a2ce684723ea7b6aca4b5c15b418c86784 (patch)
tree96069b9ab6d9dd377c1841dba863d18506bc5d3a /tools/blktap
parent658d12570b21a7929d0712c2d5c4f916f390592c (diff)
downloadxen-121068a2ce684723ea7b6aca4b5c15b418c86784.tar.gz
xen-121068a2ce684723ea7b6aca4b5c15b418c86784.tar.bz2
xen-121068a2ce684723ea7b6aca4b5c15b418c86784.zip
blktap: portability cleanup
Signed-off-by: Christoph Egger <Christoph.Egger@amd.com>
Diffstat (limited to 'tools/blktap')
-rw-r--r--tools/blktap/drivers/Makefile7
-rw-r--r--tools/blktap/drivers/blktapctrl.c113
-rw-r--r--tools/blktap/drivers/blktapctrl.h23
-rw-r--r--tools/blktap/drivers/blktapctrl_linux.c109
4 files changed, 146 insertions, 106 deletions
diff --git a/tools/blktap/drivers/Makefile b/tools/blktap/drivers/Makefile
index b1f4410cc9..7c3e088bf1 100644
--- a/tools/blktap/drivers/Makefile
+++ b/tools/blktap/drivers/Makefile
@@ -36,11 +36,14 @@ BLK-OBJS-y += block-qcow.o
BLK-OBJS-y += block-qcow2.o
BLK-OBJS-y += aes.o
BLK-OBJS-y += tapaio.o
-BLK-OBJS-$(CONFIG_Linux) += blk_linux.c
+BLK-OBJS-$(CONFIG_Linux) += blk_linux.o
+
+BLKTAB-OBJS-y := blktapctrl.o
+BLKTAB-OBJS-$(CONFIG_Linux) += blktapctrl_linux.o
all: $(IBIN) qcow-util
-blktapctrl: blktapctrl.o
+blktapctrl: $(BLKTAB-OBJS-y)
$(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS) $(LDFLAGS_blktapctrl)
tapdisk: tapdisk.o $(BLK-OBJS-y)
diff --git a/tools/blktap/drivers/blktapctrl.c b/tools/blktap/drivers/blktapctrl.c
index 5030156e34..b8a872bbbb 100644
--- a/tools/blktap/drivers/blktapctrl.c
+++ b/tools/blktap/drivers/blktapctrl.c
@@ -37,7 +37,6 @@
#include <stdio.h>
#include <stdlib.h>
#include <sys/mman.h>
-#include <sys/stat.h>
#include <err.h>
#include <errno.h>
#include <sys/types.h>
@@ -77,6 +76,32 @@ static int write_msg(int fd, int msgtype, void *ptr, void *ptr2);
static int read_msg(int fd, int msgtype, void *ptr);
static driver_list_entry_t *active_disks[MAX_DISK_TYPES];
+
+static unsigned long long tapdisk_get_size(blkif_t *blkif)
+{
+ image_t *img = (image_t *)blkif->prv;
+ return img->size;
+}
+
+static unsigned long tapdisk_get_secsize(blkif_t *blkif)
+{
+ image_t *img = (image_t *)blkif->prv;
+ return img->secsize;
+}
+
+static unsigned int tapdisk_get_info(blkif_t *blkif)
+{
+ image_t *img = (image_t *)blkif->prv;
+ return img->info;
+}
+
+struct blkif_ops tapdisk_ops = {
+ .get_size = tapdisk_get_size,
+ .get_secsize = tapdisk_get_secsize,
+ .get_info = tapdisk_get_info,
+};
+
+
static void init_driver_list(void)
{
int i;
@@ -97,74 +122,6 @@ static void init_rng(void)
return;
}
-static void make_blktap_dev(char *devname, int major, int minor)
-{
- struct stat st;
-
- if (lstat(devname, &st) != 0) {
- /*Need to create device*/
- if (mkdir(BLKTAP_DEV_DIR, 0755) == 0)
- DPRINTF("Created %s directory\n",BLKTAP_DEV_DIR);
- if (mknod(devname, S_IFCHR|0600,
- makedev(major, minor)) == 0)
- DPRINTF("Created %s device\n",devname);
- } else {
- DPRINTF("%s device already exists\n",devname);
- /* it already exists, but is it the same major number */
- if (((st.st_rdev>>8) & 0xff) != major) {
- DPRINTF("%s has old major %d\n",
- devname,
- (unsigned int)((st.st_rdev >> 8) & 0xff));
- /* only try again if we succed in deleting it */
- if (!unlink(devname))
- make_blktap_dev(devname, major, minor);
- }
- }
-}
-
-static int get_new_dev(int *major, int *minor, blkif_t *blkif)
-{
- domid_translate_t tr;
- domid_translate_ext_t tr_ext;
- int ret;
- char *devname;
-
- if (blkif->be_id >= (1<<28)) {
- /* new-style backend-id, so use the extended structure */
- tr_ext.domid = blkif->domid;
- tr_ext.busid = blkif->be_id;
- ret = ioctl(ctlfd, BLKTAP_IOCTL_NEWINTF_EXT, &tr_ext);
- DPRINTF("Sent domid %d and be_id %d\n", tr_ext.domid,
- tr_ext.busid);
- }
- else {
- /* old-style backend-id; use the old structure */
- tr.domid = blkif->domid;
- tr.busid = (unsigned short)blkif->be_id;
- ret = ioctl(ctlfd, BLKTAP_IOCTL_NEWINTF, tr);
- DPRINTF("Sent domid %d and be_id %d\n", tr.domid, tr.busid);
- }
-
- if ( (ret <= 0)||(ret > MAX_TAP_DEV) ) {
- DPRINTF("Incorrect Dev ID [%d]\n",ret);
- return -1;
- }
-
- *minor = ret;
- *major = ioctl(ctlfd, BLKTAP_IOCTL_MAJOR, ret );
- if (*major < 0) {
- DPRINTF("Incorrect Major ID [%d]\n",*major);
- return -1;
- }
-
- if (asprintf(&devname,"%s/%s%d",BLKTAP_DEV_DIR, BLKTAP_DEV_NAME, *minor) == -1)
- return -1;
- make_blktap_dev(devname,*major,*minor);
- DPRINTF("Received device id %d and major %d\n",
- *minor, *major);
- return 0;
-}
-
static int get_tapdisk_pid(blkif_t *blkif)
{
int ret;
@@ -651,7 +608,7 @@ static int blktapctrl_new_blkif(blkif_t *blkif)
DPRINTF("Received a poll for a new vbd\n");
if ( ((blk=blkif->info) != NULL) && (blk->params != NULL) ) {
- if (get_new_dev(&major, &minor, blkif)<0)
+ if (blktap_interface_create(ctlfd, &major, &minor, blkif) < 0)
return -1;
if (test_path(blk->params, &ptr, &type, &exist) != 0) {
@@ -843,22 +800,12 @@ int main(int argc, char *argv[])
register_new_devmap_hook(map_new_blktapctrl);
register_new_unmap_hook(unmap_blktapctrl);
- /* Attach to blktap0 */
- if (asprintf(&devname,"%s/%s0", BLKTAP_DEV_DIR, BLKTAP_DEV_NAME) == -1)
- goto open_failed;
- if ((ret = xc_find_device_number("blktap0")) < 0) {
- DPRINTF("couldn't find device number for 'blktap0'\n");
- goto open_failed;
- }
- blktap_major = major(ret);
- make_blktap_dev(devname,blktap_major,0);
- ctlfd = open(devname, O_RDWR);
- if (ctlfd == -1) {
- DPRINTF("blktap0 open failed\n");
+ ctlfd = blktap_interface_open();
+ if (ctlfd < 0) {
+ DPRINTF("couldn't open blktap interface\n");
goto open_failed;
}
-
retry:
/* Set up store connection and watch. */
h = xs_daemon_open();
diff --git a/tools/blktap/drivers/blktapctrl.h b/tools/blktap/drivers/blktapctrl.h
index ddcb967533..4512807c70 100644
--- a/tools/blktap/drivers/blktapctrl.h
+++ b/tools/blktap/drivers/blktapctrl.h
@@ -30,26 +30,7 @@
*/
-static inline unsigned long long tapdisk_get_size(blkif_t *blkif)
-{
- image_t *img = (image_t *)blkif->prv;
- return img->size;
-}
+int blktap_interface_open(void);
-static inline unsigned long tapdisk_get_secsize(blkif_t *blkif)
-{
- image_t *img = (image_t *)blkif->prv;
- return img->secsize;
-}
+int blktap_interface_create(int ctlfd, int *major, int *minor, blkif_t *blkif);
-static inline unsigned int tapdisk_get_info(blkif_t *blkif)
-{
- image_t *img = (image_t *)blkif->prv;
- return img->info;
-}
-
-struct blkif_ops tapdisk_ops = {
- .get_size = tapdisk_get_size,
- .get_secsize = tapdisk_get_secsize,
- .get_info = tapdisk_get_info,
-};
diff --git a/tools/blktap/drivers/blktapctrl_linux.c b/tools/blktap/drivers/blktapctrl_linux.c
new file mode 100644
index 0000000000..7977873577
--- /dev/null
+++ b/tools/blktap/drivers/blktapctrl_linux.c
@@ -0,0 +1,109 @@
+
+#include <stdio.h>
+#include <fcntl.h>
+#include <sys/stat.h>
+#include <sys/ioctl.h>
+
+#include "tapdisk.h"
+#include "blktaplib.h"
+#include "blktapctrl.h"
+
+static void make_blktap_dev(char *devname, int major, int minor)
+{
+ struct stat st;
+
+ if (lstat(devname, &st) != 0) {
+ /*Need to create device*/
+ if (mkdir(BLKTAP_DEV_DIR, 0755) == 0)
+ DPRINTF("Created %s directory\n",BLKTAP_DEV_DIR);
+ if (mknod(devname, S_IFCHR|0600,
+ makedev(major, minor)) == 0)
+ DPRINTF("Created %s device\n",devname);
+ } else {
+ DPRINTF("%s device already exists\n",devname);
+ /* it already exists, but is it the same major number */
+ if (((st.st_rdev>>8) & 0xff) != major) {
+ DPRINTF("%s has old major %d\n",
+ devname,
+ (unsigned int)((st.st_rdev >> 8) & 0xff));
+ /* only try again if we succed in deleting it */
+ if (!unlink(devname))
+ make_blktap_dev(devname, major, minor);
+ }
+ }
+}
+
+int blktap_interface_create(int ctlfd, int *major, int *minor, blkif_t *blkif)
+{
+ domid_translate_t tr;
+ domid_translate_ext_t tr_ext;
+ int ret;
+ char *devname;
+
+ if (blkif->be_id >= (1<<28)) {
+ /* new-style backend-id, so use the extended structure */
+ tr_ext.domid = blkif->domid;
+ tr_ext.busid = blkif->be_id;
+ ret = ioctl(ctlfd, BLKTAP_IOCTL_NEWINTF_EXT, &tr_ext);
+ DPRINTF("Sent domid %d and be_id %d\n", tr_ext.domid,
+ tr_ext.busid);
+ }
+ else {
+ /* old-style backend-id; use the old structure */
+ tr.domid = blkif->domid;
+ tr.busid = (unsigned short)blkif->be_id;
+ ret = ioctl(ctlfd, BLKTAP_IOCTL_NEWINTF, tr);
+ DPRINTF("Sent domid %d and be_id %d\n", tr.domid, tr.busid);
+ }
+
+ if ( (ret <= 0)||(ret > MAX_TAP_DEV) ) {
+ DPRINTF("Incorrect Dev ID [%d]\n",ret);
+ return -1;
+ }
+
+ *minor = ret;
+ *major = ioctl(ctlfd, BLKTAP_IOCTL_MAJOR, ret );
+ if (*major < 0) {
+ DPRINTF("Incorrect Major ID [%d]\n",*major);
+ return -1;
+ }
+
+ if (asprintf(&devname,"%s/%s%d",BLKTAP_DEV_DIR, BLKTAP_DEV_NAME, *minor) == -1)
+ return -1;
+ make_blktap_dev(devname,*major,*minor);
+ DPRINTF("Received device id %d and major %d\n",
+ *minor, *major);
+ return 0;
+}
+
+
+int blktap_interface_open(void)
+{
+ char *devname;
+ int ret;
+ int ctlfd;
+
+ /* Attach to blktap0 */
+ if (asprintf(&devname,"%s/%s0", BLKTAP_DEV_DIR, BLKTAP_DEV_NAME) == -1)
+ goto open_failed;
+
+ ret = xc_find_device_number("blktap0");
+ if (ret < 0) {
+ DPRINTF("couldn't find device number for 'blktap0'\n");
+ goto open_failed;
+ }
+
+ blktap_major = major(ret);
+ make_blktap_dev(devname,blktap_major, 0);
+
+ ctlfd = open(devname, O_RDWR);
+ if (ctlfd == -1) {
+ DPRINTF("blktap0 open failed\n");
+ goto open_failed;
+ }
+
+ return ctlfd;
+
+open_failed:
+ return -1;
+}