2011/4/14 John Calixto <[email protected]>:
[...]

> +       /* DAT buffer */
> +       __u32 data_ptr_size;  /* size of the *pointer* */
> +       __u64 data_ptr;

So... again... What's the problem with anonymous union of pointer and u64?

Example implementation:

struct mmc_ioc_cmd {
  ...
  union {
    void __user *data_ptr;
    __u64 __data_ptr_storage;
  };
};

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) ...

  return mmc_blk_ioctl_cmd(bdev, &blk);
}

static int mmc_blk_compat_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(compat_ptr(arg), &blk) ...
  blk.data_ptr = compat_ptr(*(__u32 *)&blk.data_ptr);

  return mmc_blk_ioctl_cmd(bdev, &blk);
}

Best Regards,
Michał Mirosław
--
To unsubscribe from this list: send the line "unsubscribe linux-mmc" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to