diff --git a/drivers/mmc/card/block.c b/drivers/mmc/card/block.c index 7224f4c57421..e15684473c45 100644 --- a/drivers/mmc/card/block.c +++ b/drivers/mmc/card/block.c @@ -3431,14 +3431,27 @@ static int mmc_blk_cmdq_issue_rq(struct mmc_queue *mq, struct request *req) unsigned int cmd_flags = req ? req->cmd_flags : 0; mmc_get_card(card); + + if (!card->host->cmdq_ctx.active_reqs && mmc_card_doing_bkops(card)) { + ret = mmc_cmdq_halt(card->host, true); + if (ret) + goto out; + ret = mmc_stop_bkops(card); + if (ret) { + pr_err("%s: %s: mmc_stop_bkops failed %d\n", + md->disk->disk_name, __func__, ret); + goto out; + } + ret = mmc_cmdq_halt(card->host, false); + if (ret) + goto out; + } + ret = mmc_blk_cmdq_part_switch(card, md); if (ret) { pr_err("%s: %s: partition switch failed %d\n", md->disk->disk_name, __func__, ret); - if (req) - blk_end_request_all(req, ret); - mmc_put_card(card); - goto switch_failure; + goto out; } if (req) { @@ -3455,7 +3468,13 @@ static int mmc_blk_cmdq_issue_rq(struct mmc_queue *mq, struct request *req) } } -switch_failure: + return ret; + +out: + if (req) + blk_end_request_all(req, ret); + mmc_put_card(card); + return ret; }