patch-2.4.20 linux-2.4.20/drivers/block/elevator.c
Next file: linux-2.4.20/drivers/block/genhd.c
Previous file: linux-2.4.20/drivers/block/cpqarray.h
Back to the patch index
Back to the overall index
- Lines: 76
- Date:
Thu Nov 28 15:53:12 2002
- Orig file:
linux-2.4.19/drivers/block/elevator.c
- Orig date:
Thu Jul 19 20:59:41 2001
diff -urN linux-2.4.19/drivers/block/elevator.c linux-2.4.20/drivers/block/elevator.c
@@ -82,14 +82,15 @@
{
struct list_head *entry = &q->queue_head;
unsigned int count = bh->b_size >> 9, ret = ELEVATOR_NO_MERGE;
+ struct request *__rq;
while ((entry = entry->prev) != head) {
- struct request *__rq = blkdev_entry_to_request(entry);
+ __rq = blkdev_entry_to_request(entry);
/*
- * simply "aging" of requests in queue
+ * we can't insert beyond a zero sequence point
*/
- if (__rq->elevator_sequence-- <= 0)
+ if (__rq->elevator_sequence <= 0)
break;
if (__rq->waiting)
@@ -102,34 +103,33 @@
continue;
if (__rq->nr_sectors + count > max_sectors)
continue;
- if (__rq->elevator_sequence < count)
- break;
if (__rq->sector + __rq->nr_sectors == bh->b_rsector) {
ret = ELEVATOR_BACK_MERGE;
*req = __rq;
break;
} else if (__rq->sector - count == bh->b_rsector) {
ret = ELEVATOR_FRONT_MERGE;
- __rq->elevator_sequence -= count;
+ __rq->elevator_sequence--;
*req = __rq;
break;
}
}
- return ret;
-}
-
-void elevator_linus_merge_cleanup(request_queue_t *q, struct request *req, int count)
-{
- struct list_head *entry = &req->queue, *head = &q->queue_head;
-
/*
- * second pass scan of requests that got passed over, if any
+ * account merge (ret != 0, cost is 1) or seeky insert (*req is set,
+ * cost is ELV_LINUS_SEEK_COST
*/
- while ((entry = entry->next) != head) {
- struct request *tmp = blkdev_entry_to_request(entry);
- tmp->elevator_sequence -= count;
+ if (*req) {
+ int scan_cost = ret ? 1 : ELV_LINUS_SEEK_COST;
+ struct list_head *entry = &(*req)->queue;
+
+ while ((entry = entry->next) != &q->queue_head) {
+ __rq = blkdev_entry_to_request(entry);
+ __rq->elevator_sequence -= scan_cost;
+ }
}
+
+ return ret;
}
void elevator_linus_merge_req(struct request *req, struct request *next)
@@ -177,8 +177,6 @@
return ELEVATOR_NO_MERGE;
}
-void elevator_noop_merge_cleanup(request_queue_t *q, struct request *req, int count) {}
-
void elevator_noop_merge_req(struct request *req, struct request *next) {}
int blkelvget_ioctl(elevator_t * elevator, blkelv_ioctl_arg_t * arg)
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)