return false;
}
-/**
- * elevator_find - Find an elevator
- * @name: Name of the elevator to find
- * @required_features: Features that the elevator must provide
- *
- * Return the first registered scheduler with name @name and supporting the
- * features @required_features and NULL otherwise.
- */
-static struct elevator_type *elevator_find(const char *name,
- unsigned int required_features)
+static struct elevator_type *elevator_find_get(struct request_queue *q,
+ const char *name)
{
- struct elevator_type *e;
+ struct elevator_type *e, *found = NULL;
+ spin_lock(&elv_list_lock);
list_for_each_entry(e, &elv_list, list) {
- if (elevator_match(e, name, required_features))
- return e;
+ if (elevator_match(e, name, q->required_elevator_features)) {
+ found = e;
+ break;
+ }
}
-
- return NULL;
+ if (found && !try_module_get(found->elevator_owner))
+ found = NULL;
+ spin_unlock(&elv_list_lock);
+ return found;
}
static void elevator_put(struct elevator_type *e)
module_put(e->elevator_owner);
}
-static struct elevator_type *elevator_get(struct request_queue *q,
- const char *name, bool try_loading)
-{
- struct elevator_type *e;
-
- spin_lock(&elv_list_lock);
-
- e = elevator_find(name, q->required_elevator_features);
- if (!e && try_loading) {
- spin_unlock(&elv_list_lock);
- request_module("%s-iosched", name);
- spin_lock(&elv_list_lock);
- e = elevator_find(name, q->required_elevator_features);
- }
-
- if (e && !try_module_get(e->elevator_owner))
- e = NULL;
-
- spin_unlock(&elv_list_lock);
- return e;
-}
-
static struct kobj_type elv_ktype;
struct elevator_queue *elevator_alloc(struct request_queue *q,
!blk_mq_is_shared_tags(q->tag_set->flags))
return NULL;
- return elevator_get(q, "mq-deadline", false);
+ return elevator_find_get(q, "mq-deadline");
}
/*
if (q->elevator && elevator_match(q->elevator->type, name, 0))
return 0;
- e = elevator_get(q, name, true);
- if (!e)
- return -EINVAL;
+ e = elevator_find_get(q, name);
+ if (!e) {
+ request_module("%s-iosched", name);
+ e = elevator_find_get(q, name);
+ if (!e)
+ return -EINVAL;
+ }
return elevator_switch(q, e);
}