diff options
author | Jens Axboe <jens.axboe@oracle.com> | 2008-02-19 10:20:37 +0100 |
---|---|---|
committer | Jens Axboe <jens.axboe@oracle.com> | 2008-02-19 10:20:37 +0100 |
commit | e164094964e6e20fe7fce418e06a9dce952bb7a4 (patch) | |
tree | 99ff5c6dbf5bccad8a1172bc0fb5a5f4a079bae3 | |
parent | ffc4e7595734cf768fa60cea8a4d545dfef8231a (diff) | |
download | op-kernel-dev-e164094964e6e20fe7fce418e06a9dce952bb7a4.zip op-kernel-dev-e164094964e6e20fe7fce418e06a9dce952bb7a4.tar.gz |
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>
-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 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; |