From 5109f87cee321e54f1e4deb199c1e3bd0fa94b99 Mon Sep 17 00:00:00 2001 From: Keir Fraser Date: Wed, 9 Jul 2008 10:41:49 +0100 Subject: Blktapctrl compatibility layer I originally had just changed the NEWINTF ioctl to send over 48-bits of information, which works on 64-bit but not on 32-bit (since the arg is an unsigned long). Additionally, the previous changes would break an older userland against a new kernel. For that reason, introduce a new ioctl (NEWINTF_EXT) that fixes both of these problems. This is the dom0 userland side. Signed-off-by: Chris Lalancette --- tools/blktap/drivers/blktapctrl.c | 24 ++++++++++++++++++------ tools/blktap/lib/blktaplib.h | 8 +++++++- 2 files changed, 25 insertions(+), 7 deletions(-) (limited to 'tools/blktap') diff --git a/tools/blktap/drivers/blktapctrl.c b/tools/blktap/drivers/blktapctrl.c index 88e30bbca9..337fc6b71f 100644 --- a/tools/blktap/drivers/blktapctrl.c +++ b/tools/blktap/drivers/blktapctrl.c @@ -123,12 +123,25 @@ static void make_blktap_dev(char *devname, int major, int 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; - tr.domid = blkif->domid; - tr.busid = blkif->be_id; - ret = ioctl(ctlfd, BLKTAP_IOCTL_NEWINTF, tr ); + 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); @@ -145,9 +158,8 @@ static int get_new_dev(int *major, int *minor, blkif_t *blkif) 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, " - "sent domid %d and be_id %d\n", - *minor, *major, tr.domid, tr.busid); + DPRINTF("Received device id %d and major %d\n", + *minor, *major); return 0; } diff --git a/tools/blktap/lib/blktaplib.h b/tools/blktap/lib/blktaplib.h index 1bba363933..58a6fd897a 100644 --- a/tools/blktap/lib/blktaplib.h +++ b/tools/blktap/lib/blktaplib.h @@ -57,6 +57,7 @@ #define BLKTAP_IOCTL_MAJOR 7 #define BLKTAP_QUERY_ALLOC_REQS 8 #define BLKTAP_IOCTL_FREEINTF 9 +#define BLKTAP_IOCTL_NEWINTF_EXT 50 #define BLKTAP_IOCTL_PRINT_IDXS 100 /* blktap switching modes: (Set with BLKTAP_IOCTL_SETMODE) */ @@ -161,9 +162,14 @@ typedef struct tapdev_info { typedef struct domid_translate { unsigned short domid; - uint32_t busid; + unsigned short busid; } domid_translate_t ; +typedef struct domid_translate_ext { + unsigned short domid; + uint32_t busid; +} domid_translate_ext_t ; + typedef struct image { unsigned long long size; unsigned long secsize; -- cgit v1.2.3