mirror of
https://github.com/edk2-porting/linux-next.git
synced 2024-12-17 01:34:00 +08:00
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: a0958ba7fc
("block: Improve default elevator selection")
Reported-by: Julia Lawall <julia.lawall@lip6.fr>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
This commit is contained in:
parent
ebddd2a153
commit
a26142559c
@ -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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
Loading…
Reference in New Issue
Block a user