|
@@ -381,12 +381,33 @@ static enum action do_pd_write_start(void);
|
|
|
static enum action do_pd_read_drq(void);
|
|
|
static enum action do_pd_write_done(void);
|
|
|
|
|
|
-static struct request_queue *pd_queue;
|
|
|
+static int pd_queue;
|
|
|
static int pd_claimed;
|
|
|
|
|
|
static struct pd_unit *pd_current; /* current request's drive */
|
|
|
static PIA *pi_current; /* current request's PIA */
|
|
|
|
|
|
+static int set_next_request(void)
|
|
|
+{
|
|
|
+ struct gendisk *disk;
|
|
|
+ struct request_queue *q;
|
|
|
+ int old_pos = pd_queue;
|
|
|
+
|
|
|
+ do {
|
|
|
+ disk = pd[pd_queue].gd;
|
|
|
+ q = disk ? disk->queue : NULL;
|
|
|
+ if (++pd_queue == PD_UNITS)
|
|
|
+ pd_queue = 0;
|
|
|
+ if (q) {
|
|
|
+ pd_req = blk_fetch_request(q);
|
|
|
+ if (pd_req)
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ } while (pd_queue != old_pos);
|
|
|
+
|
|
|
+ return pd_req != NULL;
|
|
|
+}
|
|
|
+
|
|
|
static void run_fsm(void)
|
|
|
{
|
|
|
while (1) {
|
|
@@ -418,8 +439,7 @@ static void run_fsm(void)
|
|
|
spin_lock_irqsave(&pd_lock, saved_flags);
|
|
|
if (!__blk_end_request_cur(pd_req,
|
|
|
res == Ok ? 0 : -EIO)) {
|
|
|
- pd_req = blk_fetch_request(pd_queue);
|
|
|
- if (!pd_req)
|
|
|
+ if (!set_next_request())
|
|
|
stop = 1;
|
|
|
}
|
|
|
spin_unlock_irqrestore(&pd_lock, saved_flags);
|
|
@@ -839,7 +859,13 @@ static void pd_probe_drive(struct pd_unit *disk)
|
|
|
p->first_minor = (disk - pd) << PD_BITS;
|
|
|
disk->gd = p;
|
|
|
p->private_data = disk;
|
|
|
- p->queue = pd_queue;
|
|
|
+ p->queue = blk_init_queue(do_pd_request, &pd_lock);
|
|
|
+ if (!p->queue) {
|
|
|
+ disk->gd = NULL;
|
|
|
+ put_disk(p);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ blk_queue_max_hw_sectors(p->queue, cluster);
|
|
|
|
|
|
if (disk->drive == -1) {
|
|
|
for (disk->drive = 0; disk->drive <= 1; disk->drive++)
|
|
@@ -919,26 +945,18 @@ static int __init pd_init(void)
|
|
|
if (disable)
|
|
|
goto out1;
|
|
|
|
|
|
- pd_queue = blk_init_queue(do_pd_request, &pd_lock);
|
|
|
- if (!pd_queue)
|
|
|
- goto out1;
|
|
|
-
|
|
|
- blk_queue_max_hw_sectors(pd_queue, cluster);
|
|
|
-
|
|
|
if (register_blkdev(major, name))
|
|
|
- goto out2;
|
|
|
+ goto out1;
|
|
|
|
|
|
printk("%s: %s version %s, major %d, cluster %d, nice %d\n",
|
|
|
name, name, PD_VERSION, major, cluster, nice);
|
|
|
if (!pd_detect())
|
|
|
- goto out3;
|
|
|
+ goto out2;
|
|
|
|
|
|
return 0;
|
|
|
|
|
|
-out3:
|
|
|
- unregister_blkdev(major, name);
|
|
|
out2:
|
|
|
- blk_cleanup_queue(pd_queue);
|
|
|
+ unregister_blkdev(major, name);
|
|
|
out1:
|
|
|
return -ENODEV;
|
|
|
}
|
|
@@ -953,11 +971,11 @@ static void __exit pd_exit(void)
|
|
|
if (p) {
|
|
|
disk->gd = NULL;
|
|
|
del_gendisk(p);
|
|
|
+ blk_cleanup_queue(p->queue);
|
|
|
put_disk(p);
|
|
|
pi_release(disk->pi);
|
|
|
}
|
|
|
}
|
|
|
- blk_cleanup_queue(pd_queue);
|
|
|
}
|
|
|
|
|
|
MODULE_LICENSE("GPL");
|