Loading drivers/block/paride/pd.c +34 −16 Original line number Diff line number Diff line Loading @@ -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) { Loading Loading @@ -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); Loading Loading @@ -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++) Loading Loading @@ -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; } Loading @@ -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"); Loading Loading
drivers/block/paride/pd.c +34 −16 Original line number Diff line number Diff line Loading @@ -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) { Loading Loading @@ -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); Loading Loading @@ -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++) Loading Loading @@ -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; } Loading @@ -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"); Loading