Message ID | 1458055567-27878-1-git-send-email-fengwei.yin@linaro.org |
---|---|
State | New |
Headers | show |
On 2016/3/15 22:31, Christoph Hellwig wrote: > On Tue, Mar 15, 2016 at 11:26:07AM -0400, Yin, Fengwei wrote: >> From: Fengwei Yin <fengwei.yin@linaro.org> >> >> a5f5774c55a2e3ed75f4d6c5556b7bfcb726e6f0 introduced the whole block >> device checking for MMC_IOC_CMD while the old code has no such check. >> >> It breaks some ioctl call like BLKROSET from user space. An example >> is "adb remount" cmd. It prints out following error message: >> "remount of /system failed; couldn't make block device XXXX writable: \ >> Operation not permitted." >> while the command worked fine. >> >> This change move the whole block device checking only for MMC_IOC_MULTI_CMD. > > I think mmc_blk_ioctl_cmd will need this as well, as will probably > do any new ioctl. > > So I think the right fix is to simply return -EINVAL instead of > EPERM if on a partition, which will make all the block layer ioctls > works fine. Fair enough. I will wait for one more day for further comments to the patch. And update the patch tomorrow. Thanks a lot for looking into the patch. Regards Yin, Fengwei >
On 2016/3/16 19:48, Jon Hunter wrote: > > On 15/03/16 23:44, fengwei.yin wrote: >> >> >> On 2016/3/15 22:31, Christoph Hellwig wrote: >>> On Tue, Mar 15, 2016 at 11:26:07AM -0400, Yin, Fengwei wrote: >>>> From: Fengwei Yin <fengwei.yin@linaro.org> >>>> >>>> a5f5774c55a2e3ed75f4d6c5556b7bfcb726e6f0 introduced the whole block >>>> device checking for MMC_IOC_CMD while the old code has no such check. >>>> >>>> It breaks some ioctl call like BLKROSET from user space. An example >>>> is "adb remount" cmd. It prints out following error message: >>>> "remount of /system failed; couldn't make block device XXXX writable: \ >>>> Operation not permitted." >>>> while the command worked fine. >>>> >>>> This change move the whole block device checking only for >>>> MMC_IOC_MULTI_CMD. >>> >>> I think mmc_blk_ioctl_cmd will need this as well, as will probably >>> do any new ioctl. >>> >>> So I think the right fix is to simply return -EINVAL instead of >>> EPERM if on a partition, which will make all the block layer ioctls >>> works fine. >> Fair enough. >> >> I will wait for one more day for further comments to the patch. And update >> the patch tomorrow. Thanks a lot for looking into the patch. > > There is already a patch in the works for this [0]. > > Cheers > Jon > > [0] http://marc.info/?l=linux-mmc&m=145812340114153&w=2 Thanks a lot for the information. I will drop my patch. Regards Yin, Fengwei >
diff --git a/drivers/mmc/card/block.c b/drivers/mmc/card/block.c index fe207e5..72b9053 100644 --- a/drivers/mmc/card/block.c +++ b/drivers/mmc/card/block.c @@ -693,7 +693,7 @@ static int mmc_blk_ioctl(struct block_device *bdev, fmode_t mode, * whole block device, not on a partition. This prevents overspray * between sibling partitions. */ - if ((!capable(CAP_SYS_RAWIO)) || (bdev != bdev->bd_contains)) + if (!capable(CAP_SYS_RAWIO)) return -EPERM; switch (cmd) { @@ -701,6 +701,9 @@ static int mmc_blk_ioctl(struct block_device *bdev, fmode_t mode, return mmc_blk_ioctl_cmd(bdev, (struct mmc_ioc_cmd __user *)arg); case MMC_IOC_MULTI_CMD: + if (bdev != bdev->bd_contains) + return -EPERM; + return mmc_blk_ioctl_multi_cmd(bdev, (struct mmc_ioc_multi_cmd __user *)arg); default: