elevator: make elevator_get() attempt to load the appropriate module
authorJens Axboe <jens.axboe@oracle.com>
Tue, 19 Feb 2008 09:20:37 +0000 (10:20 +0100)
committerJens Axboe <jens.axboe@oracle.com>
Tue, 19 Feb 2008 09:20:37 +0000 (10:20 +0100)
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>
block/elevator.c

index bafbae0344d319e909e3e7add07467b1c0463a73..88318c383608defa5018bdfa929918c767c8d7fa 100644 (file)
@@ -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;