Hi Michał,

On Wed, 20 Apr 2011, Michał Mirosław wrote:
> Hmm. This might be even better:
> 
> static int mmc_blk_ioctl(struct block_device *bdev, fmode_t mode,
> unsigned int cmd, unsigned long arg)
> {
>   struct mmc_ioc_cmd blk;
> 
>   if (cmd != MMC_IOC_CMD)
>     return -EINVAL;
> 
>   copy_from_user((void __user *)arg, &blk) ...
> 
> #ifdef CONFIG_COMPAT
>   if (is_compat_task())
>     blk.data_ptr = compat_ptr(*(u32 *)&blk.data_ptr);
> #endif
> 
>   return mmc_blk_ioctl_cmd(bdev, &blk);
> }
> 
> [no compat_ioctl needed]
> 

I'm okay with the anon union + ``compat_ptr(*(u32 *))`` part of your
solution.  If everyone else thinks it is reasonable, I'll submit a v7
with it.

However, I still think it should be implemented in compat_ioctl()
because compat_blkdev_ioctl() expects it.  Either that, or I add to the
big switch in compat_blkdev_driver_ioctl(), and spreading this change
out to block/compat_ioctl.c does not seem like The Right Thing to me.

John

Reply via email to