block: stack unplug
PATCH 1/1 block: stack unplug
MD raid1 prepares to dispatch request in unplug callback. If make_request in low level queue also uses unplug callback to dispatch request, the low level queue's unplug callback will not be called. Recheck the callback list helps this case.
Signed-off-by Shaohua Li <[email protected]>
block/blk-core.c +7 -8
@@ -2900,17 +2900,16 @@ static void flush_plug_callbacks(struct blk_plug *plug) {LIST_HEAD (callbacks); -if (list_empty (&plug->cb_list)) -return ; - -list_splice_init (&plug->cb_list, &callbacks); +while (!list_empty (&plug->cb_list)) { +list_splice_init (&plug->cb_list, &callbacks); -while (!list_empty (&callbacks)) { -struct blk_plug_cb *cb =list_first_entry (&callbacks, +while (!list_empty (&callbacks)) { +struct blk_plug_cb *cb =list_first_entry (&callbacks, struct blk_plug_cb, list); -list_del (&cb->list); - cb->callback (cb); +list_del (&cb->list); + cb->callback (cb); + } } }