]>
Commit | Line | Data |
---|---|---|
3ef2c9d6 GKH |
1 | From 0a58e077eb600d1efd7e54ad9926a75a39d7f8ae Mon Sep 17 00:00:00 2001 |
2 | From: James Bottomley <James.Bottomley@suse.de> | |
3 | Date: Wed, 18 May 2011 16:20:10 +0200 | |
4 | Subject: block: add proper state guards to __elv_next_request | |
5 | ||
6 | From: James Bottomley <James.Bottomley@suse.de> | |
7 | ||
8 | commit 0a58e077eb600d1efd7e54ad9926a75a39d7f8ae upstream. | |
9 | ||
10 | blk_cleanup_queue() calls elevator_exit() and after this, we can't | |
11 | touch the elevator without oopsing. __elv_next_request() must check | |
12 | for this state because in the refcounted queue model, we can still | |
13 | call it after blk_cleanup_queue() has been called. | |
14 | ||
15 | This was reported as causing an oops attributable to scsi. | |
16 | ||
17 | Signed-off-by: James Bottomley <James.Bottomley@suse.de> | |
18 | Signed-off-by: Jens Axboe <jaxboe@fusionio.com> | |
19 | Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> | |
20 | ||
21 | --- | |
22 | block/blk.h | 3 ++- | |
23 | 1 file changed, 2 insertions(+), 1 deletion(-) | |
24 | ||
25 | --- a/block/blk.h | |
26 | +++ b/block/blk.h | |
27 | @@ -68,7 +68,8 @@ static inline struct request *__elv_next | |
28 | return rq; | |
29 | } | |
30 | ||
31 | - if (!q->elevator->ops->elevator_dispatch_fn(q, 0)) | |
32 | + if (test_bit(QUEUE_FLAG_DEAD, &q->queue_flags) || | |
33 | + !q->elevator->ops->elevator_dispatch_fn(q, 0)) | |
34 | return NULL; | |
35 | } | |
36 | } |