aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorkaf24@labyrinth.cl.cam.ac.uk <kaf24@labyrinth.cl.cam.ac.uk>2003-03-10 13:16:01 +0000
committerkaf24@labyrinth.cl.cam.ac.uk <kaf24@labyrinth.cl.cam.ac.uk>2003-03-10 13:16:01 +0000
commitfe98a95d91fb5a6a45c93c927ddb7499f8d8a8c7 (patch)
treeac63ac942b7d85fab7d325bddf05d83e61805ac4
parent261f2fef57695fec154fcd0aae9c503d2329d73f (diff)
downloadxen-fe98a95d91fb5a6a45c93c927ddb7499f8d8a8c7.tar.gz
xen-fe98a95d91fb5a6a45c93c927ddb7499f8d8a8c7.tar.bz2
xen-fe98a95d91fb5a6a45c93c927ddb7499f8d8a8c7.zip
bitkeeper revision 1.118 (3e6c9011AqlyQcEHaXEFaZYbfVfgPQ)
Many files: Fixed Xen blkdev probing to return device numbers.
-rw-r--r--xen/drivers/block/xen_block.c5
-rw-r--r--xen/drivers/block/xen_segment.c36
-rw-r--r--xen/drivers/ide/ide-xeno.c3
-rw-r--r--xen/drivers/scsi/sd.c2
-rw-r--r--xen/include/hypervisor-ifs/block.h16
-rw-r--r--xenolinux-2.4.21-pre4-sparse/arch/xeno/drivers/block/xl_ide.c17
-rw-r--r--xenolinux-2.4.21-pre4-sparse/arch/xeno/drivers/block/xl_scsi.c17
-rw-r--r--xenolinux-2.4.21-pre4-sparse/arch/xeno/drivers/block/xl_segment.c22
8 files changed, 66 insertions, 52 deletions
diff --git a/xen/drivers/block/xen_block.c b/xen/drivers/block/xen_block.c
index 43b85fe6d3..bf9cfd7431 100644
--- a/xen/drivers/block/xen_block.c
+++ b/xen/drivers/block/xen_block.c
@@ -482,7 +482,8 @@ static void dispatch_probe_blk(struct task_struct *p, int index)
static void dispatch_probe_seg(struct task_struct *p, int index)
{
- extern void xen_segment_probe(xen_disk_info_t *xdi);
+ extern void xen_segment_probe(struct task_struct *, xen_disk_info_t *);
+
blk_ring_t *blk_ring = p->blk_ring_base;
xen_disk_info_t *xdi;
unsigned long flags, buffer;
@@ -502,7 +503,7 @@ static void dispatch_probe_seg(struct task_struct *p, int index)
spin_unlock_irqrestore(&p->page_lock, flags);
xdi = phys_to_virt(buffer);
- xen_segment_probe(xdi);
+ xen_segment_probe(p, xdi);
unlock_buffer(p, buffer, sizeof(xen_disk_info_t), 1);
diff --git a/xen/drivers/block/xen_segment.c b/xen/drivers/block/xen_segment.c
index e644aad115..4a09f511a6 100644
--- a/xen/drivers/block/xen_segment.c
+++ b/xen/drivers/block/xen_segment.c
@@ -97,27 +97,28 @@ int xen_segment_map_request(
*
* return a list of segments to the guestos
*/
-void xen_segment_probe (xen_disk_info_t *raw_xdi, int *count)
+void xen_segment_probe(struct task_struct *p, xen_disk_info_t *raw_xdi)
{
int loop, i;
xen_disk_info_t *xdi = map_domain_mem(virt_to_phys(raw_xdi));
- for (loop = 0; loop < XEN_MAX_SEGMENTS; loop++ )
+ for ( loop = 0; loop < XEN_MAX_SEGMENTS; loop++ )
{
- if (xsegments[loop].mode != XEN_SEGMENT_UNUSED)
+ if ( (xsegments[loop].mode == XEN_SEGMENT_UNUSED) ||
+ (xsegments[loop].domain != p->domain) )
+ continue;
+
+ xdi->disks[xdi->count].device =
+ MK_VIRTUAL_XENDEV(xsegments[loop].segment_number);
+ for ( i = 0; i < xsegments[loop].num_extents; i++ )
{
- xdi->disks[xdi->count].type = XEN_DISK_VIRTUAL;
- for (i = 0; i < xsegments[loop].num_extents; i++)
- {
- xdi->disks[xdi->count].capacity +=
- xsegments[loop].extents[i].size;
- }
- xdi->count++;
+ xdi->disks[xdi->count].capacity +=
+ xsegments[loop].extents[i].size;
}
+ xdi->count++;
}
unmap_domain_mem(xdi);
- return;
}
/*
@@ -132,14 +133,13 @@ void xen_refresh_segment_list (struct task_struct *p)
for (loop = 0; loop < XEN_MAX_SEGMENTS; loop++)
{
- if (xsegments[loop].mode != XEN_SEGMENT_UNUSED &&
- xsegments[loop].domain == p->domain)
- {
- p->segment_list[xsegments[loop].segment_number] = &xsegments[loop];
- p->segment_count++;
- }
+ if ( (xsegments[loop].mode == XEN_SEGMENT_UNUSED) ||
+ (xsegments[loop].domain != p->domain) )
+ continue;
+
+ p->segment_list[xsegments[loop].segment_number] = &xsegments[loop];
+ p->segment_count++;
}
- return;
}
/*
diff --git a/xen/drivers/ide/ide-xeno.c b/xen/drivers/ide/ide-xeno.c
index b5bca9b5c9..49ecde74e4 100644
--- a/xen/drivers/ide/ide-xeno.c
+++ b/xen/drivers/ide/ide-xeno.c
@@ -26,7 +26,8 @@ void ide_probe_devices(xen_disk_info_t* xdi)
if ( !drive->present ) continue;
capacity = current_capacity(drive);
- xen_xdi->disks[xen_xdi->count].type = XEN_DISK_IDE;
+ xen_xdi->disks[xen_xdi->count].device =
+ MK_IDE_XENDEV((loop * MAX_DRIVES) + unit);
xen_xdi->disks[xen_xdi->count].capacity = capacity;
xen_xdi->count++;
diff --git a/xen/drivers/scsi/sd.c b/xen/drivers/scsi/sd.c
index 71e9e4409f..a2a245fddc 100644
--- a/xen/drivers/scsi/sd.c
+++ b/xen/drivers/scsi/sd.c
@@ -1325,7 +1325,7 @@ void scsi_probe_devices(xen_disk_info_t *xdi)
{
if ( sd->device == NULL ) continue;
- xen_xdi->disks[xen_xdi->count].type = XEN_DISK_SCSI;
+ xen_xdi->disks[xen_xdi->count].device = MK_SCSI_XENDEV(i);
xen_xdi->disks[xen_xdi->count].capacity = sd->capacity;
xen_xdi->count++;
diff --git a/xen/include/hypervisor-ifs/block.h b/xen/include/hypervisor-ifs/block.h
index 1b228c5c85..a4b9f35376 100644
--- a/xen/include/hypervisor-ifs/block.h
+++ b/xen/include/hypervisor-ifs/block.h
@@ -21,6 +21,10 @@
#define XENDEV_SCSI (2 << XENDEV_TYPE_SHIFT)
#define XENDEV_VIRTUAL (3 << XENDEV_TYPE_SHIFT)
+#define IS_IDE_XENDEV(_d) (((_d) & XENDEV_TYPE_MASK) == XENDEV_IDE)
+#define IS_SCSI_XENDEV(_d) (((_d) & XENDEV_TYPE_MASK) == XENDEV_SCSI)
+#define IS_VIRTUAL_XENDEV(_d) (((_d) & XENDEV_TYPE_MASK) == XENDEV_VIRTUAL)
+
#define MK_IDE_XENDEV(_i) ((_i) | XENDEV_IDE)
#define MK_SCSI_XENDEV(_i) ((_i) | XENDEV_SCSI)
#define MK_VIRTUAL_XENDEV(_i) ((_i) | XENDEV_VIRTUAL)
@@ -90,19 +94,15 @@ typedef struct blk_ring_st
#define XEN_MAX_DISK_COUNT 100
-#define XEN_DISK_IDE 1
-#define XEN_DISK_SCSI 2
-#define XEN_DISK_VIRTUAL 3 /* vhd */
-
-typedef struct xen_disk /* physical disk */
+typedef struct xen_disk
{
- int type; /* disk type */
- unsigned long capacity;
+ unsigned short device;
+ unsigned long capacity;
} xen_disk_t;
typedef struct xen_disk_info
{
- int count; /* number of xen_disk_t structures to follow */
+ int count;
xen_disk_t disks[XEN_MAX_DISK_COUNT];
} xen_disk_info_t;
diff --git a/xenolinux-2.4.21-pre4-sparse/arch/xeno/drivers/block/xl_ide.c b/xenolinux-2.4.21-pre4-sparse/arch/xeno/drivers/block/xl_ide.c
index 9d6ef64c75..70990167e3 100644
--- a/xenolinux-2.4.21-pre4-sparse/arch/xeno/drivers/block/xl_ide.c
+++ b/xenolinux-2.4.21-pre4-sparse/arch/xeno/drivers/block/xl_ide.c
@@ -73,13 +73,16 @@ int xlide_init(xen_disk_info_t *xdi)
*/
blk_queue_headactive(BLK_DEFAULT_QUEUE(XLIDE_MAJOR), 0);
- /* Count number of IDE devices installed in the system. */
+ /* If we don't have any usable IDE devices we may as well bail now. */
units = 0;
for ( i = 0; i < xdi->count; i++ )
- if ( xdi->disks[i].type == XEN_DISK_IDE ) units++;
-
+ if ( IS_IDE_XENDEV(xdi->disks[i].device) &&
+ ((xdi->disks[i].device & XENDEV_IDX_MASK) < 16) ) units++;
if ( units == 0 ) return 0;
+ /* We may register up to 16 devices in a sparse identifier space. */
+ units = 16;
+
/* Construct an appropriate gendisk structure. */
minors = units * (1<<IDE_PARTN_BITS);
gd = kmalloc(sizeof(struct gendisk), GFP_KERNEL);
@@ -104,10 +107,13 @@ int xlide_init(xen_disk_info_t *xdi)
add_gendisk(gd);
/* Now register each disk in turn. */
- disk = 0;
for ( i = 0; i < xdi->count; i++ )
{
- if ( xdi->disks[i].type != XEN_DISK_IDE ) continue;
+ disk = xdi->disks[i].device & XENDEV_IDX_MASK;
+
+ /* We can use the first 16 IDE devices. */
+ if ( !IS_IDE_XENDEV(xdi->disks[i].device) || (disk >= 16) ) continue;
+
((xl_disk_t *)gd->real_devices)[disk].capacity =
xdi->disks[i].capacity;
register_disk(gd,
@@ -115,7 +121,6 @@ int xlide_init(xen_disk_info_t *xdi)
1<<IDE_PARTN_BITS,
&xlide_block_fops,
xdi->disks[i].capacity);
- disk++;
}
printk(KERN_ALERT
diff --git a/xenolinux-2.4.21-pre4-sparse/arch/xeno/drivers/block/xl_scsi.c b/xenolinux-2.4.21-pre4-sparse/arch/xeno/drivers/block/xl_scsi.c
index 68566799bd..75e379f1ba 100644
--- a/xenolinux-2.4.21-pre4-sparse/arch/xeno/drivers/block/xl_scsi.c
+++ b/xenolinux-2.4.21-pre4-sparse/arch/xeno/drivers/block/xl_scsi.c
@@ -74,13 +74,16 @@ int xlscsi_init(xen_disk_info_t *xdi)
*/
blk_queue_headactive(BLK_DEFAULT_QUEUE(XLSCSI_MAJOR), 0);
- /* Count number of SCSI devices installed in the system. */
+ /* If we don't have any usable SCSI devices we may as well bail now. */
units = 0;
for ( i = 0; i < xdi->count; i++ )
- if ( xdi->disks[i].type == XEN_DISK_SCSI ) units++;
-
+ if ( IS_SCSI_XENDEV(xdi->disks[i].device) &&
+ ((xdi->disks[i].device & XENDEV_IDX_MASK) < 16) ) units++;
if ( units == 0 ) return 0;
+ /* We may register up to 16 devices in a sparse identifier space. */
+ units = 16;
+
/* Construct an appropriate gendisk structure. */
minors = units * (1<<SCSI_PARTN_BITS);
gd = kmalloc(sizeof(struct gendisk), GFP_KERNEL);
@@ -105,10 +108,13 @@ int xlscsi_init(xen_disk_info_t *xdi)
add_gendisk(gd);
/* Now register each disk in turn. */
- disk = 0;
for ( i = 0; i < xdi->count; i++ )
{
- if ( xdi->disks[i].type != XEN_DISK_SCSI ) continue;
+ disk = xdi->disks[i].device & XENDEV_IDX_MASK;
+
+ /* We can use the first 16 IDE devices. */
+ if ( !IS_SCSI_XENDEV(xdi->disks[i].device) || (disk >= 16) ) continue;
+
((xl_disk_t *)gd->real_devices)[disk].capacity =
xdi->disks[i].capacity;
register_disk(gd,
@@ -116,7 +122,6 @@ int xlscsi_init(xen_disk_info_t *xdi)
1<<SCSI_PARTN_BITS,
&xlscsi_block_fops,
xdi->disks[i].capacity);
- disk++;
}
printk(KERN_ALERT
diff --git a/xenolinux-2.4.21-pre4-sparse/arch/xeno/drivers/block/xl_segment.c b/xenolinux-2.4.21-pre4-sparse/arch/xeno/drivers/block/xl_segment.c
index 97a53fe6fd..8626a36569 100644
--- a/xenolinux-2.4.21-pre4-sparse/arch/xeno/drivers/block/xl_segment.c
+++ b/xenolinux-2.4.21-pre4-sparse/arch/xeno/drivers/block/xl_segment.c
@@ -90,13 +90,12 @@ int __init xlseg_init(void)
*/
blk_queue_headactive(BLK_DEFAULT_QUEUE(XLVIRT_MAJOR), 0);
-
- /* Count number of virtual devices installed in the system. */
- units = 0;
- for ( i = 0; i < xdi->count; i++ )
- if ( xdi->disks[i].type == XEN_DISK_VIRTUAL ) units++;
-
- if ( units == 0 ) return 0;
+ /*
+ * We may register up to 16 devices in a sparse identifier space.
+ * Unlike with IDE and SCSI, we always register a gendisk, as new
+ * virtual devices may get allocate dto us later on.
+ */
+ units = 16;
/* Construct an appropriate gendisk structure. */
minors = units * (1<<VIRT_PARTN_BITS);
@@ -122,10 +121,14 @@ int __init xlseg_init(void)
add_gendisk(gd);
/* Now register each disk in turn. */
- disk = 0;
for ( i = 0; i < xdi->count; i++ )
{
- if ( xdi->disks[i].type != XEN_DISK_VIRTUAL ) continue;
+ disk = xdi->disks[i].device & XENDEV_IDX_MASK;
+
+ /* We can use the first 16 IDE devices. */
+ if ( !IS_VIRTUAL_XENDEV(xdi->disks[i].device) || (disk >= 16) )
+ continue;
+
((xl_disk_t *)gd->real_devices)[disk].capacity =
xdi->disks[i].capacity;
register_disk(gd,
@@ -133,7 +136,6 @@ int __init xlseg_init(void)
1<<VIRT_PARTN_BITS,
&xlsegment_block_fops,
xdi->disks[i].capacity);
- disk++;
}
printk(KERN_ALERT