diff options
Diffstat (limited to 'block/elevator.c')
-rw-r--r-- | block/elevator.c | 45 |
1 files changed, 15 insertions, 30 deletions
diff --git a/block/elevator.c b/block/elevator.c index c9f424d5399c..96a61e029ce5 100644 --- a/block/elevator.c +++ b/block/elevator.c | |||
@@ -139,35 +139,16 @@ static int elevator_attach(request_queue_t *q, struct elevator_type *e, | |||
139 | 139 | ||
140 | static char chosen_elevator[16]; | 140 | static char chosen_elevator[16]; |
141 | 141 | ||
142 | static void elevator_setup_default(void) | 142 | static int __init elevator_setup(char *str) |
143 | { | 143 | { |
144 | struct elevator_type *e; | ||
145 | |||
146 | /* | ||
147 | * If default has not been set, use the compiled-in selection. | ||
148 | */ | ||
149 | if (!chosen_elevator[0]) | ||
150 | strcpy(chosen_elevator, CONFIG_DEFAULT_IOSCHED); | ||
151 | |||
152 | /* | 144 | /* |
153 | * Be backwards-compatible with previous kernels, so users | 145 | * Be backwards-compatible with previous kernels, so users |
154 | * won't get the wrong elevator. | 146 | * won't get the wrong elevator. |
155 | */ | 147 | */ |
156 | if (!strcmp(chosen_elevator, "as")) | 148 | if (!strcmp(str, "as")) |
157 | strcpy(chosen_elevator, "anticipatory"); | 149 | strcpy(chosen_elevator, "anticipatory"); |
158 | |||
159 | /* | ||
160 | * If the given scheduler is not available, fall back to the default | ||
161 | */ | ||
162 | if ((e = elevator_find(chosen_elevator))) | ||
163 | elevator_put(e); | ||
164 | else | 150 | else |
165 | strcpy(chosen_elevator, CONFIG_DEFAULT_IOSCHED); | 151 | strncpy(chosen_elevator, str, sizeof(chosen_elevator) - 1); |
166 | } | ||
167 | |||
168 | static int __init elevator_setup(char *str) | ||
169 | { | ||
170 | strncpy(chosen_elevator, str, sizeof(chosen_elevator) - 1); | ||
171 | return 0; | 152 | return 0; |
172 | } | 153 | } |
173 | 154 | ||
@@ -184,14 +165,16 @@ int elevator_init(request_queue_t *q, char *name) | |||
184 | q->end_sector = 0; | 165 | q->end_sector = 0; |
185 | q->boundary_rq = NULL; | 166 | q->boundary_rq = NULL; |
186 | 167 | ||
187 | elevator_setup_default(); | 168 | if (name && !(e = elevator_get(name))) |
169 | return -EINVAL; | ||
188 | 170 | ||
189 | if (!name) | 171 | if (!e && *chosen_elevator && !(e = elevator_get(chosen_elevator))) |
190 | name = chosen_elevator; | 172 | printk("I/O scheduler %s not found\n", chosen_elevator); |
191 | 173 | ||
192 | e = elevator_get(name); | 174 | if (!e && !(e = elevator_get(CONFIG_DEFAULT_IOSCHED))) { |
193 | if (!e) | 175 | printk("Default I/O scheduler not found, using no-op\n"); |
194 | return -EINVAL; | 176 | e = elevator_get("noop"); |
177 | } | ||
195 | 178 | ||
196 | eq = kmalloc(sizeof(struct elevator_queue), GFP_KERNEL); | 179 | eq = kmalloc(sizeof(struct elevator_queue), GFP_KERNEL); |
197 | if (!eq) { | 180 | if (!eq) { |
@@ -669,8 +652,10 @@ int elv_register(struct elevator_type *e) | |||
669 | spin_unlock_irq(&elv_list_lock); | 652 | spin_unlock_irq(&elv_list_lock); |
670 | 653 | ||
671 | printk(KERN_INFO "io scheduler %s registered", e->elevator_name); | 654 | printk(KERN_INFO "io scheduler %s registered", e->elevator_name); |
672 | if (!strcmp(e->elevator_name, chosen_elevator)) | 655 | if (!strcmp(e->elevator_name, chosen_elevator) || |
673 | printk(" (default)"); | 656 | (!*chosen_elevator && |
657 | !strcmp(e->elevator_name, CONFIG_DEFAULT_IOSCHED))) | ||
658 | printk(" (default)"); | ||
674 | printk("\n"); | 659 | printk("\n"); |
675 | return 0; | 660 | return 0; |
676 | } | 661 | } |