diff options
Diffstat (limited to 'block/blk-mq.c')
| -rw-r--r-- | block/blk-mq.c | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/block/blk-mq.c b/block/blk-mq.c index 8f5b533764ca..9437a5eb07cf 100644 --- a/block/blk-mq.c +++ b/block/blk-mq.c | |||
| @@ -737,12 +737,20 @@ static void blk_mq_requeue_work(struct work_struct *work) | |||
| 737 | spin_unlock_irq(&q->requeue_lock); | 737 | spin_unlock_irq(&q->requeue_lock); |
| 738 | 738 | ||
| 739 | list_for_each_entry_safe(rq, next, &rq_list, queuelist) { | 739 | list_for_each_entry_safe(rq, next, &rq_list, queuelist) { |
| 740 | if (!(rq->rq_flags & RQF_SOFTBARRIER)) | 740 | if (!(rq->rq_flags & (RQF_SOFTBARRIER | RQF_DONTPREP))) |
| 741 | continue; | 741 | continue; |
| 742 | 742 | ||
| 743 | rq->rq_flags &= ~RQF_SOFTBARRIER; | 743 | rq->rq_flags &= ~RQF_SOFTBARRIER; |
| 744 | list_del_init(&rq->queuelist); | 744 | list_del_init(&rq->queuelist); |
| 745 | blk_mq_sched_insert_request(rq, true, false, false); | 745 | /* |
| 746 | * If RQF_DONTPREP, rq has contained some driver specific | ||
| 747 | * data, so insert it to hctx dispatch list to avoid any | ||
| 748 | * merge. | ||
| 749 | */ | ||
| 750 | if (rq->rq_flags & RQF_DONTPREP) | ||
| 751 | blk_mq_request_bypass_insert(rq, false); | ||
| 752 | else | ||
| 753 | blk_mq_sched_insert_request(rq, true, false, false); | ||
| 746 | } | 754 | } |
| 747 | 755 | ||
| 748 | while (!list_empty(&rq_list)) { | 756 | while (!list_empty(&rq_list)) { |
