Commit 2fe20bae authored by Linus Walleij's avatar Linus Walleij Committed by Ulf Hansson

mmc: block: Reparametrize mmc_blk_ioctl_[multi]_cmd()

Instead of passing a block device to
mmc_blk_ioctl[_multi]_cmd(), let's pass struct mmc_blk_data()
so we operate ioctl()s on the MMC block device representation
rather than the vanilla block device.

This saves a little duplicated code and makes it possible to
issue ioctl()s not targeted for a specific block device but
rather for a specific partition/area.
Signed-off-by: default avatarLinus Walleij <linus.walleij@linaro.org>
Signed-off-by: default avatarUlf Hansson <ulf.hansson@linaro.org>
parent 1f797edc
...@@ -553,12 +553,11 @@ static int __mmc_blk_ioctl_cmd(struct mmc_card *card, struct mmc_blk_data *md, ...@@ -553,12 +553,11 @@ static int __mmc_blk_ioctl_cmd(struct mmc_card *card, struct mmc_blk_data *md,
return err; return err;
} }
static int mmc_blk_ioctl_cmd(struct block_device *bdev, static int mmc_blk_ioctl_cmd(struct mmc_blk_data *md,
struct mmc_ioc_cmd __user *ic_ptr) struct mmc_ioc_cmd __user *ic_ptr)
{ {
struct mmc_blk_ioc_data *idata; struct mmc_blk_ioc_data *idata;
struct mmc_blk_ioc_data *idatas[1]; struct mmc_blk_ioc_data *idatas[1];
struct mmc_blk_data *md;
struct mmc_queue *mq; struct mmc_queue *mq;
struct mmc_card *card; struct mmc_card *card;
int err = 0, ioc_err = 0; int err = 0, ioc_err = 0;
...@@ -568,12 +567,6 @@ static int mmc_blk_ioctl_cmd(struct block_device *bdev, ...@@ -568,12 +567,6 @@ static int mmc_blk_ioctl_cmd(struct block_device *bdev,
if (IS_ERR(idata)) if (IS_ERR(idata))
return PTR_ERR(idata); return PTR_ERR(idata);
md = mmc_blk_get(bdev->bd_disk);
if (!md) {
err = -EINVAL;
goto cmd_err;
}
card = md->queue.card; card = md->queue.card;
if (IS_ERR(card)) { if (IS_ERR(card)) {
err = PTR_ERR(card); err = PTR_ERR(card);
...@@ -597,20 +590,17 @@ static int mmc_blk_ioctl_cmd(struct block_device *bdev, ...@@ -597,20 +590,17 @@ static int mmc_blk_ioctl_cmd(struct block_device *bdev,
blk_put_request(req); blk_put_request(req);
cmd_done: cmd_done:
mmc_blk_put(md);
cmd_err:
kfree(idata->buf); kfree(idata->buf);
kfree(idata); kfree(idata);
return ioc_err ? ioc_err : err; return ioc_err ? ioc_err : err;
} }
static int mmc_blk_ioctl_multi_cmd(struct block_device *bdev, static int mmc_blk_ioctl_multi_cmd(struct mmc_blk_data *md,
struct mmc_ioc_multi_cmd __user *user) struct mmc_ioc_multi_cmd __user *user)
{ {
struct mmc_blk_ioc_data **idata = NULL; struct mmc_blk_ioc_data **idata = NULL;
struct mmc_ioc_cmd __user *cmds = user->cmds; struct mmc_ioc_cmd __user *cmds = user->cmds;
struct mmc_card *card; struct mmc_card *card;
struct mmc_blk_data *md;
struct mmc_queue *mq; struct mmc_queue *mq;
int i, err = 0, ioc_err = 0; int i, err = 0, ioc_err = 0;
__u64 num_of_cmds; __u64 num_of_cmds;
...@@ -639,16 +629,10 @@ static int mmc_blk_ioctl_multi_cmd(struct block_device *bdev, ...@@ -639,16 +629,10 @@ static int mmc_blk_ioctl_multi_cmd(struct block_device *bdev,
} }
} }
md = mmc_blk_get(bdev->bd_disk);
if (!md) {
err = -EINVAL;
goto cmd_err;
}
card = md->queue.card; card = md->queue.card;
if (IS_ERR(card)) { if (IS_ERR(card)) {
err = PTR_ERR(card); err = PTR_ERR(card);
goto cmd_done; goto cmd_err;
} }
...@@ -671,8 +655,6 @@ static int mmc_blk_ioctl_multi_cmd(struct block_device *bdev, ...@@ -671,8 +655,6 @@ static int mmc_blk_ioctl_multi_cmd(struct block_device *bdev,
blk_put_request(req); blk_put_request(req);
cmd_done:
mmc_blk_put(md);
cmd_err: cmd_err:
for (i = 0; i < num_of_cmds; i++) { for (i = 0; i < num_of_cmds; i++) {
kfree(idata[i]->buf); kfree(idata[i]->buf);
...@@ -697,6 +679,7 @@ static int mmc_blk_check_blkdev(struct block_device *bdev) ...@@ -697,6 +679,7 @@ static int mmc_blk_check_blkdev(struct block_device *bdev)
static int mmc_blk_ioctl(struct block_device *bdev, fmode_t mode, static int mmc_blk_ioctl(struct block_device *bdev, fmode_t mode,
unsigned int cmd, unsigned long arg) unsigned int cmd, unsigned long arg)
{ {
struct mmc_blk_data *md;
int ret; int ret;
switch (cmd) { switch (cmd) {
...@@ -704,14 +687,24 @@ static int mmc_blk_ioctl(struct block_device *bdev, fmode_t mode, ...@@ -704,14 +687,24 @@ static int mmc_blk_ioctl(struct block_device *bdev, fmode_t mode,
ret = mmc_blk_check_blkdev(bdev); ret = mmc_blk_check_blkdev(bdev);
if (ret) if (ret)
return ret; return ret;
return mmc_blk_ioctl_cmd(bdev, md = mmc_blk_get(bdev->bd_disk);
(struct mmc_ioc_cmd __user *)arg); if (!md)
return -EINVAL;
ret = mmc_blk_ioctl_cmd(md,
(struct mmc_ioc_cmd __user *)arg);
mmc_blk_put(md);
return ret;
case MMC_IOC_MULTI_CMD: case MMC_IOC_MULTI_CMD:
ret = mmc_blk_check_blkdev(bdev); ret = mmc_blk_check_blkdev(bdev);
if (ret) if (ret)
return ret; return ret;
return mmc_blk_ioctl_multi_cmd(bdev, md = mmc_blk_get(bdev->bd_disk);
(struct mmc_ioc_multi_cmd __user *)arg); if (!md)
return -EINVAL;
ret = mmc_blk_ioctl_multi_cmd(md,
(struct mmc_ioc_multi_cmd __user *)arg);
mmc_blk_put(md);
return ret;
default: default:
return -EINVAL; return -EINVAL;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment