From: Hugh Dickins <hugh@veritas.com>

Fix a BUG_ON() in as_antic_waitreq()


 25-akpm/drivers/block/as-iosched.c |    7 +++++--
 1 files changed, 5 insertions(+), 2 deletions(-)

diff -puN drivers/block/as-iosched.c~as-locking-fix drivers/block/as-iosched.c
--- 25/drivers/block/as-iosched.c~as-locking-fix	Wed Apr  2 12:12:10 2003
+++ 25-akpm/drivers/block/as-iosched.c	Wed Apr  2 12:12:11 2003
@@ -651,12 +651,15 @@ static void as_antic_timeout(unsigned lo
 {
 	struct request_queue *q = (struct request_queue *)data;
 	struct as_data *ad = q->elevator.elevator_data;
-	int status = ad->antic_status;
+	unsigned long flags;
 
-	if (status == ANTIC_WAIT_REQ || status == ANTIC_WAIT_NEXT) {
+	spin_lock_irqsave(q->queue_lock, flags);
+	if (ad->antic_status == ANTIC_WAIT_REQ
+			|| ad->antic_status == ANTIC_WAIT_NEXT) {
 		ad->antic_status = ANTIC_FINISHED;
 		kblockd_schedule_work(&ad->antic_work);
 	}
+	spin_unlock_irqrestore(q->queue_lock, flags);
 }
 
 /*

_