From 9ced0b95b3993660e7990cf6bf68c1a80f31544e Mon Sep 17 00:00:00 2001 From: Jens Axboe Date: Sat, 26 Mar 2011 19:49:54 +0100 Subject: [PATCH 1/2] ide: ensure that we re-run the queue handler The conversion to blk_delay_queue() missed parts of IDE. Add a blk_delay_queue() to ensure that the request handler gets reinvoked when it needs to. Note that in all but one place the old plug re-run delay of 3 msecs is used, even though it probably could be shorter for performance reasons in some of those cases. Reported-by: Geert Uytterhoeven Signed-off-by: Jens Axboe --- drivers/ide/ide-io.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/drivers/ide/ide-io.c b/drivers/ide/ide-io.c index f4077840d3ab..0e406d73b2c8 100644 --- a/drivers/ide/ide-io.c +++ b/drivers/ide/ide-io.c @@ -440,6 +440,7 @@ void do_ide_request(struct request_queue *q) struct ide_host *host = hwif->host; struct request *rq = NULL; ide_startstop_t startstop; + unsigned long queue_run_ms = 3; /* old plug delay */ spin_unlock_irq(q->queue_lock); @@ -459,6 +460,9 @@ repeat: prev_port = hwif->host->cur_port; if (drive->dev_flags & IDE_DFLAG_SLEEPING && time_after(drive->sleep, jiffies)) { + unsigned long left = jiffies - drive->sleep; + + queue_run_ms = jiffies_to_msecs(left + 1); ide_unlock_port(hwif); goto plug_device; } @@ -547,8 +551,10 @@ plug_device: plug_device_2: spin_lock_irq(q->queue_lock); - if (rq) + if (rq) { blk_requeue_request(q, rq); + blk_delay_queue(q, queue_run_ms); + } } void ide_requeue_and_plug(ide_drive_t *drive, struct request *rq) @@ -562,6 +568,10 @@ void ide_requeue_and_plug(ide_drive_t *drive, struct request *rq) blk_requeue_request(q, rq); spin_unlock_irqrestore(q->queue_lock, flags); + + /* Use 3ms as that was the old plug delay */ + if (rq) + blk_delay_queue(q, 3); } static int drive_is_ready(ide_drive_t *drive) From 0b58b4e3e711aed17aa26fafd01be137f6a1ab2e Mon Sep 17 00:00:00 2001 From: Tejun Heo Date: Sat, 26 Mar 2011 19:52:59 +0100 Subject: [PATCH 2/2] staging: Fix bdops->check_events() misconversion in cyasblkdev_block.c Commit cafb0bfca1 (staging: Convert to bdops->check_events()) incorrectly set bd->user_disk_0->events while initializing bd->user_disk_1. Fix it. The problem was spotted by Milton's suspect code pattern detector. Signed-off-by: Tejun Heo Reported-by: Milton Miller Signed-off-by: Jens Axboe --- drivers/staging/westbridge/astoria/block/cyasblkdev_block.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/staging/westbridge/astoria/block/cyasblkdev_block.c b/drivers/staging/westbridge/astoria/block/cyasblkdev_block.c index 842cd9214a5e..289729daba80 100644 --- a/drivers/staging/westbridge/astoria/block/cyasblkdev_block.c +++ b/drivers/staging/westbridge/astoria/block/cyasblkdev_block.c @@ -1191,7 +1191,7 @@ static int cyasblkdev_add_disks(int bus_num, bd->user_disk_1->first_minor = (devidx + 1) << CYASBLKDEV_SHIFT; bd->user_disk_1->minors = 8; bd->user_disk_1->fops = &cyasblkdev_bdops; - bd->user_disk_0->events = DISK_EVENT_MEDIA_CHANGE; + bd->user_disk_1->events = DISK_EVENT_MEDIA_CHANGE; bd->user_disk_1->private_data = bd; bd->user_disk_1->queue = bd->queue.queue; bd->dbgprn_flags = DBGPRN_RD_RQ;