patch-2.4.14 linux/drivers/block/cpqarray.c
Next file: linux/drivers/block/floppy.c
Previous file: linux/drivers/block/cciss_cmd.h
Back to the patch index
Back to the overall index
- Lines: 150
- Date:
Fri Nov 2 17:45:42 2001
- Orig file:
v2.4.13/linux/drivers/block/cpqarray.c
- Orig date:
Tue Oct 23 22:48:50 2001
diff -u --recursive --new-file v2.4.13/linux/drivers/block/cpqarray.c linux/drivers/block/cpqarray.c
@@ -188,6 +188,7 @@
}
static struct block_device_operations ida_fops = {
+ owner: THIS_MODULE,
open: ida_open,
release: ida_release,
ioctl: ida_ioctl,
@@ -853,7 +854,6 @@
hba[ctlr]->drv[dsk].usage_count++;
hba[ctlr]->usage_count++;
- MOD_INC_USE_COUNT;
return 0;
}
@@ -869,7 +869,6 @@
hba[ctlr]->drv[dsk].usage_count--;
hba[ctlr]->usage_count--;
- MOD_DEC_USE_COUNT;
return 0;
}
@@ -912,21 +911,19 @@
{
ctlr_info_t *h = q->queuedata;
cmdlist_t *c;
- int seg, sect;
char *lastdataend;
struct list_head * queue_head = &q->queue_head;
struct buffer_head *bh;
struct request *creq;
struct my_sg tmp_sg[SG_MAX];
- int i;
+ int i, seg;
-// Loop till the queue is empty if or it is plugged
- while (1)
-{
- if (q->plugged || list_empty(queue_head)) {
- start_io(h);
- return;
- }
+ if (q->plugged)
+ goto startio;
+
+queue_next:
+ if (list_empty(queue_head))
+ goto startio;
creq = blkdev_entry_next_request(queue_head);
if (creq->nr_segments > SG_MAX)
@@ -938,15 +935,14 @@
h->ctlr, creq->rq_dev, creq);
blkdev_dequeue_request(creq);
complete_buffers(creq->bh, 0);
- start_io(h);
- return;
+ end_that_request_last(creq);
+ goto startio;
}
if ((c = cmd_alloc(h,1)) == NULL)
- {
- start_io(h);
- return;
- }
+ goto startio;
+
+ spin_unlock_irq(&io_request_lock);
bh = creq->bh;
@@ -956,7 +952,7 @@
c->size += sizeof(rblk_t);
c->req.hdr.blk = ida[(h->ctlr<<CTLR_SHIFT) + MINOR(creq->rq_dev)].start_sect + creq->sector;
- c->bh = bh;
+ c->rq = creq;
DBGPX(
if (bh == NULL)
panic("bh == NULL?");
@@ -964,9 +960,7 @@
printk("sector=%d, nr_sectors=%d\n", creq->sector, creq->nr_sectors);
);
seg = 0; lastdataend = NULL;
- sect = 0;
while(bh) {
- sect += bh->b_size/512;
if (bh->b_data == lastdataend) {
tmp_sg[seg-1].size += bh->b_size;
lastdataend += bh->b_size;
@@ -992,26 +986,12 @@
}
DBGPX( printk("Submitting %d sectors in %d segments\n", sect, seg); );
c->req.hdr.sg_cnt = seg;
- c->req.hdr.blk_cnt = sect;
+ c->req.hdr.blk_cnt = creq->nr_sectors;
- /*
- * Since we control our own merging, we know that this request
- * is now fully setup and there's nothing left.
- */
- if (creq->nr_sectors != sect) {
- printk("ida: %ld != %d sectors\n", creq->nr_sectors, sect);
- BUG();
- }
+ spin_lock_irq(&io_request_lock);
blkdev_dequeue_request(creq);
- /*
- * ehh, we can't really end the request here since it's not
- * even started yet. for now it shouldn't hurt though
- */
-DBGPX( printk("Done with %p\n", creq); );
- end_that_request_last(creq);
-
c->req.hdr.cmd = (creq->cmd == READ) ? IDA_READ : IDA_WRITE;
c->type = CMD_RWREQ;
@@ -1020,7 +1000,11 @@
h->Qdepth++;
if (h->Qdepth > h->maxQsinceinit)
h->maxQsinceinit = h->Qdepth;
- } // while loop
+
+ goto queue_next;
+
+startio:
+ start_io(h);
}
/*
@@ -1097,7 +1081,13 @@
cmd->req.sg[i].addr, cmd->req.sg[i].size,
(cmd->req.hdr.cmd == IDA_READ) ? PCI_DMA_FROMDEVICE : PCI_DMA_TODEVICE);
}
- complete_buffers(cmd->bh, ok);
+
+ complete_buffers(cmd->rq->bh, ok);
+
+ DBGPX(printk("Done with %p\n", cmd->rq););
+ end_that_request_last(cmd->rq);
+
+
}
/*
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)