diff options
Diffstat (limited to 'block/ll_rw_blk.c')
-rw-r--r-- | block/ll_rw_blk.c | 44 |
1 files changed, 19 insertions, 25 deletions
diff --git a/block/ll_rw_blk.c b/block/ll_rw_blk.c index f9fc07efd2da..03d9c82b0fe7 100644 --- a/block/ll_rw_blk.c +++ b/block/ll_rw_blk.c | |||
@@ -454,7 +454,7 @@ static void queue_flush(request_queue_t *q, unsigned which) | |||
454 | rq->end_io = end_io; | 454 | rq->end_io = end_io; |
455 | q->prepare_flush_fn(q, rq); | 455 | q->prepare_flush_fn(q, rq); |
456 | 456 | ||
457 | __elv_add_request(q, rq, ELEVATOR_INSERT_FRONT, 0); | 457 | elv_insert(q, rq, ELEVATOR_INSERT_FRONT); |
458 | } | 458 | } |
459 | 459 | ||
460 | static inline struct request *start_ordered(request_queue_t *q, | 460 | static inline struct request *start_ordered(request_queue_t *q, |
@@ -490,7 +490,7 @@ static inline struct request *start_ordered(request_queue_t *q, | |||
490 | else | 490 | else |
491 | q->ordseq |= QUEUE_ORDSEQ_POSTFLUSH; | 491 | q->ordseq |= QUEUE_ORDSEQ_POSTFLUSH; |
492 | 492 | ||
493 | __elv_add_request(q, rq, ELEVATOR_INSERT_FRONT, 0); | 493 | elv_insert(q, rq, ELEVATOR_INSERT_FRONT); |
494 | 494 | ||
495 | if (q->ordered & QUEUE_ORDERED_PREFLUSH) { | 495 | if (q->ordered & QUEUE_ORDERED_PREFLUSH) { |
496 | queue_flush(q, QUEUE_ORDERED_PREFLUSH); | 496 | queue_flush(q, QUEUE_ORDERED_PREFLUSH); |
@@ -508,7 +508,7 @@ static inline struct request *start_ordered(request_queue_t *q, | |||
508 | 508 | ||
509 | int blk_do_ordered(request_queue_t *q, struct request **rqp) | 509 | int blk_do_ordered(request_queue_t *q, struct request **rqp) |
510 | { | 510 | { |
511 | struct request *rq = *rqp, *allowed_rq; | 511 | struct request *rq = *rqp; |
512 | int is_barrier = blk_fs_request(rq) && blk_barrier_rq(rq); | 512 | int is_barrier = blk_fs_request(rq) && blk_barrier_rq(rq); |
513 | 513 | ||
514 | if (!q->ordseq) { | 514 | if (!q->ordseq) { |
@@ -532,32 +532,26 @@ int blk_do_ordered(request_queue_t *q, struct request **rqp) | |||
532 | } | 532 | } |
533 | } | 533 | } |
534 | 534 | ||
535 | /* | ||
536 | * Ordered sequence in progress | ||
537 | */ | ||
538 | |||
539 | /* Special requests are not subject to ordering rules. */ | ||
540 | if (!blk_fs_request(rq) && | ||
541 | rq != &q->pre_flush_rq && rq != &q->post_flush_rq) | ||
542 | return 1; | ||
543 | |||
535 | if (q->ordered & QUEUE_ORDERED_TAG) { | 544 | if (q->ordered & QUEUE_ORDERED_TAG) { |
545 | /* Ordered by tag. Blocking the next barrier is enough. */ | ||
536 | if (is_barrier && rq != &q->bar_rq) | 546 | if (is_barrier && rq != &q->bar_rq) |
537 | *rqp = NULL; | 547 | *rqp = NULL; |
538 | return 1; | 548 | } else { |
539 | } | 549 | /* Ordered by draining. Wait for turn. */ |
540 | 550 | WARN_ON(blk_ordered_req_seq(rq) < blk_ordered_cur_seq(q)); | |
541 | switch (blk_ordered_cur_seq(q)) { | 551 | if (blk_ordered_req_seq(rq) > blk_ordered_cur_seq(q)) |
542 | case QUEUE_ORDSEQ_PREFLUSH: | 552 | *rqp = NULL; |
543 | allowed_rq = &q->pre_flush_rq; | ||
544 | break; | ||
545 | case QUEUE_ORDSEQ_BAR: | ||
546 | allowed_rq = &q->bar_rq; | ||
547 | break; | ||
548 | case QUEUE_ORDSEQ_POSTFLUSH: | ||
549 | allowed_rq = &q->post_flush_rq; | ||
550 | break; | ||
551 | default: | ||
552 | allowed_rq = NULL; | ||
553 | break; | ||
554 | } | 553 | } |
555 | 554 | ||
556 | if (rq != allowed_rq && | ||
557 | (blk_fs_request(rq) || rq == &q->pre_flush_rq || | ||
558 | rq == &q->post_flush_rq)) | ||
559 | *rqp = NULL; | ||
560 | |||
561 | return 1; | 555 | return 1; |
562 | } | 556 | } |
563 | 557 | ||
@@ -3453,7 +3447,7 @@ int __init blk_dev_init(void) | |||
3453 | iocontext_cachep = kmem_cache_create("blkdev_ioc", | 3447 | iocontext_cachep = kmem_cache_create("blkdev_ioc", |
3454 | sizeof(struct io_context), 0, SLAB_PANIC, NULL, NULL); | 3448 | sizeof(struct io_context), 0, SLAB_PANIC, NULL, NULL); |
3455 | 3449 | ||
3456 | for (i = 0; i < NR_CPUS; i++) | 3450 | for_each_cpu(i) |
3457 | INIT_LIST_HEAD(&per_cpu(blk_cpu_done, i)); | 3451 | INIT_LIST_HEAD(&per_cpu(blk_cpu_done, i)); |
3458 | 3452 | ||
3459 | open_softirq(BLOCK_SOFTIRQ, blk_done_softirq, NULL); | 3453 | open_softirq(BLOCK_SOFTIRQ, blk_done_softirq, NULL); |