aboutsummaryrefslogtreecommitdiffstats
path: root/xenolinux-2.4.21-pre4-sparse/arch/xeno/drivers/block/xl_ide.c
diff options
context:
space:
mode:
Diffstat (limited to 'xenolinux-2.4.21-pre4-sparse/arch/xeno/drivers/block/xl_ide.c')
-rw-r--r--xenolinux-2.4.21-pre4-sparse/arch/xeno/drivers/block/xl_ide.c17
1 files changed, 11 insertions, 6 deletions
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