| From 0a58e077eb600d1efd7e54ad9926a75a39d7f8ae Mon Sep 17 00:00:00 2001 |
| From: James Bottomley <James.Bottomley@suse.de> |
| Date: Wed, 18 May 2011 16:20:10 +0200 |
| Subject: block: add proper state guards to __elv_next_request |
| |
| From: James Bottomley <James.Bottomley@suse.de> |
| |
| commit 0a58e077eb600d1efd7e54ad9926a75a39d7f8ae upstream. |
| |
| blk_cleanup_queue() calls elevator_exit() and after this, we can't |
| touch the elevator without oopsing. __elv_next_request() must check |
| for this state because in the refcounted queue model, we can still |
| call it after blk_cleanup_queue() has been called. |
| |
| This was reported as causing an oops attributable to scsi. |
| |
| Signed-off-by: James Bottomley <James.Bottomley@suse.de> |
| Signed-off-by: Jens Axboe <jaxboe@fusionio.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| --- |
| block/blk.h | 3 ++- |
| 1 file changed, 2 insertions(+), 1 deletion(-) |
| |
| --- a/block/blk.h |
| +++ b/block/blk.h |
| @@ -62,7 +62,8 @@ static inline struct request *__elv_next |
| return rq; |
| } |
| |
| - if (!q->elevator->ops->elevator_dispatch_fn(q, 0)) |
| + if (test_bit(QUEUE_FLAG_DEAD, &q->queue_flags) || |
| + !q->elevator->ops->elevator_dispatch_fn(q, 0)) |
| return NULL; |
| } |
| } |