aboutsummaryrefslogtreecommitdiffstats
path: root/block
diff options
context:
space:
mode:
authorJens Axboe <jens.axboe@oracle.com>2008-02-19 10:20:37 +0100
committerJens Axboe <jens.axboe@oracle.com>2008-02-19 10:20:37 +0100
commite164094964e6e20fe7fce418e06a9dce952bb7a4 (patch)
tree99ff5c6dbf5bccad8a1172bc0fb5a5f4a079bae3 /block
parentffc4e7595734cf768fa60cea8a4d545dfef8231a (diff)
downloadkernel_samsung_smdk4412-e164094964e6e20fe7fce418e06a9dce952bb7a4.zip
kernel_samsung_smdk4412-e164094964e6e20fe7fce418e06a9dce952bb7a4.tar.gz
kernel_samsung_smdk4412-e164094964e6e20fe7fce418e06a9dce952bb7a4.tar.bz2
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')
-rw-r--r--block/elevator.c15
1 files changed, 15 insertions, 0 deletions
diff --git a/block/elevator.c b/block/elevator.c
index bafbae0..88318c3 100644
--- a/block/elevator.c
+++ b/block/elevator.c
@@ -134,6 +134,21 @@ static struct elevator_type *elevator_get(const char *name)
spin_lock(&elv_list_lock);
e = elevator_find(name);
+ if (!e) {
+ char elv[ELV_NAME_MAX + strlen("-iosched")];
+
+ spin_unlock(&elv_list_lock);
+
+ if (!strcmp(name, "anticipatory"))
+ sprintf(elv, "as-iosched");
+ else
+ sprintf(elv, "%s-iosched", name);
+
+ request_module(elv);
+ spin_lock(&elv_list_lock);
+ e = elevator_find(name);
+ }
+
if (e && !try_module_get(e->elevator_owner))
e = NULL;