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; | ||||
| } | ||||
| 
 | ||||
| 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_blk_ioc_data *idata; | ||||
| 	struct mmc_blk_ioc_data *idatas[1]; | ||||
| 	struct mmc_blk_data *md; | ||||
| 	struct mmc_queue *mq; | ||||
| 	struct mmc_card *card; | ||||
| 	int err = 0, ioc_err = 0; | ||||
| @ -568,12 +567,6 @@ static int mmc_blk_ioctl_cmd(struct block_device *bdev, | ||||
| 	if (IS_ERR(idata)) | ||||
| 		return PTR_ERR(idata); | ||||
| 
 | ||||
| 	md = mmc_blk_get(bdev->bd_disk); | ||||
| 	if (!md) { | ||||
| 		err = -EINVAL; | ||||
| 		goto cmd_err; | ||||
| 	} | ||||
| 
 | ||||
| 	card = md->queue.card; | ||||
| 	if (IS_ERR(card)) { | ||||
| 		err = PTR_ERR(card); | ||||
| @ -597,20 +590,17 @@ static int mmc_blk_ioctl_cmd(struct block_device *bdev, | ||||
| 	blk_put_request(req); | ||||
| 
 | ||||
| cmd_done: | ||||
| 	mmc_blk_put(md); | ||||
| cmd_err: | ||||
| 	kfree(idata->buf); | ||||
| 	kfree(idata); | ||||
| 	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_blk_ioc_data **idata = NULL; | ||||
| 	struct mmc_ioc_cmd __user *cmds = user->cmds; | ||||
| 	struct mmc_card *card; | ||||
| 	struct mmc_blk_data *md; | ||||
| 	struct mmc_queue *mq; | ||||
| 	int i, err = 0, ioc_err = 0; | ||||
| 	__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; | ||||
| 	if (IS_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); | ||||
| 
 | ||||
| cmd_done: | ||||
| 	mmc_blk_put(md); | ||||
| cmd_err: | ||||
| 	for (i = 0; i < num_of_cmds; i++) { | ||||
| 		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, | ||||
| 	unsigned int cmd, unsigned long arg) | ||||
| { | ||||
| 	struct mmc_blk_data *md; | ||||
| 	int ret; | ||||
| 
 | ||||
| 	switch (cmd) { | ||||
| @ -704,14 +687,24 @@ static int mmc_blk_ioctl(struct block_device *bdev, fmode_t mode, | ||||
| 		ret = mmc_blk_check_blkdev(bdev); | ||||
| 		if (ret) | ||||
| 			return ret; | ||||
| 		return mmc_blk_ioctl_cmd(bdev, | ||||
| 				(struct mmc_ioc_cmd __user *)arg); | ||||
| 		md = mmc_blk_get(bdev->bd_disk); | ||||
| 		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: | ||||
| 		ret = mmc_blk_check_blkdev(bdev); | ||||
| 		if (ret) | ||||
| 			return ret; | ||||
| 		return mmc_blk_ioctl_multi_cmd(bdev, | ||||
| 				(struct mmc_ioc_multi_cmd __user *)arg); | ||||
| 		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); | ||||
| 		mmc_blk_put(md); | ||||
| 		return ret; | ||||
| 	default: | ||||
| 		return -EINVAL; | ||||
| 	} | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user