On 10 May 2017 at 10:24, Linus Walleij <[email protected]> wrote:
> This wraps single ioctl() commands into block requests using
> the custom block layer request types REQ_OP_DRV_IN and
> REQ_OP_DRV_OUT.
>
> By doing this we are loosening the grip on the big host lock,
> since two calls to mmc_get_card()/mmc_put_card() are removed.
>
> We are storing the ioctl() in/out argument as a pointer in
> the per-request struct mmc_blk_request container. Since we
> now let the block layer allocate this data, blk_get_request()
> will allocate it for us and we can immediately dereference
> it and use it to pass the argument into the block layer.
>
> Tested on the ux500 with the userspace:
> mmc extcsd read /dev/mmcblk3
> resulting in a successful EXTCSD info dump back to the
> console.
>
> Signed-off-by: Linus Walleij <[email protected]>
> ---
> drivers/mmc/core/block.c | 56
> ++++++++++++++++++++++++++++++++++++++----------
[...]
> @@ -1854,7 +1882,13 @@ void mmc_blk_issue_rq(struct mmc_queue *mq, struct
> request *req)
> goto out;
> }
>
> - if (req && req_op(req) == REQ_OP_DISCARD) {
> + if (req &&
> + (req_op(req) == REQ_OP_DRV_IN || req_op(req) == REQ_OP_DRV_OUT)) {
> + /* complete ongoing async transfer before issuing ioctl()s */
> + if (mq->qcnt)
> + mmc_blk_issue_rw_rq(mq, NULL);
> + mmc_blk_ioctl_cmd_issue(mq, req);
> + } else if (req && req_op(req) == REQ_OP_DISCARD) {
While you are at it, would you mind converting this if-else-if to a
switch clause instead?
[...]
Kind regards
Uffe