From: Chris Ball <cjb@laptop.org>
To: Johan Rudholm <johan.rudholm@stericsson.com>
Cc: linux-mmc@vger.kernel.org, Per Forlin <per.forlin@stericsson.com>,
Ulf Hansson <ulf.hansson@stericsson.com>
Subject: Re: [PATCH] mmc: core: check for zero length ioctl data
Date: Thu, 01 Dec 2011 13:20:53 -0500 [thread overview]
Message-ID: <87ipm0kvay.fsf@laptop.org> (raw)
In-Reply-To: <1322035558-1127-1-git-send-email-johan.rudholm@stericsson.com> (Johan Rudholm's message of "Wed, 23 Nov 2011 09:05:58 +0100")
Hi Johan,
On Wed, Nov 23 2011, Johan Rudholm wrote:
> If the read or write buffer size associated with the command sent
> through the mmc_blk_ioctl is zero, do not prepare data buffer.
>
> This enables a ioctl(2) call to for instance send a MMC_SWITCH to set
> a byte in the ext_csd.
>
> Change-Id: Ieab8400ace1ba91bfb3d911377de557bf2d593d0
(Please don't send these tags; I've stripped this one out.)
> Signed-off-by: Johan Rudholm <johan.rudholm@stericsson.com>
> ---
> drivers/mmc/card/block.c | 82 +++++++++++++++++++++++++---------------------
> 1 files changed, 45 insertions(+), 37 deletions(-)
>
> diff --git a/drivers/mmc/card/block.c b/drivers/mmc/card/block.c
> index 12096cc..4d29b30 100644
> --- a/drivers/mmc/card/block.c
> +++ b/drivers/mmc/card/block.c
> @@ -336,6 +336,9 @@ static struct mmc_blk_ioc_data *mmc_blk_ioctl_copy_from_user(
> goto idata_err;
> }
>
> + if (!idata->buf_bytes)
> + return idata;
> +
> idata->buf = kzalloc(idata->buf_bytes, GFP_KERNEL);
> if (!idata->buf) {
> err = -ENOMEM;
> @@ -382,25 +385,6 @@ static int mmc_blk_ioctl_cmd(struct block_device *bdev,
> if (IS_ERR(idata))
> return PTR_ERR(idata);
>
> - cmd.opcode = idata->ic.opcode;
> - cmd.arg = idata->ic.arg;
> - cmd.flags = idata->ic.flags;
> -
> - data.sg = &sg;
> - data.sg_len = 1;
> - data.blksz = idata->ic.blksz;
> - data.blocks = idata->ic.blocks;
> -
> - sg_init_one(data.sg, idata->buf, idata->buf_bytes);
> -
> - if (idata->ic.write_flag)
> - data.flags = MMC_DATA_WRITE;
> - else
> - data.flags = MMC_DATA_READ;
> -
> - mrq.cmd = &cmd;
> - mrq.data = &data;
> -
> md = mmc_blk_get(bdev->bd_disk);
> if (!md) {
> err = -EINVAL;
> @@ -413,6 +397,48 @@ static int mmc_blk_ioctl_cmd(struct block_device *bdev,
> goto cmd_done;
> }
>
> + cmd.opcode = idata->ic.opcode;
> + cmd.arg = idata->ic.arg;
> + cmd.flags = idata->ic.flags;
> +
> + if (idata->buf_bytes) {
> + data.sg = &sg;
> + data.sg_len = 1;
> + data.blksz = idata->ic.blksz;
> + data.blocks = idata->ic.blocks;
> +
> + sg_init_one(data.sg, idata->buf, idata->buf_bytes);
> +
> + if (idata->ic.write_flag)
> + data.flags = MMC_DATA_WRITE;
> + else
> + data.flags = MMC_DATA_READ;
> +
> + /* data.flags must already be set before doing this. */
> + mmc_set_data_timeout(&data, card);
> +
> + /* Allow overriding the timeout_ns for empirical tuning. */
> + if (idata->ic.data_timeout_ns)
> + data.timeout_ns = idata->ic.data_timeout_ns;
> +
> + if ((cmd.flags & MMC_RSP_R1B) == MMC_RSP_R1B) {
> + /*
> + * Pretend this is a data transfer and rely on the
> + * host driver to compute timeout. When all host
> + * drivers support cmd.cmd_timeout for R1B, this
> + * can be changed to:
> + *
> + * mrq.data = NULL;
> + * cmd.cmd_timeout = idata->ic.cmd_timeout_ms;
> + */
> + data.timeout_ns = idata->ic.cmd_timeout_ms * 1000000;
> + }
> +
> + mrq.data = &data;
> + }
> +
> + mrq.cmd = &cmd;
> +
> mmc_claim_host(card->host);
>
> if (idata->ic.is_acmd) {
> @@ -421,24 +447,6 @@ static int mmc_blk_ioctl_cmd(struct block_device *bdev,
> goto cmd_rel_host;
> }
>
> - /* data.flags must already be set before doing this. */
> - mmc_set_data_timeout(&data, card);
> - /* Allow overriding the timeout_ns for empirical tuning. */
> - if (idata->ic.data_timeout_ns)
> - data.timeout_ns = idata->ic.data_timeout_ns;
> -
> - if ((cmd.flags & MMC_RSP_R1B) == MMC_RSP_R1B) {
> - /*
> - * Pretend this is a data transfer and rely on the host driver
> - * to compute timeout. When all host drivers support
> - * cmd.cmd_timeout for R1B, this can be changed to:
> - *
> - * mrq.data = NULL;
> - * cmd.cmd_timeout = idata->ic.cmd_timeout_ms;
> - */
> - data.timeout_ns = idata->ic.cmd_timeout_ms * 1000000;
> - }
> -
> mmc_wait_for_req(card->host, &mrq);
>
> if (cmd.error) {
Thanks, looks good to me, pushed to mmc-next for 3.3.
Would you be able to share the userspace code that you've been using
with this, please? I'd like to start collecting a repository of
userspace code showing common uses of this ioctl.
- Chris.
--
Chris Ball <cjb@laptop.org> <http://printf.net/>
One Laptop Per Child
next prev parent reply other threads:[~2011-12-01 18:20 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-11-23 8:05 [PATCH] mmc: core: check for zero length ioctl data Johan Rudholm
2011-12-01 18:20 ` Chris Ball [this message]
2011-12-02 9:51 ` Johan RUDHOLM
2011-12-02 14:15 ` Chris Ball
2011-12-02 15:18 ` Johan RUDHOLM
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=87ipm0kvay.fsf@laptop.org \
--to=cjb@laptop.org \
--cc=johan.rudholm@stericsson.com \
--cc=linux-mmc@vger.kernel.org \
--cc=per.forlin@stericsson.com \
--cc=ulf.hansson@stericsson.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.