|
@@ -55,6 +55,20 @@ static void deadline_move_request(struct deadline_data *, struct request *);
|
|
|
|
|
|
#define RQ_RB_ROOT(dd, rq) (&(dd)->sort_list[rq_data_dir((rq))])
|
|
|
|
|
|
+/*
|
|
|
+ * get the request after `rq' in sector-sorted order
|
|
|
+ */
|
|
|
+static inline struct request *
|
|
|
+deadline_latter_request(struct request *rq)
|
|
|
+{
|
|
|
+ struct rb_node *node = rb_next(&rq->rb_node);
|
|
|
+
|
|
|
+ if (node)
|
|
|
+ return rb_entry_rq(node);
|
|
|
+
|
|
|
+ return NULL;
|
|
|
+}
|
|
|
+
|
|
|
static void
|
|
|
deadline_add_rq_rb(struct deadline_data *dd, struct request *rq)
|
|
|
{
|
|
@@ -74,13 +88,8 @@ deadline_del_rq_rb(struct deadline_data *dd, struct request *rq)
|
|
|
{
|
|
|
const int data_dir = rq_data_dir(rq);
|
|
|
|
|
|
- if (dd->next_rq[data_dir] == rq) {
|
|
|
- struct rb_node *rbnext = rb_next(&rq->rb_node);
|
|
|
-
|
|
|
- dd->next_rq[data_dir] = NULL;
|
|
|
- if (rbnext)
|
|
|
- dd->next_rq[data_dir] = rb_entry_rq(rbnext);
|
|
|
- }
|
|
|
+ if (dd->next_rq[data_dir] == rq)
|
|
|
+ dd->next_rq[data_dir] = deadline_latter_request(rq);
|
|
|
|
|
|
elv_rb_del(RQ_RB_ROOT(dd, rq), rq);
|
|
|
}
|
|
@@ -198,14 +207,11 @@ static void
|
|
|
deadline_move_request(struct deadline_data *dd, struct request *rq)
|
|
|
{
|
|
|
const int data_dir = rq_data_dir(rq);
|
|
|
- struct rb_node *rbnext = rb_next(&rq->rb_node);
|
|
|
|
|
|
dd->next_rq[READ] = NULL;
|
|
|
dd->next_rq[WRITE] = NULL;
|
|
|
+ dd->next_rq[data_dir] = deadline_latter_request(rq);
|
|
|
|
|
|
- if (rbnext)
|
|
|
- dd->next_rq[data_dir] = rb_entry_rq(rbnext);
|
|
|
-
|
|
|
dd->last_sector = rq->sector + rq->nr_sectors;
|
|
|
|
|
|
/*
|