--- elevator/drivers/block/DAC960.c.~1~ Fri Mar 3 02:19:23 2000 +++ elevator/drivers/block/DAC960.c Sat Mar 4 19:53:03 2000 @@ -1051,20 +1051,23 @@ int max_segments; DAC960_Controller_T * Controller = q->queuedata; int total_segments = req->nr_segments + next->nr_segments; + int same_segment; max_segments = Controller->MaxSegmentsPerRequest[MINOR(req->rq_dev)]; if (__max_segments < max_segments) max_segments = __max_segments; + same_segment = 0; if (req->bhtail->b_data + req->bhtail->b_size == next->bh->b_data) { total_segments--; - q->nr_segments--; + same_segment = 1; } if (total_segments > max_segments) return 0; + q->nr_segments -= same_segment; req->nr_segments = total_segments; return 1; } --- elevator/drivers/block/ll_rw_blk.c.~1~ Sun Feb 27 06:19:42 2000 +++ elevator/drivers/block/ll_rw_blk.c Sun Mar 5 04:01:25 2000 @@ -212,15 +212,18 @@ struct request *next, int max_segments) { int total_segments = req->nr_segments + next->nr_segments; + int same_segment; + same_segment = 0; if (req->bhtail->b_data + req->bhtail->b_size == next->bh->b_data) { total_segments--; - q->nr_segments--; + same_segment = 1; } if (total_segments > max_segments) return 0; + q->nr_segments -= same_segment; req->nr_segments = total_segments; return 1; } @@ -438,14 +441,24 @@ do { struct request * req = blkdev_entry_to_request(entry); + + if (!req->q) + goto special_req; + + pos += req->nr_segments; if (elevator_sequence_before(req->elevator_sequence, sequence)) { + special_req: *lat -= q->nr_segments - pos; *starving = 1; return entry; } - pos += req->nr_segments; } while ((entry = entry->prev) != &q->queue_head); +#ifdef DEBUG_ELEVATOR + if (pos != q->nr_segments) + printk(KERN_ERR __FUNCTION__ "non starving pos %d nr_segments %u\n", + pos, q->nr_segments); +#endif *starving = 0; return entry->next; @@ -472,14 +485,8 @@ int sequence = elevator_sequence(&q->elevator, latency); if (after) sequence -= req->nr_segments; - if (elevator_sequence_before(sequence, req->elevator_sequence)) { - if (!after) - printk(KERN_WARNING __FUNCTION__ - ": req latency %d req latency %d\n", - req->elevator_sequence - q->elevator.sequence, - sequence - q->elevator.sequence); + if (elevator_sequence_before(sequence, req->elevator_sequence)) req->elevator_sequence = sequence; - } } static inline void elevator_queue(request_queue_t * q, @@ -494,16 +501,12 @@ for (;; tmp = blkdev_next_request(tmp)) { - if ((latency -= tmp->nr_segments) <= 0) + if ((latency -= tmp->nr_segments) < 0) { tmp = __tmp; latency = __latency; - if (starving) - break; - - if (q->head_active && !q->plugged) - { + if (starving || (q->head_active && !q->plugged)) { latency -= tmp->nr_segments; break; }