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