diff -urNp aa3/drivers/block/elevator.c 2.4.19pre10aa3/drivers/block/elevator.c --- aa3/drivers/block/elevator.c Tue Jan 22 18:52:08 2002 +++ 2.4.19pre10aa3/drivers/block/elevator.c Thu Jun 20 04:18:21 2002 @@ -82,6 +82,7 @@ int elevator_linus_merge(request_queue_t { struct list_head *entry = &q->queue_head; unsigned int count = bh->b_size >> 9, ret = ELEVATOR_NO_MERGE; + int merge_only = 0; while ((entry = entry->prev) != head) { struct request *__rq = blkdev_entry_to_request(entry); @@ -90,21 +91,28 @@ int elevator_linus_merge(request_queue_t * simply "aging" of requests in queue */ if (__rq->elevator_sequence-- <= 0) - break; + /* + * OK, we've exceeded someone's latency limit. + * But we still continue to look for merges, + * because they're so much better than seeks. + */ + merge_only = 1; if (__rq->waiting) continue; if (__rq->rq_dev != bh->b_rdev) continue; - if (!*req && bh_rq_in_between(bh, __rq, &q->queue_head)) + if (!*req && !merge_only && bh_rq_in_between(bh, __rq, &q->queue_head)) *req = __rq; if (__rq->cmd != rw) continue; if (__rq->nr_sectors + count > max_sectors) continue; - if (__rq->elevator_sequence < count) - break; if (__rq->sector + __rq->nr_sectors == bh->b_rsector) { + /* + * Really here we could re-increase the elevator_latency of __rq, + * but it's not so important. + */ ret = ELEVATOR_BACK_MERGE; *req = __rq; break; @@ -119,19 +127,6 @@ int elevator_linus_merge(request_queue_t 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 - */ - while ((entry = entry->next) != head) { - struct request *tmp = blkdev_entry_to_request(entry); - tmp->elevator_sequence -= count; - } -} - void elevator_linus_merge_req(struct request *req, struct request *next) { if (next->elevator_sequence < req->elevator_sequence) @@ -177,8 +172,6 @@ int elevator_noop_merge(request_queue_t 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) diff -urNp aa3/drivers/block/ll_rw_blk.c 2.4.19pre10aa3/drivers/block/ll_rw_blk.c --- aa3/drivers/block/ll_rw_blk.c Thu Jun 20 04:19:31 2002 +++ 2.4.19pre10aa3/drivers/block/ll_rw_blk.c Thu Jun 20 04:15:06 2002 @@ -960,7 +960,6 @@ again: insert_here = &req->queue; break; } - elevator->elevator_merge_cleanup_fn(q, req, count); req->bhtail->b_reqnext = bh; req->bhtail = bh; req->nr_sectors = req->hard_nr_sectors += count; @@ -975,7 +974,6 @@ again: insert_here = req->queue.prev; break; } - elevator->elevator_merge_cleanup_fn(q, req, count); bh->b_reqnext = req->bh; req->bh = bh; /* diff -urNp aa3/include/linux/elevator.h 2.4.19pre10aa3/include/linux/elevator.h --- aa3/include/linux/elevator.h Thu Feb 22 03:45:11 2001 +++ 2.4.19pre10aa3/include/linux/elevator.h Thu Jun 20 04:19:06 2002 @@ -8,8 +8,6 @@ typedef void (elevator_fn) (struct reque typedef int (elevator_merge_fn) (request_queue_t *, struct request **, struct list_head *, struct buffer_head *, int, int); -typedef void (elevator_merge_cleanup_fn) (request_queue_t *, struct request *, int); - typedef void (elevator_merge_req_fn) (struct request *, struct request *); struct elevator_s @@ -18,18 +16,15 @@ struct elevator_s int write_latency; elevator_merge_fn *elevator_merge_fn; - elevator_merge_cleanup_fn *elevator_merge_cleanup_fn; elevator_merge_req_fn *elevator_merge_req_fn; unsigned int queue_ID; }; int elevator_noop_merge(request_queue_t *, struct request **, struct list_head *, struct buffer_head *, int, int); -void elevator_noop_merge_cleanup(request_queue_t *, struct request *, int); void elevator_noop_merge_req(struct request *, struct request *); int elevator_linus_merge(request_queue_t *, struct request **, struct list_head *, struct buffer_head *, int, int); -void elevator_linus_merge_cleanup(request_queue_t *, struct request *, int); void elevator_linus_merge_req(struct request *, struct request *); typedef struct blkelv_ioctl_arg_s { @@ -87,7 +82,6 @@ static inline int elevator_request_laten 0, /* write_latency */ \ \ elevator_noop_merge, /* elevator_merge_fn */ \ - elevator_noop_merge_cleanup, /* elevator_merge_cleanup_fn */ \ elevator_noop_merge_req, /* elevator_merge_req_fn */ \ }) @@ -97,7 +91,6 @@ static inline int elevator_request_laten 16384, /* write passovers */ \ \ elevator_linus_merge, /* elevator_merge_fn */ \ - elevator_linus_merge_cleanup, /* elevator_merge_cleanup_fn */ \ elevator_linus_merge_req, /* elevator_merge_req_fn */ \ })