Commit a2614255 authored by Jens Axboe's avatar Jens Axboe

block: fix elevator_get_by_features()

The lookup logic is broken - 'e' will never be NULL, even if the
list is empty. Maintain lookup hit in a separate variable instead.

Fixes: a0958ba7 ("block: Improve default elevator selection")
Reported-by: default avatarJulia Lawall <julia.lawall@lip6.fr>
Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
parent ebddd2a1
...@@ -668,22 +668,23 @@ static struct elevator_type *elevator_get_default(struct request_queue *q) ...@@ -668,22 +668,23 @@ static struct elevator_type *elevator_get_default(struct request_queue *q)
*/ */
static struct elevator_type *elevator_get_by_features(struct request_queue *q) static struct elevator_type *elevator_get_by_features(struct request_queue *q)
{ {
struct elevator_type *e; struct elevator_type *e, *found = NULL;
spin_lock(&elv_list_lock); spin_lock(&elv_list_lock);
list_for_each_entry(e, &elv_list, list) { list_for_each_entry(e, &elv_list, list) {
if (elv_support_features(e->elevator_features, if (elv_support_features(e->elevator_features,
q->required_elevator_features)) q->required_elevator_features)) {
found = e;
break; break;
}
} }
if (e && !try_module_get(e->elevator_owner)) if (found && !try_module_get(found->elevator_owner))
e = NULL; found = NULL;
spin_unlock(&elv_list_lock); spin_unlock(&elv_list_lock);
return found;
return e;
} }
/* /*
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment