long compat_ion_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) { long ret; if (!filp->f_op || !filp->f_op->unlocked_ioctl) { IONMSG("compat_ion_ioctl file has no f_op or no f_op->unlocked_ioctl.\n"); return -ENOTTY; } switch (cmd) { case COMPAT_ION_IOC_ALLOC: { struct compat_ion_allocation_data __user *data32; struct ion_allocation_data __user *data; int err; data32 = compat_ptr(arg); data = compat_alloc_user_space(sizeof(*data)); if (data == NULL) { IONMSG("COMPAT_ION_IOC_ALLOC alloc user space fail!.\n"); return -EFAULT; } err = compat_get_ion_allocation_data(data32, data); if (err) { IONMSG("COMPAT_ION_IOC_ALLOC get ion allocation data fail!. err = %d.\n", err); return err; } ret = filp->f_op->unlocked_ioctl(filp, ION_IOC_ALLOC, (unsigned long)data); if (ret) IONMSG("COMPAT_ION_IOC_ALLOC unlocked_ioctl fail! ret = %ld.\n", ret); err = compat_put_ion_allocation_data(data32, data); if (err) IONMSG("COMPAT_ION_IOC_ALLOC put ion allocation data fail! err = %d.\n", err); return ret ? ret : err; } case COMPAT_ION_IOC_FREE: { struct compat_ion_handle_data __user *data32; struct ion_handle_data __user *data; int err; data32 = compat_ptr(arg); data = compat_alloc_user_space(sizeof(*data)); if (data == NULL) { IONMSG("COMPAT_ION_IOC_FREE alloc user space fail!.\n"); return -EFAULT; } err = compat_get_ion_handle_data(data32, data); if (err) { IONMSG("COMPAT_ION_IOC_FREE get ion handle data fail!. err = %d.\n", err); return err; } ret = filp->f_op->unlocked_ioctl(filp, ION_IOC_FREE, (unsigned long)data); if (ret) IONMSG("COMPAT_ION_IOC_FREE unlocked_ioctl fail! ret = %ld.\n", ret); return ret; } case COMPAT_ION_IOC_CUSTOM: { struct compat_ion_custom_data __user *data32; struct ion_custom_data __user *data; int err; data32 = compat_ptr(arg); data = compat_alloc_user_space(sizeof(*data)); if (data == NULL) { IONMSG("COMPAT_ION_IOC_CUSTOM alloc user space fail!.\n"); return -EFAULT; } err = compat_get_ion_custom_data(data32, data); if (err) { IONMSG("COMPAT_ION_IOC_CUSTOM get ion custom data fail!. err = %d.\n", err); return err; } ret = filp->f_op->unlocked_ioctl(filp, ION_IOC_CUSTOM, (unsigned long)data); if (ret) IONMSG("COMPAT_ION_IOC_CUSTOM unlocked_ioctl fail! ret = %ld.\n", ret); err = compat_put_ion_custom_data(data32, data); if (err) IONMSG("COMPAT_ION_IOC_CUSTOM put ion custom data fail! err = %d.\n", err); return ret ? ret : err; } case ION_IOC_SHARE: case ION_IOC_MAP: case ION_IOC_IMPORT: case ION_IOC_SYNC: return filp->f_op->unlocked_ioctl(filp, cmd, (unsigned long)compat_ptr(arg)); default: { IONMSG("compat_ion_ioctl : No such command!! 0x%x\n", cmd); return -ENOIOCTLCMD; } } }
long compat_ion_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) { long ret; if (!filp->f_op || !filp->f_op->unlocked_ioctl) return -ENOTTY; switch (cmd) { case COMPAT_ION_IOC_ALLOC: { struct compat_ion_allocation_data __user *data32; struct ion_allocation_data __user *data; int err; data32 = compat_ptr(arg); data = compat_alloc_user_space(sizeof(*data)); if (data == NULL) return -EFAULT; err = compat_get_ion_allocation_data(data32, data); if (err) return err; ret = filp->f_op->unlocked_ioctl(filp, ION_IOC_ALLOC, (unsigned long)data); err = compat_put_ion_allocation_data(data32, data); return ret ? ret : err; } case COMPAT_ION_IOC_FREE: { struct compat_ion_handle_data __user *data32; struct ion_handle_data __user *data; int err; data32 = compat_ptr(arg); data = compat_alloc_user_space(sizeof(*data)); if (data == NULL) return -EFAULT; err = compat_get_ion_handle_data(data32, data); if (err) return err; return filp->f_op->unlocked_ioctl(filp, ION_IOC_FREE, (unsigned long)data); } case COMPAT_ION_IOC_CUSTOM: { struct compat_ion_custom_data __user *data32; struct ion_custom_data __user *data; int err; data32 = compat_ptr(arg); data = compat_alloc_user_space(sizeof(*data)); if (data == NULL) return -EFAULT; err = compat_get_ion_custom_data(data32, data); if (err) return err; return filp->f_op->unlocked_ioctl(filp, ION_IOC_CUSTOM, (unsigned long)data); } case ION_IOC_SHARE: case ION_IOC_MAP: case ION_IOC_IMPORT: case ION_IOC_SYNC: return filp->f_op->unlocked_ioctl(filp, cmd, (unsigned long)compat_ptr(arg)); default: return -ENOIOCTLCMD; } }