From: Hugh Dickins 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); } /* _