|
@@ -3032,21 +3032,20 @@ void blk_start_plug(struct blk_plug *plug)
|
|
|
{
|
|
|
struct task_struct *tsk = current;
|
|
|
|
|
|
+ /*
|
|
|
+ * If this is a nested plug, don't actually assign it.
|
|
|
+ */
|
|
|
+ if (tsk->plug)
|
|
|
+ return;
|
|
|
+
|
|
|
INIT_LIST_HEAD(&plug->list);
|
|
|
INIT_LIST_HEAD(&plug->mq_list);
|
|
|
INIT_LIST_HEAD(&plug->cb_list);
|
|
|
-
|
|
|
/*
|
|
|
- * If this is a nested plug, don't actually assign it. It will be
|
|
|
- * flushed on its own.
|
|
|
+ * Store ordering should not be needed here, since a potential
|
|
|
+ * preempt will imply a full memory barrier
|
|
|
*/
|
|
|
- if (!tsk->plug) {
|
|
|
- /*
|
|
|
- * Store ordering should not be needed here, since a potential
|
|
|
- * preempt will imply a full memory barrier
|
|
|
- */
|
|
|
- tsk->plug = plug;
|
|
|
- }
|
|
|
+ tsk->plug = plug;
|
|
|
}
|
|
|
EXPORT_SYMBOL(blk_start_plug);
|
|
|
|
|
@@ -3193,10 +3192,11 @@ void blk_flush_plug_list(struct blk_plug *plug, bool from_schedule)
|
|
|
|
|
|
void blk_finish_plug(struct blk_plug *plug)
|
|
|
{
|
|
|
+ if (plug != current->plug)
|
|
|
+ return;
|
|
|
blk_flush_plug_list(plug, false);
|
|
|
|
|
|
- if (plug == current->plug)
|
|
|
- current->plug = NULL;
|
|
|
+ current->plug = NULL;
|
|
|
}
|
|
|
EXPORT_SYMBOL(blk_finish_plug);
|
|
|
|