1 /* 2 * Block device elevator/IO-scheduler. 3 * 4 * Copyright (C) 2000 Andrea Arcangeli <andrea@suse.de> SuSE 5 * 6 * 30042000 Jens Axboe <axboe@suse.de> : 7 * 8 * Split the elevator a bit so that it is possible to choose a different 9 * one or even write a new "plug in". There are three pieces: 10 * - elevator_fn, inserts a new request in the queue list 11 * - elevator_merge_fn, decides whether a new buffer can be merged with 12 * an existing request 13 * - elevator_dequeue_fn, called when a request is taken off the active list 14 * 15 * 20082000 Dave Jones <davej@suse.de> : 16 * Removed tests for max-bomb-segments, which was breaking elvtune 17 * when run without -bN 18 * 19 * Jens: 20 * - Rework again to work with bio instead of buffer_heads 21 * - loose bi_dev comparisons, partition handling is right now 22 * - completely modularize elevator setup and teardown 23 * 24 */ 25 #include <linux/kernel.h> 26 #include <linux/fs.h> 27 #include <linux/blkdev.h> 28 #include <linux/elevator.h> 29 #include <linux/bio.h> 30 #include <linux/config.h> 31 #include <linux/module.h> 32 #include <linux/slab.h> 33 #include <linux/init.h> 34 #include <linux/compiler.h> 35 #include <linux/delay.h> 36 37 #include <asm/uaccess.h> 38 39 static DEFINE_SPINLOCK(elv_list_lock); 40 static LIST_HEAD(elv_list); 41 42 /* 43 * can we safely merge with this request? 44 */ 45 inline int elv_rq_merge_ok(struct request *rq, struct bio *bio) 46 { 47 if (!rq_mergeable(rq)) 48 return 0; 49 50 /* 51 * different data direction or already started, don't merge 52 */ 53 if (bio_data_dir(bio) != rq_data_dir(rq)) 54 return 0; 55 56 /* 57 * same device and no special stuff set, merge is ok 58 */ 59 if (rq->rq_disk == bio->bi_bdev->bd_disk && 60 !rq->waiting && !rq->special) 61 return 1; 62 63 return 0; 64 } 65 EXPORT_SYMBOL(elv_rq_merge_ok); 66 67 static inline int elv_try_merge(struct request *__rq, struct bio *bio) 68 { 69 int ret = ELEVATOR_NO_MERGE; 70 71 /* 72 * we can merge and sequence is ok, check if it's possible 73 */ 74 if (elv_rq_merge_ok(__rq, bio)) { 75 if (__rq->sector + __rq->nr_sectors == bio->bi_sector) 76 ret = ELEVATOR_BACK_MERGE; 77 else if (__rq->sector - bio_sectors(bio) == bio->bi_sector) 78 ret = ELEVATOR_FRONT_MERGE; 79 } 80 81 return ret; 82 } 83 84 static struct elevator_type *elevator_find(const char *name) 85 { 86 struct elevator_type *e = NULL; 87 struct list_head *entry; 88 89 list_for_each(entry, &elv_list) { 90 struct elevator_type *__e; 91 92 __e = list_entry(entry, struct elevator_type, list); 93 94 if (!strcmp(__e->elevator_name, name)) { 95 e = __e; 96 break; 97 } 98 } 99 100 return e; 101 } 102 103 static void elevator_put(struct elevator_type *e) 104 { 105 module_put(e->elevator_owner); 106 } 107 108 static struct elevator_type *elevator_get(const char *name) 109 { 110 struct elevator_type *e; 111 112 spin_lock_irq(&elv_list_lock); 113 114 e = elevator_find(name); 115 if (e && !try_module_get(e->elevator_owner)) 116 e = NULL; 117 118 spin_unlock_irq(&elv_list_lock); 119 120 return e; 121 } 122 123 static int elevator_attach(request_queue_t *q, struct elevator_type *e, 124 struct elevator_queue *eq) 125 { 126 int ret = 0; 127 128 memset(eq, 0, sizeof(*eq)); 129 eq->ops = &e->ops; 130 eq->elevator_type = e; 131 132 q->elevator = eq; 133 134 if (eq->ops->elevator_init_fn) 135 ret = eq->ops->elevator_init_fn(q, eq); 136 137 return ret; 138 } 139 140 static char chosen_elevator[16]; 141 142 static void elevator_setup_default(void) 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 /* 153 * If the given scheduler is not available, fall back to no-op. 154 */ 155 if ((e = elevator_find(chosen_elevator))) 156 elevator_put(e); 157 else 158 strcpy(chosen_elevator, "noop"); 159 } 160 161 static int __init elevator_setup(char *str) 162 { 163 strncpy(chosen_elevator, str, sizeof(chosen_elevator) - 1); 164 return 0; 165 } 166 167 __setup("elevator=", elevator_setup); 168 169 int elevator_init(request_queue_t *q, char *name) 170 { 171 struct elevator_type *e = NULL; 172 struct elevator_queue *eq; 173 int ret = 0; 174 175 INIT_LIST_HEAD(&q->queue_head); 176 q->last_merge = NULL; 177 q->end_sector = 0; 178 q->boundary_rq = NULL; 179 180 elevator_setup_default(); 181 182 if (!name) 183 name = chosen_elevator; 184 185 e = elevator_get(name); 186 if (!e) 187 return -EINVAL; 188 189 eq = kmalloc(sizeof(struct elevator_queue), GFP_KERNEL); 190 if (!eq) { 191 elevator_put(e); 192 return -ENOMEM; 193 } 194 195 ret = elevator_attach(q, e, eq); 196 if (ret) { 197 kfree(eq); 198 elevator_put(e); 199 } 200 201 return ret; 202 } 203 204 void elevator_exit(elevator_t *e) 205 { 206 if (e->ops->elevator_exit_fn) 207 e->ops->elevator_exit_fn(e); 208 209 elevator_put(e->elevator_type); 210 e->elevator_type = NULL; 211 kfree(e); 212 } 213 214 /* 215 * Insert rq into dispatch queue of q. Queue lock must be held on 216 * entry. If sort != 0, rq is sort-inserted; otherwise, rq will be 217 * appended to the dispatch queue. To be used by specific elevators. 218 */ 219 void elv_dispatch_sort(request_queue_t *q, struct request *rq) 220 { 221 sector_t boundary; 222 struct list_head *entry; 223 224 if (q->last_merge == rq) 225 q->last_merge = NULL; 226 q->nr_sorted--; 227 228 boundary = q->end_sector; 229 230 list_for_each_prev(entry, &q->queue_head) { 231 struct request *pos = list_entry_rq(entry); 232 233 if (pos->flags & (REQ_SOFTBARRIER|REQ_HARDBARRIER|REQ_STARTED)) 234 break; 235 if (rq->sector >= boundary) { 236 if (pos->sector < boundary) 237 continue; 238 } else { 239 if (pos->sector >= boundary) 240 break; 241 } 242 if (rq->sector >= pos->sector) 243 break; 244 } 245 246 list_add(&rq->queuelist, entry); 247 } 248 249 int elv_merge(request_queue_t *q, struct request **req, struct bio *bio) 250 { 251 elevator_t *e = q->elevator; 252 int ret; 253 254 if (q->last_merge) { 255 ret = elv_try_merge(q->last_merge, bio); 256 if (ret != ELEVATOR_NO_MERGE) { 257 *req = q->last_merge; 258 return ret; 259 } 260 } 261 262 if (e->ops->elevator_merge_fn) 263 return e->ops->elevator_merge_fn(q, req, bio); 264 265 return ELEVATOR_NO_MERGE; 266 } 267 268 void elv_merged_request(request_queue_t *q, struct request *rq) 269 { 270 elevator_t *e = q->elevator; 271 272 if (e->ops->elevator_merged_fn) 273 e->ops->elevator_merged_fn(q, rq); 274 275 q->last_merge = rq; 276 } 277 278 void elv_merge_requests(request_queue_t *q, struct request *rq, 279 struct request *next) 280 { 281 elevator_t *e = q->elevator; 282 283 if (e->ops->elevator_merge_req_fn) 284 e->ops->elevator_merge_req_fn(q, rq, next); 285 q->nr_sorted--; 286 287 q->last_merge = rq; 288 } 289 290 void elv_requeue_request(request_queue_t *q, struct request *rq) 291 { 292 elevator_t *e = q->elevator; 293 294 /* 295 * it already went through dequeue, we need to decrement the 296 * in_flight count again 297 */ 298 if (blk_account_rq(rq)) { 299 q->in_flight--; 300 if (blk_sorted_rq(rq) && e->ops->elevator_deactivate_req_fn) 301 e->ops->elevator_deactivate_req_fn(q, rq); 302 } 303 304 rq->flags &= ~REQ_STARTED; 305 306 __elv_add_request(q, rq, ELEVATOR_INSERT_REQUEUE, 0); 307 } 308 309 static void elv_drain_elevator(request_queue_t *q) 310 { 311 static int printed; 312 while (q->elevator->ops->elevator_dispatch_fn(q, 1)) 313 ; 314 if (q->nr_sorted == 0) 315 return; 316 if (printed++ < 10) { 317 printk(KERN_ERR "%s: forced dispatching is broken " 318 "(nr_sorted=%u), please report this\n", 319 q->elevator->elevator_type->elevator_name, q->nr_sorted); 320 } 321 } 322 323 void __elv_add_request(request_queue_t *q, struct request *rq, int where, 324 int plug) 325 { 326 struct list_head *pos; 327 unsigned ordseq; 328 329 if (q->ordcolor) 330 rq->flags |= REQ_ORDERED_COLOR; 331 332 if (rq->flags & (REQ_SOFTBARRIER | REQ_HARDBARRIER)) { 333 /* 334 * toggle ordered color 335 */ 336 q->ordcolor ^= 1; 337 338 /* 339 * barriers implicitly indicate back insertion 340 */ 341 if (where == ELEVATOR_INSERT_SORT) 342 where = ELEVATOR_INSERT_BACK; 343 344 /* 345 * this request is scheduling boundary, update end_sector 346 */ 347 if (blk_fs_request(rq)) { 348 q->end_sector = rq_end_sector(rq); 349 q->boundary_rq = rq; 350 } 351 } else if (!(rq->flags & REQ_ELVPRIV) && where == ELEVATOR_INSERT_SORT) 352 where = ELEVATOR_INSERT_BACK; 353 354 if (plug) 355 blk_plug_device(q); 356 357 rq->q = q; 358 359 switch (where) { 360 case ELEVATOR_INSERT_FRONT: 361 rq->flags |= REQ_SOFTBARRIER; 362 363 list_add(&rq->queuelist, &q->queue_head); 364 break; 365 366 case ELEVATOR_INSERT_BACK: 367 rq->flags |= REQ_SOFTBARRIER; 368 elv_drain_elevator(q); 369 list_add_tail(&rq->queuelist, &q->queue_head); 370 /* 371 * We kick the queue here for the following reasons. 372 * - The elevator might have returned NULL previously 373 * to delay requests and returned them now. As the 374 * queue wasn't empty before this request, ll_rw_blk 375 * won't run the queue on return, resulting in hang. 376 * - Usually, back inserted requests won't be merged 377 * with anything. There's no point in delaying queue 378 * processing. 379 */ 380 blk_remove_plug(q); 381 q->request_fn(q); 382 break; 383 384 case ELEVATOR_INSERT_SORT: 385 BUG_ON(!blk_fs_request(rq)); 386 rq->flags |= REQ_SORTED; 387 q->nr_sorted++; 388 if (q->last_merge == NULL && rq_mergeable(rq)) 389 q->last_merge = rq; 390 /* 391 * Some ioscheds (cfq) run q->request_fn directly, so 392 * rq cannot be accessed after calling 393 * elevator_add_req_fn. 394 */ 395 q->elevator->ops->elevator_add_req_fn(q, rq); 396 break; 397 398 case ELEVATOR_INSERT_REQUEUE: 399 /* 400 * If ordered flush isn't in progress, we do front 401 * insertion; otherwise, requests should be requeued 402 * in ordseq order. 403 */ 404 rq->flags |= REQ_SOFTBARRIER; 405 406 if (q->ordseq == 0) { 407 list_add(&rq->queuelist, &q->queue_head); 408 break; 409 } 410 411 ordseq = blk_ordered_req_seq(rq); 412 413 list_for_each(pos, &q->queue_head) { 414 struct request *pos_rq = list_entry_rq(pos); 415 if (ordseq <= blk_ordered_req_seq(pos_rq)) 416 break; 417 } 418 419 list_add_tail(&rq->queuelist, pos); 420 break; 421 422 default: 423 printk(KERN_ERR "%s: bad insertion point %d\n", 424 __FUNCTION__, where); 425 BUG(); 426 } 427 428 if (blk_queue_plugged(q)) { 429 int nrq = q->rq.count[READ] + q->rq.count[WRITE] 430 - q->in_flight; 431 432 if (nrq >= q->unplug_thresh) 433 __generic_unplug_device(q); 434 } 435 } 436 437 void elv_add_request(request_queue_t *q, struct request *rq, int where, 438 int plug) 439 { 440 unsigned long flags; 441 442 spin_lock_irqsave(q->queue_lock, flags); 443 __elv_add_request(q, rq, where, plug); 444 spin_unlock_irqrestore(q->queue_lock, flags); 445 } 446 447 static inline struct request *__elv_next_request(request_queue_t *q) 448 { 449 struct request *rq; 450 451 while (1) { 452 while (!list_empty(&q->queue_head)) { 453 rq = list_entry_rq(q->queue_head.next); 454 if (blk_do_ordered(q, &rq)) 455 return rq; 456 } 457 458 if (!q->elevator->ops->elevator_dispatch_fn(q, 0)) 459 return NULL; 460 } 461 } 462 463 struct request *elv_next_request(request_queue_t *q) 464 { 465 struct request *rq; 466 int ret; 467 468 while ((rq = __elv_next_request(q)) != NULL) { 469 if (!(rq->flags & REQ_STARTED)) { 470 elevator_t *e = q->elevator; 471 472 /* 473 * This is the first time the device driver 474 * sees this request (possibly after 475 * requeueing). Notify IO scheduler. 476 */ 477 if (blk_sorted_rq(rq) && 478 e->ops->elevator_activate_req_fn) 479 e->ops->elevator_activate_req_fn(q, rq); 480 481 /* 482 * just mark as started even if we don't start 483 * it, a request that has been delayed should 484 * not be passed by new incoming requests 485 */ 486 rq->flags |= REQ_STARTED; 487 } 488 489 if (!q->boundary_rq || q->boundary_rq == rq) { 490 q->end_sector = rq_end_sector(rq); 491 q->boundary_rq = NULL; 492 } 493 494 if ((rq->flags & REQ_DONTPREP) || !q->prep_rq_fn) 495 break; 496 497 ret = q->prep_rq_fn(q, rq); 498 if (ret == BLKPREP_OK) { 499 break; 500 } else if (ret == BLKPREP_DEFER) { 501 /* 502 * the request may have been (partially) prepped. 503 * we need to keep this request in the front to 504 * avoid resource deadlock. REQ_STARTED will 505 * prevent other fs requests from passing this one. 506 */ 507 rq = NULL; 508 break; 509 } else if (ret == BLKPREP_KILL) { 510 int nr_bytes = rq->hard_nr_sectors << 9; 511 512 if (!nr_bytes) 513 nr_bytes = rq->data_len; 514 515 blkdev_dequeue_request(rq); 516 rq->flags |= REQ_QUIET; 517 end_that_request_chunk(rq, 0, nr_bytes); 518 end_that_request_last(rq, 0); 519 } else { 520 printk(KERN_ERR "%s: bad return=%d\n", __FUNCTION__, 521 ret); 522 break; 523 } 524 } 525 526 return rq; 527 } 528 529 void elv_dequeue_request(request_queue_t *q, struct request *rq) 530 { 531 BUG_ON(list_empty(&rq->queuelist)); 532 533 list_del_init(&rq->queuelist); 534 535 /* 536 * the time frame between a request being removed from the lists 537 * and to it is freed is accounted as io that is in progress at 538 * the driver side. 539 */ 540 if (blk_account_rq(rq)) 541 q->in_flight++; 542 } 543 544 int elv_queue_empty(request_queue_t *q) 545 { 546 elevator_t *e = q->elevator; 547 548 if (!list_empty(&q->queue_head)) 549 return 0; 550 551 if (e->ops->elevator_queue_empty_fn) 552 return e->ops->elevator_queue_empty_fn(q); 553 554 return 1; 555 } 556 557 struct request *elv_latter_request(request_queue_t *q, struct request *rq) 558 { 559 elevator_t *e = q->elevator; 560 561 if (e->ops->elevator_latter_req_fn) 562 return e->ops->elevator_latter_req_fn(q, rq); 563 return NULL; 564 } 565 566 struct request *elv_former_request(request_queue_t *q, struct request *rq) 567 { 568 elevator_t *e = q->elevator; 569 570 if (e->ops->elevator_former_req_fn) 571 return e->ops->elevator_former_req_fn(q, rq); 572 return NULL; 573 } 574 575 int elv_set_request(request_queue_t *q, struct request *rq, struct bio *bio, 576 gfp_t gfp_mask) 577 { 578 elevator_t *e = q->elevator; 579 580 if (e->ops->elevator_set_req_fn) 581 return e->ops->elevator_set_req_fn(q, rq, bio, gfp_mask); 582 583 rq->elevator_private = NULL; 584 return 0; 585 } 586 587 void elv_put_request(request_queue_t *q, struct request *rq) 588 { 589 elevator_t *e = q->elevator; 590 591 if (e->ops->elevator_put_req_fn) 592 e->ops->elevator_put_req_fn(q, rq); 593 } 594 595 int elv_may_queue(request_queue_t *q, int rw, struct bio *bio) 596 { 597 elevator_t *e = q->elevator; 598 599 if (e->ops->elevator_may_queue_fn) 600 return e->ops->elevator_may_queue_fn(q, rw, bio); 601 602 return ELV_MQUEUE_MAY; 603 } 604 605 void elv_completed_request(request_queue_t *q, struct request *rq) 606 { 607 elevator_t *e = q->elevator; 608 609 /* 610 * request is released from the driver, io must be done 611 */ 612 if (blk_account_rq(rq)) { 613 struct request *first_rq = list_entry_rq(q->queue_head.next); 614 615 q->in_flight--; 616 617 /* 618 * Check if the queue is waiting for fs requests to be 619 * drained for flush sequence. 620 */ 621 if (q->ordseq && q->in_flight == 0 && 622 blk_ordered_cur_seq(q) == QUEUE_ORDSEQ_DRAIN && 623 blk_ordered_req_seq(first_rq) > QUEUE_ORDSEQ_DRAIN) { 624 blk_ordered_complete_seq(q, QUEUE_ORDSEQ_DRAIN, 0); 625 q->request_fn(q); 626 } 627 628 if (blk_sorted_rq(rq) && e->ops->elevator_completed_req_fn) 629 e->ops->elevator_completed_req_fn(q, rq); 630 } 631 } 632 633 int elv_register_queue(struct request_queue *q) 634 { 635 elevator_t *e = q->elevator; 636 637 e->kobj.parent = kobject_get(&q->kobj); 638 if (!e->kobj.parent) 639 return -EBUSY; 640 641 snprintf(e->kobj.name, KOBJ_NAME_LEN, "%s", "iosched"); 642 e->kobj.ktype = e->elevator_type->elevator_ktype; 643 644 return kobject_register(&e->kobj); 645 } 646 647 void elv_unregister_queue(struct request_queue *q) 648 { 649 if (q) { 650 elevator_t *e = q->elevator; 651 kobject_unregister(&e->kobj); 652 kobject_put(&q->kobj); 653 } 654 } 655 656 int elv_register(struct elevator_type *e) 657 { 658 spin_lock_irq(&elv_list_lock); 659 if (elevator_find(e->elevator_name)) 660 BUG(); 661 list_add_tail(&e->list, &elv_list); 662 spin_unlock_irq(&elv_list_lock); 663 664 printk(KERN_INFO "io scheduler %s registered", e->elevator_name); 665 if (!strcmp(e->elevator_name, chosen_elevator)) 666 printk(" (default)"); 667 printk("\n"); 668 return 0; 669 } 670 EXPORT_SYMBOL_GPL(elv_register); 671 672 void elv_unregister(struct elevator_type *e) 673 { 674 struct task_struct *g, *p; 675 676 /* 677 * Iterate every thread in the process to remove the io contexts. 678 */ 679 read_lock(&tasklist_lock); 680 do_each_thread(g, p) { 681 struct io_context *ioc = p->io_context; 682 if (ioc && ioc->cic) { 683 ioc->cic->exit(ioc->cic); 684 ioc->cic->dtor(ioc->cic); 685 ioc->cic = NULL; 686 } 687 if (ioc && ioc->aic) { 688 ioc->aic->exit(ioc->aic); 689 ioc->aic->dtor(ioc->aic); 690 ioc->aic = NULL; 691 } 692 } while_each_thread(g, p); 693 read_unlock(&tasklist_lock); 694 695 spin_lock_irq(&elv_list_lock); 696 list_del_init(&e->list); 697 spin_unlock_irq(&elv_list_lock); 698 } 699 EXPORT_SYMBOL_GPL(elv_unregister); 700 701 /* 702 * switch to new_e io scheduler. be careful not to introduce deadlocks - 703 * we don't free the old io scheduler, before we have allocated what we 704 * need for the new one. this way we have a chance of going back to the old 705 * one, if the new one fails init for some reason. 706 */ 707 static void elevator_switch(request_queue_t *q, struct elevator_type *new_e) 708 { 709 elevator_t *old_elevator, *e; 710 711 /* 712 * Allocate new elevator 713 */ 714 e = kmalloc(sizeof(elevator_t), GFP_KERNEL); 715 if (!e) 716 goto error; 717 718 /* 719 * Turn on BYPASS and drain all requests w/ elevator private data 720 */ 721 spin_lock_irq(q->queue_lock); 722 723 set_bit(QUEUE_FLAG_ELVSWITCH, &q->queue_flags); 724 725 elv_drain_elevator(q); 726 727 while (q->rq.elvpriv) { 728 blk_remove_plug(q); 729 q->request_fn(q); 730 spin_unlock_irq(q->queue_lock); 731 msleep(10); 732 spin_lock_irq(q->queue_lock); 733 elv_drain_elevator(q); 734 } 735 736 spin_unlock_irq(q->queue_lock); 737 738 /* 739 * unregister old elevator data 740 */ 741 elv_unregister_queue(q); 742 old_elevator = q->elevator; 743 744 /* 745 * attach and start new elevator 746 */ 747 if (elevator_attach(q, new_e, e)) 748 goto fail; 749 750 if (elv_register_queue(q)) 751 goto fail_register; 752 753 /* 754 * finally exit old elevator and turn off BYPASS. 755 */ 756 elevator_exit(old_elevator); 757 clear_bit(QUEUE_FLAG_ELVSWITCH, &q->queue_flags); 758 return; 759 760 fail_register: 761 /* 762 * switch failed, exit the new io scheduler and reattach the old 763 * one again (along with re-adding the sysfs dir) 764 */ 765 elevator_exit(e); 766 e = NULL; 767 fail: 768 q->elevator = old_elevator; 769 elv_register_queue(q); 770 clear_bit(QUEUE_FLAG_ELVSWITCH, &q->queue_flags); 771 kfree(e); 772 error: 773 elevator_put(new_e); 774 printk(KERN_ERR "elevator: switch to %s failed\n",new_e->elevator_name); 775 } 776 777 ssize_t elv_iosched_store(request_queue_t *q, const char *name, size_t count) 778 { 779 char elevator_name[ELV_NAME_MAX]; 780 size_t len; 781 struct elevator_type *e; 782 783 elevator_name[sizeof(elevator_name) - 1] = '\0'; 784 strncpy(elevator_name, name, sizeof(elevator_name) - 1); 785 len = strlen(elevator_name); 786 787 if (len && elevator_name[len - 1] == '\n') 788 elevator_name[len - 1] = '\0'; 789 790 e = elevator_get(elevator_name); 791 if (!e) { 792 printk(KERN_ERR "elevator: type %s not found\n", elevator_name); 793 return -EINVAL; 794 } 795 796 if (!strcmp(elevator_name, q->elevator->elevator_type->elevator_name)) { 797 elevator_put(e); 798 return count; 799 } 800 801 elevator_switch(q, e); 802 return count; 803 } 804 805 ssize_t elv_iosched_show(request_queue_t *q, char *name) 806 { 807 elevator_t *e = q->elevator; 808 struct elevator_type *elv = e->elevator_type; 809 struct list_head *entry; 810 int len = 0; 811 812 spin_lock_irq(q->queue_lock); 813 list_for_each(entry, &elv_list) { 814 struct elevator_type *__e; 815 816 __e = list_entry(entry, struct elevator_type, list); 817 if (!strcmp(elv->elevator_name, __e->elevator_name)) 818 len += sprintf(name+len, "[%s] ", elv->elevator_name); 819 else 820 len += sprintf(name+len, "%s ", __e->elevator_name); 821 } 822 spin_unlock_irq(q->queue_lock); 823 824 len += sprintf(len+name, "\n"); 825 return len; 826 } 827 828 EXPORT_SYMBOL(elv_dispatch_sort); 829 EXPORT_SYMBOL(elv_add_request); 830 EXPORT_SYMBOL(__elv_add_request); 831 EXPORT_SYMBOL(elv_requeue_request); 832 EXPORT_SYMBOL(elv_next_request); 833 EXPORT_SYMBOL(elv_dequeue_request); 834 EXPORT_SYMBOL(elv_queue_empty); 835 EXPORT_SYMBOL(elv_completed_request); 836 EXPORT_SYMBOL(elevator_exit); 837 EXPORT_SYMBOL(elevator_init); 838