diff options
-rw-r--r-- | xen/drivers/block/xen_block.c | 5 | ||||
-rw-r--r-- | xen/drivers/block/xen_segment.c | 36 | ||||
-rw-r--r-- | xen/drivers/ide/ide-xeno.c | 3 | ||||
-rw-r--r-- | xen/drivers/scsi/sd.c | 2 | ||||
-rw-r--r-- | xen/include/hypervisor-ifs/block.h | 16 | ||||
-rw-r--r-- | xenolinux-2.4.21-pre4-sparse/arch/xeno/drivers/block/xl_ide.c | 17 | ||||
-rw-r--r-- | xenolinux-2.4.21-pre4-sparse/arch/xeno/drivers/block/xl_scsi.c | 17 | ||||
-rw-r--r-- | xenolinux-2.4.21-pre4-sparse/arch/xeno/drivers/block/xl_segment.c | 22 |
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 |