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: Linus Walleij <linus.walleij@linaro.org> Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
This commit is contained in:
parent
1f797edc62
commit
2fe20baec4
@ -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,
|
|||||||
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,
|
|||||||
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,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
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,
|
|||||||
|
|
||||||
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)
|
|||||||
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,
|
|||||||
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);
|
||||||
|
if (!md)
|
||||||
|
return -EINVAL;
|
||||||
|
ret = mmc_blk_ioctl_cmd(md,
|
||||||
(struct mmc_ioc_cmd __user *)arg);
|
(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);
|
||||||
|
if (!md)
|
||||||
|
return -EINVAL;
|
||||||
|
ret = mmc_blk_ioctl_multi_cmd(md,
|
||||||
(struct mmc_ioc_multi_cmd __user *)arg);
|
(struct mmc_ioc_multi_cmd __user *)arg);
|
||||||
|
mmc_blk_put(md);
|
||||||
|
return ret;
|
||||||
default:
|
default:
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user