diff options
-rw-r--r-- | xen/drivers/block/xen_block.c | 25 | ||||
-rw-r--r-- | xen/drivers/block/xen_segment.c | 96 | ||||
-rw-r--r-- | xenolinux-2.4.21-pre4-sparse/arch/xeno/drivers/block/xl_block.c | 6 | ||||
-rw-r--r-- | xenolinux-2.4.21-pre4-sparse/arch/xeno/drivers/block/xl_block.h | 6 |
4 files changed, 110 insertions, 23 deletions
diff --git a/xen/drivers/block/xen_block.c b/xen/drivers/block/xen_block.c index 868838d85d..aedbe3abcd 100644 --- a/xen/drivers/block/xen_block.c +++ b/xen/drivers/block/xen_block.c @@ -210,11 +210,6 @@ static void end_block_io_op(struct buffer_head *bh, int uptodate) pending_req->status = 2; } - if (pending_req->status) - { - printk ("Hey! status is %d\n", pending_req->status); - } - unlock_buffer(pending_req->domain, virt_to_phys(bh->b_data), bh->b_size, @@ -568,7 +563,10 @@ static void dispatch_rw_block_io(struct task_struct *p, int index) } if ( !__buffer_is_valid(p, buffer, nr_sects<<9, (operation==READ)) ) + { + DPRINTK("invalid buffer\n"); goto bad_descriptor; + } /* Get the physical device and block index. */ if ( (req->device & XENDEV_TYPE_MASK) == XENDEV_VIRTUAL ) @@ -578,7 +576,11 @@ static void dispatch_rw_block_io(struct task_struct *p, int index) req->device, req->sector_number + tot_sects, buffer, nr_sects); - if ( new_segs <= 0 ) goto bad_descriptor; + if ( new_segs <= 0 ) + { + DPRINTK("bogus xen_segment_map_request\n"); + goto bad_descriptor; + } } else { @@ -586,7 +588,11 @@ static void dispatch_rw_block_io(struct task_struct *p, int index) phys_seg[nr_psegs].sector_number = req->sector_number + tot_sects; phys_seg[nr_psegs].buffer = buffer; phys_seg[nr_psegs].nr_sects = nr_sects; - if ( phys_seg[nr_psegs].dev == 0 ) goto bad_descriptor; + if ( phys_seg[nr_psegs].dev == 0 ) + { + DPRINTK("bad device\n"); + goto bad_descriptor; + } new_segs = 1; } @@ -690,11 +696,6 @@ static void make_response(struct task_struct *p, unsigned long id, int position; blk_ring_t *blk_ring; - if (st != 0) - { - printk("status is %ld\n", st); - } - /* Place on the response ring for the relevant domain. */ spin_lock_irqsave(&p->blk_ring_lock, flags); blk_ring = p->blk_ring_base; diff --git a/xen/drivers/block/xen_segment.c b/xen/drivers/block/xen_segment.c index 5d26fcc113..db292ac4b4 100644 --- a/xen/drivers/block/xen_segment.c +++ b/xen/drivers/block/xen_segment.c @@ -17,6 +17,12 @@ segment_t xsegments[XEN_MAX_SEGMENTS]; +#if 0 +#define DPRINTK(_f, _a...) printk( _f , ## _a ) +#else +#define DPRINTK(_f, _a...) ((void)0) +#endif + /* * xen_segment_map_request * @@ -37,18 +43,36 @@ int xen_segment_map_request( int sum, i; segment_number &= XENDEV_IDX_MASK; - if ( segment_number >= XEN_MAX_SEGMENTS ) goto fail; + if ( segment_number >= XEN_MAX_SEGMENTS ) + { + DPRINTK("invalid segment number. %d %d\n", + segment_number, XEN_MAX_SEGMENTS); + goto fail; + } seg = p->segment_list[segment_number]; - if ( seg == NULL ) goto fail; + if ( seg == NULL ) + { + DPRINTK("segment is null. %d\n", segment_number); + goto fail; + } /* check domain permissions */ - if ( seg->domain != p->domain ) goto fail; + if ( seg->domain != p->domain ) + { + DPRINTK("segment is for another domain. %d %d\n", + seg->domain, p->domain); + goto fail; + } /* check rw access */ if ((operation == WRITE && seg->mode != XEN_SEGMENT_RW) || (operation == READ && seg->mode == XEN_SEGMENT_UNUSED)) + { + DPRINTK("illegal operation: %d %d\n", + operation, seg->mode); goto fail; + } /* find extent, check size */ sum = 0; @@ -60,36 +84,88 @@ int xen_segment_map_request( ext++; i++; } - if ( (sum + ext->size) <= sect_nr ) goto fail; + if ( (sum + ext->size) <= sect_nr ) + { + DPRINTK("extent size mismatch: %d %d : %d %ld %ld\n", + i, seg->num_extents, sum, ext->size, sect_nr); + goto fail; + } - pseg->sector_number = sect_nr + ext->offset - sum; + pseg->sector_number = (sect_nr - sum) + ext->offset; pseg->buffer = buffer; pseg->nr_sects = nr_sects; pseg->dev = xendev_to_physdev(ext->disk); - if ( pseg->dev == 0 ) goto fail; + if ( pseg->dev == 0 ) + { + DPRINTK ("invalid device 0x%x 0x%lx 0x%lx\n", + ext->disk, ext->offset, ext->size); + goto fail; + } /* We're finished if the virtual extent didn't overrun the phys extent. */ if ( (sum + ext->size) >= (sect_nr + nr_sects) ) - return 1; /* Just one more physical extent. */ + return 1; /* entire read fits in this extent */ /* Hmmm... make sure there's another extent to overrun onto! */ - if ( (i+1) == seg->num_extents ) goto fail; + if ( (i+1) == seg->num_extents ) + { + DPRINTK ("not enough extents %d %d\n", + i, seg->num_extents); + goto fail; + } pseg[1].nr_sects = (sect_nr + nr_sects) - (sum + ext->size); pseg[0].nr_sects = sum + ext->size - sect_nr; pseg[1].buffer = buffer + (pseg->nr_sects << 9); pseg[1].sector_number = ext[1].offset; pseg[1].dev = xendev_to_physdev(ext[1].disk); - if ( pseg[1].dev == 0 ) goto fail; + if ( pseg[1].dev == 0 ) + { + DPRINTK ("bogus device for pseg[1] \n"); + goto fail; + } /* We don't allow overrun onto a third physical extent. */ if ( (sum + ext[0].size + ext[1].size) < (pseg[1].sector_number + pseg[1].nr_sects) ) + { + DPRINTK ("third extent\n"); + DPRINTK (" sum:%d, e0:%ld, e1:%ld p1.sect:%ld p1.nr:%d\n", + sum, ext[0].size, ext[1].size, + pseg[1].sector_number, pseg[1].nr_sects); goto fail; + } - return 2; /* We overran onto a second physical es\xtent. */ + return 2; /* We overran onto a second physical extent. */ fail: + + DPRINTK ("xen_segment_map_request failure\n"); + DPRINTK ("operation: %d\n", operation); + DPRINTK ("segment number: %d\n", segment_number); + DPRINTK ("sect_nr: %ld 0x%lx\n", sect_nr, sect_nr); + DPRINTK ("nr_sects: %d 0x%x\n", nr_sects, nr_sects); + + if (0) + { + segment_t *xseg; + extent_t *xext; + int xsum, xi; + + xseg = p->segment_list[segment_number]; + + xsum = 0; xi = 0; + xext = xseg->extents; + + while ( (xi < xseg->num_extents) && ((xsum + xext->size) <= sect_nr) ) + { + DPRINTK (" xi:%d, num_ext:%d, xsum:%d, size:%lx, sect_nr:%lx\n", + xi, xseg->num_extents, xsum, xext->size, sect_nr); + xsum += xext->size; + xext++; xi++; + } + } + return -1; } diff --git a/xenolinux-2.4.21-pre4-sparse/arch/xeno/drivers/block/xl_block.c b/xenolinux-2.4.21-pre4-sparse/arch/xeno/drivers/block/xl_block.c index 9de2f0bf96..6e66845c84 100644 --- a/xenolinux-2.4.21-pre4-sparse/arch/xeno/drivers/block/xl_block.c +++ b/xenolinux-2.4.21-pre4-sparse/arch/xeno/drivers/block/xl_block.c @@ -120,6 +120,11 @@ int xenolinux_block_release(struct inode *inode, struct file *filep) return 0; } +/* + * handle ioctl calls + * + * individual ioctls are defined in /usr/include/linux/fs.h + */ int xenolinux_block_ioctl(struct inode *inode, struct file *filep, unsigned command, unsigned long argument) @@ -299,6 +304,7 @@ static int hypervisor_request(unsigned long id, case XEN_BLOCK_WRITE: phys_device = xldev_to_physdev(device); gd = xldev_to_gendisk(device); + sector_number += gd->part[MINOR(device)].start_sect; if ( (sg_operation == operation) && (sg_dev == phys_device) && diff --git a/xenolinux-2.4.21-pre4-sparse/arch/xeno/drivers/block/xl_block.h b/xenolinux-2.4.21-pre4-sparse/arch/xeno/drivers/block/xl_block.h index 3d219eeedc..bc6432b778 100644 --- a/xenolinux-2.4.21-pre4-sparse/arch/xeno/drivers/block/xl_block.h +++ b/xenolinux-2.4.21-pre4-sparse/arch/xeno/drivers/block/xl_block.h @@ -29,9 +29,13 @@ #if 0 #define DPRINTK(_f, _a...) printk ( KERN_ALERT _f , ## _a ) -#define DPRINTK_IOCTL(_f, _a...) printk ( KERN_ALERT _f , ## _a ) #else #define DPRINTK(_f, _a...) ((void)0) +#endif + +#if 0 +#define DPRINTK_IOCTL(_f, _a...) printk ( KERN_ALERT _f , ## _a ) +#else #define DPRINTK_IOCTL(_f, _a...) ((void)0) #endif |