aboutsummaryrefslogtreecommitdiffstats
path: root/block/elevator.c
diff options
context:
space:
mode:
authorLinas Vepstas <linas@austin.ibm.com>2007-01-23 13:40:54 -0500
committerLinus Torvalds <torvalds@woody.linux-foundation.org>2007-01-23 14:01:17 -0500
commit95543179f158b4891c5dc49004853ce081e8d794 (patch)
tree39cc1ae27c53bc7ac7cc6401afc8ecee69b76b0f /block/elevator.c
parent3a7122923e87fc5cdf8affa1845924a0def4657d (diff)
[PATCH] elevator: move clearing of unplug flag earlier
A flag was recently added to the elevator code to avoid performing an unplug when reuests are being re-queued. The goal of this flag was to avoid a deep recursion that can occur when re-queueing requests after a SCSI device/host reset. See http://lkml.org/lkml/2006/5/17/254 However, that fix added the flag near the bottom of a case statement, where an earlier break (in an if statement) could transport one out of the case, without setting the flag. This patch sets the flag earlier in the case statement. I re-discovered the deep recursion recently during testing; I was told that it was a known problem, and the fix to it was in the kernel I was testing. Indeed it was ... but it didn't fix the bug. With the patch below, I no longer see the bug. Signed-off by: Linas Vepstas <linas@austin.ibm.com> Signed-off-by: Jens Axboe <axboe@suse.de> Cc: Chris Wright <chrisw@sous-sol.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'block/elevator.c')
-rw-r--r--block/elevator.c11
1 files changed, 6 insertions, 5 deletions
diff --git a/block/elevator.c b/block/elevator.c
index 536be740ba4e..f6dafa8c7c4d 100644
--- a/block/elevator.c
+++ b/block/elevator.c
@@ -590,6 +590,12 @@ void elv_insert(request_queue_t *q, struct request *rq, int where)
590 */ 590 */
591 rq->cmd_flags |= REQ_SOFTBARRIER; 591 rq->cmd_flags |= REQ_SOFTBARRIER;
592 592
593 /*
594 * Most requeues happen because of a busy condition,
595 * don't force unplug of the queue for that case.
596 */
597 unplug_it = 0;
598
593 if (q->ordseq == 0) { 599 if (q->ordseq == 0) {
594 list_add(&rq->queuelist, &q->queue_head); 600 list_add(&rq->queuelist, &q->queue_head);
595 break; 601 break;
@@ -604,11 +610,6 @@ void elv_insert(request_queue_t *q, struct request *rq, int where)
604 } 610 }
605 611
606 list_add_tail(&rq->queuelist, pos); 612 list_add_tail(&rq->queuelist, pos);
607 /*
608 * most requeues happen because of a busy condition, don't
609 * force unplug of the queue for that case.
610 */
611 unplug_it = 0;
612 break; 613 break;
613 614
614 default: 615 default: