aboutsummaryrefslogtreecommitdiffstats
path: root/tools/blktap
diff options
context:
space:
mode:
authorKeir Fraser <keir.fraser@citrix.com>2008-07-09 10:41:49 +0100
committerKeir Fraser <keir.fraser@citrix.com>2008-07-09 10:41:49 +0100
commit5109f87cee321e54f1e4deb199c1e3bd0fa94b99 (patch)
treed2e8a2b12cf4a28ae7eec49ded298aea28c1bd5f /tools/blktap
parent17ebf1d7eeb1a8e4cc98018294f42a7b9b8d4508 (diff)
downloadxen-5109f87cee321e54f1e4deb199c1e3bd0fa94b99.tar.gz
xen-5109f87cee321e54f1e4deb199c1e3bd0fa94b99.tar.bz2
xen-5109f87cee321e54f1e4deb199c1e3bd0fa94b99.zip
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 <clalance@redhat.com>
Diffstat (limited to 'tools/blktap')
-rw-r--r--tools/blktap/drivers/blktapctrl.c24
-rw-r--r--tools/blktap/lib/blktaplib.h8
2 files changed, 25 insertions, 7 deletions
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;