aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--xen/drivers/block/xen_block.c25
-rw-r--r--xen/drivers/block/xen_segment.c96
-rw-r--r--xenolinux-2.4.21-pre4-sparse/arch/xeno/drivers/block/xl_block.c6
-rw-r--r--xenolinux-2.4.21-pre4-sparse/arch/xeno/drivers/block/xl_block.h6
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