===== 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);