mmc: block: Move duplicate check
mmc_blk_ioctl() calls either mmc_blk_ioctl_cmd() or mmc_blk_ioctl_multi_cmd() and each of these make the same check. Factor it into a new helper function, call it on both branches of the switch() statement and save a chunk of duplicate code. Cc: Shawn Lin <shawn.lin@rock-chips.com> Signed-off-by: Linus Walleij <linus.walleij@linaro.org> Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
This commit is contained in:
committed by
Ulf Hansson
parent
627c3ccfb4
commit
61fe0e2bda
@@ -564,14 +564,6 @@ static int mmc_blk_ioctl_cmd(struct block_device *bdev,
|
|||||||
int err = 0, ioc_err = 0;
|
int err = 0, ioc_err = 0;
|
||||||
struct request *req;
|
struct request *req;
|
||||||
|
|
||||||
/*
|
|
||||||
* The caller must have CAP_SYS_RAWIO, and must be calling this on the
|
|
||||||
* whole block device, not on a partition. This prevents overspray
|
|
||||||
* between sibling partitions.
|
|
||||||
*/
|
|
||||||
if ((!capable(CAP_SYS_RAWIO)) || (bdev != bdev->bd_contains))
|
|
||||||
return -EPERM;
|
|
||||||
|
|
||||||
idata = mmc_blk_ioctl_copy_from_user(ic_ptr);
|
idata = mmc_blk_ioctl_copy_from_user(ic_ptr);
|
||||||
if (IS_ERR(idata))
|
if (IS_ERR(idata))
|
||||||
return PTR_ERR(idata);
|
return PTR_ERR(idata);
|
||||||
@@ -624,14 +616,6 @@ static int mmc_blk_ioctl_multi_cmd(struct block_device *bdev,
|
|||||||
__u64 num_of_cmds;
|
__u64 num_of_cmds;
|
||||||
struct request *req;
|
struct request *req;
|
||||||
|
|
||||||
/*
|
|
||||||
* The caller must have CAP_SYS_RAWIO, and must be calling this on the
|
|
||||||
* whole block device, not on a partition. This prevents overspray
|
|
||||||
* between sibling partitions.
|
|
||||||
*/
|
|
||||||
if ((!capable(CAP_SYS_RAWIO)) || (bdev != bdev->bd_contains))
|
|
||||||
return -EPERM;
|
|
||||||
|
|
||||||
if (copy_from_user(&num_of_cmds, &user->num_of_cmds,
|
if (copy_from_user(&num_of_cmds, &user->num_of_cmds,
|
||||||
sizeof(num_of_cmds)))
|
sizeof(num_of_cmds)))
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
@@ -698,14 +682,34 @@ cmd_err:
|
|||||||
return ioc_err ? ioc_err : err;
|
return ioc_err ? ioc_err : err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int mmc_blk_check_blkdev(struct block_device *bdev)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* The caller must have CAP_SYS_RAWIO, and must be calling this on the
|
||||||
|
* whole block device, not on a partition. This prevents overspray
|
||||||
|
* between sibling partitions.
|
||||||
|
*/
|
||||||
|
if ((!capable(CAP_SYS_RAWIO)) || (bdev != bdev->bd_contains))
|
||||||
|
return -EPERM;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
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)
|
||||||
{
|
{
|
||||||
|
int ret;
|
||||||
|
|
||||||
switch (cmd) {
|
switch (cmd) {
|
||||||
case MMC_IOC_CMD:
|
case MMC_IOC_CMD:
|
||||||
|
ret = mmc_blk_check_blkdev(bdev);
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
return mmc_blk_ioctl_cmd(bdev,
|
return mmc_blk_ioctl_cmd(bdev,
|
||||||
(struct mmc_ioc_cmd __user *)arg);
|
(struct mmc_ioc_cmd __user *)arg);
|
||||||
case MMC_IOC_MULTI_CMD:
|
case MMC_IOC_MULTI_CMD:
|
||||||
|
ret = mmc_blk_check_blkdev(bdev);
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
return mmc_blk_ioctl_multi_cmd(bdev,
|
return mmc_blk_ioctl_multi_cmd(bdev,
|
||||||
(struct mmc_ioc_multi_cmd __user *)arg);
|
(struct mmc_ioc_multi_cmd __user *)arg);
|
||||||
default:
|
default:
|
||||||
|
Reference in New Issue
Block a user