static void jsfd_do_request(request_queue_t *q)
{
- struct request *req;
- int dev;
- struct jsfd_part *jdp;
- unsigned long offset;
- size_t len;
-
- for (;;) {
- if (blk_queue_empty(QUEUE))
- return;
-
- req = CURRENT;
+ while (!blk_queue_empty(q)) {
+ struct request *req = elv_next_request(q);
+ struct jsfd_part *jdp = req->rq_disk->private_data;
+ unsigned long offset = req->sector << 9;
+ size_t len = req->current_nr_sectors << 9;
- dev = MINOR(req->rq_dev);
- if (dev >= JSF_MAX || (dev & JSF_PART_MASK) >= JSF_NPART) {
- end_request(CURRENT, 0);
- continue;
- }
- jdp = &jsf0.dv[dev & JSF_PART_MASK];
-
- offset = req->sector << 9;
- len = req->current_nr_sectors << 9;
if ((offset + len) > jdp->dsize) {
- end_request(CURRENT, 0);
+ end_request(req, 0);
continue;
}
if (req->cmd == WRITE) {
printk(KERN_ERR "jsfd: write\n");
- end_request(CURRENT, 0);
+ end_request(req, 0);
continue;
}
if (req->cmd != READ) {
printk(KERN_ERR "jsfd: bad req->cmd %d\n", req->cmd);
- end_request(CURRENT, 0);
+ end_request(req, 0);
continue;
}
if ((jdp->dbase & 0xff000000) != 0x20000000) {
printk(KERN_ERR "jsfd: bad base %x\n", (int)jdp->dbase);
- end_request(CURRENT, 0);
+ end_request(req, 0);
continue;
}
-/* printk("jsfd%d: read buf %p off %x len %x\n", dev, req->buffer, (int)offset, (int)len); */ /* P3 */
+/* printk("%s: read buf %p off %x len %x\n", req->rq_disk->disk_name, req->buffer, (int)offset, (int)len); */ /* P3 */
jsfd_read(req->buffer, jdp->dbase + offset, len);
- end_request(CURRENT, 1);
+ end_request(req, 1);
}
}
return 0;
}
+static struct request_queue jsf_queue;
+
static int jsfd_init(void)
{
static spinlock_t lock = SPIN_LOCK_UNLOCKED;
goto out;
}
- blk_init_queue(BLK_DEFAULT_QUEUE(MAJOR_NR), jsfd_do_request, &lock);
+ blk_init_queue(&jsf_queue, jsfd_do_request, &lock);
for (i = 0; i < JSF_MAX; i++) {
struct gendisk *disk = jsfd_disk[i];
if ((i & JSF_PART_MASK) >= JSF_NPART) continue;
sprintf(disk->disk_name, "jsfd%d", i);
disk->fops = &jsfd_fops;
set_capacity(disk, jdp->dsize >> 9);
+ disk->private_data = jdp;
+ disk->queue = &jsf_queue;
add_disk(disk);
set_device_ro(MKDEV(JSFD_MAJOR, i), 1);
}
misc_deregister(&jsf_dev);
if (unregister_blkdev(JSFD_MAJOR, "jsfd") != 0)
printk("jsfd: cleanup_module failed\n");
- blk_cleanup_queue(BLK_DEFAULT_QUEUE(MAJOR_NR));
+ blk_cleanup_queue(&jsf_queue);
}
module_init(jsflash_init_module);