diff options
Diffstat (limited to 'drivers/mmc/core/block.c')
| -rw-r--r-- | drivers/mmc/core/block.c | 42 | 
1 files changed, 23 insertions, 19 deletions
| diff --git a/drivers/mmc/core/block.c b/drivers/mmc/core/block.c index 90e1bcd03b46..4e61b28a002f 100644 --- a/drivers/mmc/core/block.c +++ b/drivers/mmc/core/block.c @@ -264,7 +264,7 @@ static ssize_t power_ro_lock_store(struct device *dev,  		goto out_put;  	}  	req_to_mmc_queue_req(req)->drv_op = MMC_DRV_OP_BOOT_WP; -	blk_execute_rq(NULL, req, 0); +	blk_execute_rq(req, false);  	ret = req_to_mmc_queue_req(req)->drv_op_result;  	blk_mq_free_request(req); @@ -657,7 +657,7 @@ static int mmc_blk_ioctl_cmd(struct mmc_blk_data *md,  		rpmb ? MMC_DRV_OP_IOCTL_RPMB : MMC_DRV_OP_IOCTL;  	req_to_mmc_queue_req(req)->drv_op_data = idatas;  	req_to_mmc_queue_req(req)->ioc_count = 1; -	blk_execute_rq(NULL, req, 0); +	blk_execute_rq(req, false);  	ioc_err = req_to_mmc_queue_req(req)->drv_op_result;  	err = mmc_blk_ioctl_copy_to_user(ic_ptr, idata);  	blk_mq_free_request(req); @@ -726,7 +726,7 @@ static int mmc_blk_ioctl_multi_cmd(struct mmc_blk_data *md,  		rpmb ? MMC_DRV_OP_IOCTL_RPMB : MMC_DRV_OP_IOCTL;  	req_to_mmc_queue_req(req)->drv_op_data = idata;  	req_to_mmc_queue_req(req)->ioc_count = num_of_cmds; -	blk_execute_rq(NULL, req, 0); +	blk_execute_rq(req, false);  	ioc_err = req_to_mmc_queue_req(req)->drv_op_result;  	/* copy to user if data and response */ @@ -1837,7 +1837,7 @@ static void mmc_blk_mq_rw_recovery(struct mmc_queue *mq, struct request *req)  	/* Reset if the card is in a bad state */  	if (!mmc_host_is_spi(mq->card->host) &&  	    err && mmc_blk_reset(md, card->host, type)) { -		pr_err("%s: recovery failed!\n", req->rq_disk->disk_name); +		pr_err("%s: recovery failed!\n", req->q->disk->disk_name);  		mqrq->retries = MMC_NO_RETRIES;  		return;  	} @@ -1908,8 +1908,8 @@ static int mmc_blk_card_busy(struct mmc_card *card, struct request *req)  	cb_data.card = card;  	cb_data.status = 0; -	err = __mmc_poll_for_busy(card, MMC_BLK_TIMEOUT_MS, &mmc_blk_busy_cb, -				  &cb_data); +	err = __mmc_poll_for_busy(card->host, MMC_BLK_TIMEOUT_MS, +				  &mmc_blk_busy_cb, &cb_data);  	/*  	 * Do not assume data transferred correctly if there are any error bits @@ -2051,7 +2051,8 @@ static void mmc_blk_mq_dec_in_flight(struct mmc_queue *mq, struct request *req)  		mmc_put_card(mq->card, &mq->ctx);  } -static void mmc_blk_mq_post_req(struct mmc_queue *mq, struct request *req) +static void mmc_blk_mq_post_req(struct mmc_queue *mq, struct request *req, +				bool can_sleep)  {  	struct mmc_queue_req *mqrq = req_to_mmc_queue_req(req);  	struct mmc_request *mrq = &mqrq->brq.mrq; @@ -2063,10 +2064,14 @@ static void mmc_blk_mq_post_req(struct mmc_queue *mq, struct request *req)  	 * Block layer timeouts race with completions which means the normal  	 * completion path cannot be used during recovery.  	 */ -	if (mq->in_recovery) +	if (mq->in_recovery) {  		mmc_blk_mq_complete_rq(mq, req); -	else if (likely(!blk_should_fake_timeout(req->q))) -		blk_mq_complete_request(req); +	} else if (likely(!blk_should_fake_timeout(req->q))) { +		if (can_sleep) +			blk_mq_complete_request_direct(req, mmc_blk_mq_complete); +		else +			blk_mq_complete_request(req); +	}  	mmc_blk_mq_dec_in_flight(mq, req);  } @@ -2087,7 +2092,7 @@ void mmc_blk_mq_recovery(struct mmc_queue *mq)  	mmc_blk_urgent_bkops(mq, mqrq); -	mmc_blk_mq_post_req(mq, req); +	mmc_blk_mq_post_req(mq, req, true);  }  static void mmc_blk_mq_complete_prev_req(struct mmc_queue *mq, @@ -2106,7 +2111,7 @@ static void mmc_blk_mq_complete_prev_req(struct mmc_queue *mq,  	if (prev_req)  		*prev_req = mq->complete_req;  	else -		mmc_blk_mq_post_req(mq, mq->complete_req); +		mmc_blk_mq_post_req(mq, mq->complete_req, true);  	mq->complete_req = NULL; @@ -2178,7 +2183,8 @@ static void mmc_blk_mq_req_done(struct mmc_request *mrq)  	mq->rw_wait = false;  	wake_up(&mq->wait); -	mmc_blk_mq_post_req(mq, req); +	/* context unknown */ +	mmc_blk_mq_post_req(mq, req, false);  }  static bool mmc_blk_rw_wait_cond(struct mmc_queue *mq, int *err) @@ -2238,7 +2244,7 @@ static int mmc_blk_mq_issue_rw_rq(struct mmc_queue *mq,  	err = mmc_start_request(host, &mqrq->brq.mrq);  	if (prev_req) -		mmc_blk_mq_post_req(mq, prev_req); +		mmc_blk_mq_post_req(mq, prev_req, true);  	if (err)  		mq->rw_wait = false; @@ -2395,10 +2401,8 @@ static struct mmc_blk_data *mmc_blk_alloc_req(struct mmc_card *card,  	md->disk->private_data = md;  	md->parent = parent;  	set_disk_ro(md->disk, md->read_only || default_ro); -	md->disk->flags = GENHD_FL_EXT_DEVT;  	if (area_type & (MMC_BLK_DATA_AREA_RPMB | MMC_BLK_DATA_AREA_BOOT)) -		md->disk->flags |= GENHD_FL_NO_PART_SCAN -				   | GENHD_FL_SUPPRESS_PARTITION_INFO; +		md->disk->flags |= GENHD_FL_NO_PART;  	/*  	 * As discussed on lkml, GENHD_FL_REMOVABLE should: @@ -2739,7 +2743,7 @@ static int mmc_dbg_card_status_get(void *data, u64 *val)  	if (IS_ERR(req))  		return PTR_ERR(req);  	req_to_mmc_queue_req(req)->drv_op = MMC_DRV_OP_GET_CARD_STATUS; -	blk_execute_rq(NULL, req, 0); +	blk_execute_rq(req, false);  	ret = req_to_mmc_queue_req(req)->drv_op_result;  	if (ret >= 0) {  		*val = ret; @@ -2778,7 +2782,7 @@ static int mmc_ext_csd_open(struct inode *inode, struct file *filp)  	}  	req_to_mmc_queue_req(req)->drv_op = MMC_DRV_OP_GET_EXT_CSD;  	req_to_mmc_queue_req(req)->drv_op_data = &ext_csd; -	blk_execute_rq(NULL, req, 0); +	blk_execute_rq(req, false);  	err = req_to_mmc_queue_req(req)->drv_op_result;  	blk_mq_free_request(req);  	if (err) { |