diff options
author | NeilBrown <neilb@suse.de> | 2011-04-18 03:52:22 -0400 |
---|---|---|
committer | Jens Axboe <jaxboe@fusionio.com> | 2011-04-18 03:52:22 -0400 |
commit | 048c9374a749a27f16493cea033fa4a8ff492356 (patch) | |
tree | 64f520a1a2d2e1a9c30b45e306ce6f901f8f8d49 /block | |
parent | a1b49cb7e2a7961ec3aa8b64860bf480d4ec9077 (diff) |
block: Enhance new plugging support to support general callbacks
md/raid requires an unplug callback, but as it does not uses
requests the current code cannot provide one.
So allow arbitrary callbacks to be attached to the blk_plug.
Signed-off-by: NeilBrown <neilb@suse.de>
Signed-off-by: Jens Axboe <jaxboe@fusionio.com>
Diffstat (limited to 'block')
-rw-r--r-- | block/blk-core.c | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/block/blk-core.c b/block/blk-core.c index 78b7b0cb7216..77edf0512338 100644 --- a/block/blk-core.c +++ b/block/blk-core.c | |||
@@ -2638,6 +2638,7 @@ void blk_start_plug(struct blk_plug *plug) | |||
2638 | 2638 | ||
2639 | plug->magic = PLUG_MAGIC; | 2639 | plug->magic = PLUG_MAGIC; |
2640 | INIT_LIST_HEAD(&plug->list); | 2640 | INIT_LIST_HEAD(&plug->list); |
2641 | INIT_LIST_HEAD(&plug->cb_list); | ||
2641 | plug->should_sort = 0; | 2642 | plug->should_sort = 0; |
2642 | 2643 | ||
2643 | /* | 2644 | /* |
@@ -2678,6 +2679,24 @@ static void queue_unplugged(struct request_queue *q, unsigned int depth, | |||
2678 | q->unplugged_fn(q); | 2679 | q->unplugged_fn(q); |
2679 | } | 2680 | } |
2680 | 2681 | ||
2682 | static void flush_plug_callbacks(struct blk_plug *plug) | ||
2683 | { | ||
2684 | LIST_HEAD(callbacks); | ||
2685 | |||
2686 | if (list_empty(&plug->cb_list)) | ||
2687 | return; | ||
2688 | |||
2689 | list_splice_init(&plug->cb_list, &callbacks); | ||
2690 | |||
2691 | while (!list_empty(&callbacks)) { | ||
2692 | struct blk_plug_cb *cb = list_first_entry(&callbacks, | ||
2693 | struct blk_plug_cb, | ||
2694 | list); | ||
2695 | list_del(&cb->list); | ||
2696 | cb->callback(cb); | ||
2697 | } | ||
2698 | } | ||
2699 | |||
2681 | void blk_flush_plug_list(struct blk_plug *plug, bool from_schedule) | 2700 | void blk_flush_plug_list(struct blk_plug *plug, bool from_schedule) |
2682 | { | 2701 | { |
2683 | struct request_queue *q; | 2702 | struct request_queue *q; |
@@ -2688,6 +2707,7 @@ void blk_flush_plug_list(struct blk_plug *plug, bool from_schedule) | |||
2688 | 2707 | ||
2689 | BUG_ON(plug->magic != PLUG_MAGIC); | 2708 | BUG_ON(plug->magic != PLUG_MAGIC); |
2690 | 2709 | ||
2710 | flush_plug_callbacks(plug); | ||
2691 | if (list_empty(&plug->list)) | 2711 | if (list_empty(&plug->list)) |
2692 | return; | 2712 | return; |
2693 | 2713 | ||