block: fix elevator_get_by_features()
authorJens Axboe <axboe@kernel.dk>
Fri, 6 Sep 2019 13:02:31 +0000 (07:02 -0600)
committerJens Axboe <axboe@kernel.dk>
Fri, 6 Sep 2019 13:02:31 +0000 (07:02 -0600)
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: a0958ba7fcdc ("block: Improve default elevator selection")
Reported-by: Julia Lawall <julia.lawall@lip6.fr>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
block/elevator.c

index 096a670d22d7009a050a30316cc83c72b33b2829..bba10e83478a0902dc883e7924a6f5cb66bec83b 100644 (file)
@@ -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)
 {
-       struct elevator_type *e;
+       struct elevator_type *e, *found = NULL;
 
        spin_lock(&elv_list_lock);
 
        list_for_each_entry(e, &elv_list, list) {
                if (elv_support_features(e->elevator_features,
-                                        q->required_elevator_features))
+                                        q->required_elevator_features)) {
+                       found = e;
                        break;
+               }
        }
 
-       if (e && !try_module_get(e->elevator_owner))
-               e = NULL;
+       if (found && !try_module_get(found->elevator_owner))
+               found = NULL;
 
        spin_unlock(&elv_list_lock);
-
-       return e;
+       return found;
 }
 
 /*