===== drivers/block/deadline-iosched.c 1.13 vs edited ===== --- 1.13/drivers/block/deadline-iosched.c Mon Jan 13 15:58:21 2003 +++ edited/drivers/block/deadline-iosched.c Fri Feb 14 12:57:15 2003 @@ -98,6 +98,8 @@ unsigned long expires; }; +static inline void deadline_move_to_dispatch(struct deadline_data *dd, struct deadline_rq *drq); + static kmem_cache_t *drq_pool; #define RQ_DATA(rq) ((struct deadline_rq *) (rq)->elevator_private) @@ -189,26 +191,22 @@ return 0; } -static int +static void deadline_add_drq_rb(struct deadline_data *dd, struct deadline_rq *drq) { struct deadline_rq *__alias; drq->rb_key = rq_rb_key(drq->request); +retry: __alias = __deadline_add_drq_rb(dd, drq); if (!__alias) { rb_insert_color(&drq->rb_node, DRQ_RB_ROOT(dd, drq)); - return 0; + return; } - /* - * this should not typically happen, but if it does simply chain - * the two requests. then they will be moved to the dispatch list - * at the same time - */ - list_add(&drq->request->queuelist, &__alias->request->queuelist); - return 1; + deadline_move_to_dispatch(dd, __alias); + goto retry; } static inline void @@ -276,13 +274,12 @@ { const int data_dir = rq_data_dir(drq->request); - if (!deadline_add_drq_rb(dd, drq)) { - /* - * set expire time (only used for reads) and add to fifo list - */ - drq->expires = jiffies + dd->fifo_expire[data_dir]; - list_add_tail(&drq->fifo, &dd->fifo_list[data_dir]); - } + deadline_add_drq_rb(dd, drq); + /* + * set expire time (only used for reads) and add to fifo list + */ + drq->expires = jiffies + dd->fifo_expire[data_dir]; + list_add_tail(&drq->fifo, &dd->fifo_list[data_dir]); } /* @@ -425,6 +422,12 @@ static inline void deadline_move_to_dispatch(struct deadline_data *dd, struct deadline_rq *drq) { + request_queue_t *q = drq->request->q; + + if (q->last_merge == &drq->request->queuelist) + q->last_merge = NULL; + + deadline_del_drq_hash(drq); deadline_del_drq_rb(dd, drq); list_del_init(&drq->fifo); list_add_tail(&drq->request->queuelist, dd->dispatch);