diff options
author | Jens Axboe <jens.axboe@oracle.com> | 2008-02-19 04:20:37 -0500 |
---|---|---|
committer | Jens Axboe <jens.axboe@oracle.com> | 2008-02-19 04:20:37 -0500 |
commit | e164094964e6e20fe7fce418e06a9dce952bb7a4 (patch) | |
tree | 99ff5c6dbf5bccad8a1172bc0fb5a5f4a079bae3 /block/elevator.c | |
parent | ffc4e7595734cf768fa60cea8a4d545dfef8231a (diff) |
elevator: make elevator_get() attempt to load the appropriate module
Currently we fail if someone requests a valid io scheduler, but it's
modular and not currently loaded. That can happen from a driver init
asking for a different scheduler, or online switching through sysfs
as requested by a user.
This patch makes elevator_get() request_module() to attempt to load
the appropriate module, instead of requiring that done manually.
Signed-off-by: Jens Axboe <jens.axboe@oracle.com>
Diffstat (limited to 'block/elevator.c')
-rw-r--r-- | block/elevator.c | 15 |
1 files changed, 15 insertions, 0 deletions
diff --git a/block/elevator.c b/block/elevator.c index bafbae0344d3..88318c383608 100644 --- a/block/elevator.c +++ b/block/elevator.c | |||
@@ -134,6 +134,21 @@ static struct elevator_type *elevator_get(const char *name) | |||
134 | spin_lock(&elv_list_lock); | 134 | spin_lock(&elv_list_lock); |
135 | 135 | ||
136 | e = elevator_find(name); | 136 | e = elevator_find(name); |
137 | if (!e) { | ||
138 | char elv[ELV_NAME_MAX + strlen("-iosched")]; | ||
139 | |||
140 | spin_unlock(&elv_list_lock); | ||
141 | |||
142 | if (!strcmp(name, "anticipatory")) | ||
143 | sprintf(elv, "as-iosched"); | ||
144 | else | ||
145 | sprintf(elv, "%s-iosched", name); | ||
146 | |||
147 | request_module(elv); | ||
148 | spin_lock(&elv_list_lock); | ||
149 | e = elevator_find(name); | ||
150 | } | ||
151 | |||
137 | if (e && !try_module_get(e->elevator_owner)) | 152 | if (e && !try_module_get(e->elevator_owner)) |
138 | e = NULL; | 153 | e = NULL; |
139 | 154 | ||