|
@@ -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:
|