iosched: prevent aliased requests from starving other I/O
[firefly-linux-kernel-4.4.55.git] / block / elevator.c
index 45ca1e34f58249ff5b3838c0ec89fbc1c6ea2bb7..a3b64bc71d8821fcdf4fa15dbbd0704ac34b843a 100644 (file)
@@ -155,13 +155,8 @@ static struct elevator_type *elevator_get(const char *name)
 
        e = elevator_find(name);
        if (!e) {
-               char elv[ELV_NAME_MAX + strlen("-iosched")];
-
                spin_unlock(&elv_list_lock);
-
-               snprintf(elv, sizeof(elv), "%s-iosched", name);
-
-               request_module("%s", elv);
+               request_module("%s-iosched", name);
                spin_lock(&elv_list_lock);
                e = elevator_find(name);
        }
@@ -358,7 +353,7 @@ static struct request *elv_rqhash_find(struct request_queue *q, sector_t offset)
  * RB-tree support functions for inserting/lookup/removal of requests
  * in a sorted RB tree.
  */
-struct request *elv_rb_add(struct rb_root *root, struct request *rq)
+void elv_rb_add(struct rb_root *root, struct request *rq)
 {
        struct rb_node **p = &root->rb_node;
        struct rb_node *parent = NULL;
@@ -370,15 +365,12 @@ struct request *elv_rb_add(struct rb_root *root, struct request *rq)
 
                if (blk_rq_pos(rq) < blk_rq_pos(__rq))
                        p = &(*p)->rb_left;
-               else if (blk_rq_pos(rq) > blk_rq_pos(__rq))
+               else if (blk_rq_pos(rq) >= blk_rq_pos(__rq))
                        p = &(*p)->rb_right;
-               else
-                       return __rq;
        }
 
        rb_link_node(&rq->rb_node, parent, p);
        rb_insert_color(&rq->rb_node, root);
-       return NULL;
 }
 EXPORT_SYMBOL(elv_rb_add);
 
@@ -421,8 +413,6 @@ void elv_dispatch_sort(struct request_queue *q, struct request *rq)
        struct list_head *entry;
        int stop_flags;
 
-       BUG_ON(rq->cmd_flags & REQ_ON_PLUG);
-
        if (q->last_merge == rq)
                q->last_merge = NULL;
 
@@ -661,8 +651,6 @@ void __elv_add_request(struct request_queue *q, struct request *rq, int where)
 
        rq->q = q;
 
-       BUG_ON(rq->cmd_flags & REQ_ON_PLUG);
-
        if (rq->cmd_flags & REQ_SOFTBARRIER) {
                /* barriers are scheduling boundary, update end_sector */
                if (rq->cmd_type == REQ_TYPE_FS ||