# This is a BitKeeper generated patch for the following project: # Project Name: Linux kernel tree # This patch format is intended for GNU patch command version 2.5 or higher. # This patch includes the following deltas: # ChangeSet 1.811 -> 1.812 # include/linux/elevator.h 1.16 -> 1.17 # drivers/block/ll_rw_blk.c 1.123 -> 1.124 # drivers/scsi/scsi_lib.c 1.35 -> 1.36 # include/linux/blk.h 1.27 -> 1.28 # # The following is the BitKeeper ChangeSet Log # -------------------------------------------- # 02/10/28 axboe@burns.home.kernel.dk 1.812 # Request insertion in the current tree is a mess. We have all sorts of # variants of *elv_add_request*, and it's not at all clear who does what # and with what locks (or not). This patch cleans it up to be: # # o __elv_add_request(queue, request, at_end, plug) # Core function, requires queue lock to be held # # o elv_add_request(queue, request, at_end, plug) # Like __elv_add_request(), but grabs queue lock # # o __elv_add_request_pos(queue, request, position) # Insert request at a given location, lock must be held # -------------------------------------------- # diff -Nru a/drivers/block/ll_rw_blk.c b/drivers/block/ll_rw_blk.c --- a/drivers/block/ll_rw_blk.c Mon Oct 28 17:51:57 2002 +++ b/drivers/block/ll_rw_blk.c Mon Oct 28 17:51:57 2002 @@ -639,7 +639,7 @@ blk_queue_end_tag(q, rq); rq->flags &= ~REQ_STARTED; - elv_add_request(q, rq, 0); + __elv_add_request(q, rq, 0, 0); } } @@ -1466,7 +1466,7 @@ * elevator indicated where it wants this request to be * inserted at elevator_merge time */ - __elv_add_request(q, req, insert_here); + __elv_add_request_pos(q, req, insert_here); } /* diff -Nru a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c --- a/drivers/scsi/scsi_lib.c Mon Oct 28 17:51:57 2002 +++ b/drivers/scsi/scsi_lib.c Mon Oct 28 17:51:57 2002 @@ -240,7 +240,7 @@ SCpnt->request->special = (void *) SCpnt; if(blk_rq_tagged(SCpnt->request)) blk_queue_end_tag(q, SCpnt->request); - _elv_add_request(q, SCpnt->request, 0, 0); + __elv_add_request(q, SCpnt->request, 0, 0); } /* @@ -951,7 +951,7 @@ SCpnt->request->flags |= REQ_SPECIAL; if(blk_rq_tagged(SCpnt->request)) blk_queue_end_tag(q, SCpnt->request); - _elv_add_request(q, SCpnt->request, 0, 0); + __elv_add_request(q, SCpnt->request, 0, 0); break; } diff -Nru a/include/linux/blk.h b/include/linux/blk.h --- a/include/linux/blk.h Mon Oct 28 17:51:57 2002 +++ b/include/linux/blk.h Mon Oct 28 17:51:57 2002 @@ -50,22 +50,6 @@ elv_remove_request(req->q, req); } -#define _elv_add_request_core(q, rq, where, plug) \ - do { \ - if ((plug)) \ - blk_plug_device((q)); \ - (q)->elevator.elevator_add_req_fn((q), (rq), (where)); \ - } while (0) - -#define _elv_add_request(q, rq, back, p) do { \ - if ((back)) \ - _elv_add_request_core((q), (rq), (q)->queue_head.prev, (p)); \ - else \ - _elv_add_request_core((q), (rq), &(q)->queue_head, (p)); \ -} while (0) - -#define elv_add_request(q, rq, back) _elv_add_request((q), (rq), (back), 1) - #if defined(MAJOR_NR) || defined(IDE_DRIVER) #if (MAJOR_NR != SCSI_TAPE_MAJOR) && (MAJOR_NR != OSST_MAJOR) #if !defined(IDE_DRIVER) diff -Nru a/include/linux/elevator.h b/include/linux/elevator.h --- a/include/linux/elevator.h Mon Oct 28 17:51:57 2002 +++ b/include/linux/elevator.h Mon Oct 28 17:51:57 2002 @@ -40,8 +40,8 @@ /* * block elevator interface */ -extern void __elv_add_request(request_queue_t *, struct request *, - struct list_head *); +extern void elv_add_request(request_queue_t *, struct request *, int, int); +extern void __elv_add_request(request_queue_t *, struct request *, int, int); extern int elv_merge(request_queue_t *, struct list_head **, struct bio *); extern void elv_merge_requests(request_queue_t *, struct request *, struct request *); @@ -49,6 +49,9 @@ extern void elv_remove_request(request_queue_t *, struct request *); extern int elv_queue_empty(request_queue_t *); extern inline struct list_head *elv_get_sort_head(request_queue_t *, struct request *); + +#define __elv_add_request_pos(q, rq, pos) \ + (q)->elevator.elevator_add_req_fn((q), (rq), (pos)) /* * noop I/O scheduler. always merges, always inserts new request at tail diff -Nru a/drivers/block/elevator.c b/drivers/block/elevator.c --- a/drivers/block/elevator.c Mon Oct 28 17:54:46 2002 +++ b/drivers/block/elevator.c Mon Oct 28 17:54:46 2002 @@ -272,13 +272,27 @@ e->elevator_merge_req_fn(q, rq, next); } -/* - * add_request and next_request are required to be supported, naturally - */ -void __elv_add_request(request_queue_t *q, struct request *rq, - struct list_head *insert_here) +void __elv_add_request(request_queue_t *q, struct request *rq, int at_end, + int plug) { - q->elevator.elevator_add_req_fn(q, rq, insert_here); + struct list_head *insert = &q->queue_head; + + if (at_end) + insert = insert->prev; + if (plug) + blk_plug_device(q); + + q->elevator.elevator_add_req_fn(q, rq, insert); +} + +void elv_add_request(request_queue_t *q, struct request *rq, int at_end, + int plug) +{ + unsigned long flags; + + spin_lock_irqsave(q->queue_lock, flags); + __elv_add_request(q, rq, at_end, plug); + spin_unlock_irqrestore(q->queue_lock, flags); } static inline struct request *__elv_next_request(request_queue_t *q) @@ -357,6 +371,7 @@ EXPORT_SYMBOL(elevator_noop); +EXPORT_SYMBOL(elv_add_request); EXPORT_SYMBOL(__elv_add_request); EXPORT_SYMBOL(elv_next_request); EXPORT_SYMBOL(elv_remove_request);