forked from luck/tmp_suning_uos_patched
ion: add compat_ioctl
Add a compat_ioctl to the ion driver Signed-off-by: Rom Lemarchand <romlem@google.com> [jstultz: modified patch to apply to staging directory] Signed-off-by: John Stultz <john.stultz@linaro.org> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
b88fa7319e
commit
827c849e37
@ -1,3 +1,6 @@
|
||||
obj-$(CONFIG_ION) += ion.o ion_heap.o ion_page_pool.o ion_system_heap.o \
|
||||
ion_carveout_heap.o ion_chunk_heap.o ion_cma_heap.o
|
||||
ifdef CONFIG_COMPAT
|
||||
obj-$(CONFIG_ION) += compat_ion.o
|
||||
endif
|
||||
obj-$(CONFIG_ION_TEGRA) += tegra/
|
||||
|
172
drivers/staging/android/ion/compat_ion.c
Normal file
172
drivers/staging/android/ion/compat_ion.c
Normal file
@ -0,0 +1,172 @@
|
||||
/*
|
||||
* drivers/staging/android/ion/compat_ion.c
|
||||
*
|
||||
* Copyright (C) 2013 Google, Inc.
|
||||
*
|
||||
* This software is licensed under the terms of the GNU General Public
|
||||
* License version 2, as published by the Free Software Foundation, and
|
||||
* may be copied, distributed, and modified under those terms.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <linux/compat.h>
|
||||
#include <linux/fs.h>
|
||||
#include <linux/uaccess.h>
|
||||
|
||||
#include "ion.h"
|
||||
#include "compat_ion.h"
|
||||
|
||||
/* See drivers/staging/android/ion/ion.h for the definition of these structs */
|
||||
struct compat_ion_allocation_data {
|
||||
compat_size_t len;
|
||||
compat_size_t align;
|
||||
compat_uint_t heap_id_mask;
|
||||
compat_uint_t flags;
|
||||
compat_int_t handle;
|
||||
};
|
||||
|
||||
struct compat_ion_custom_data {
|
||||
compat_uint_t cmd;
|
||||
compat_ulong_t arg;
|
||||
};
|
||||
|
||||
static int compat_get_ion_allocation_data(
|
||||
struct compat_ion_allocation_data __user *data32,
|
||||
struct ion_allocation_data __user *data)
|
||||
{
|
||||
compat_size_t s;
|
||||
compat_uint_t u;
|
||||
compat_int_t i;
|
||||
int err;
|
||||
|
||||
err = get_user(s, &data32->len);
|
||||
err |= put_user(s, &data->len);
|
||||
err |= get_user(s, &data32->align);
|
||||
err |= put_user(s, &data->align);
|
||||
err |= get_user(u, &data32->heap_id_mask);
|
||||
err |= put_user(u, &data->heap_id_mask);
|
||||
err |= get_user(u, &data32->flags);
|
||||
err |= put_user(u, &data->flags);
|
||||
err |= get_user(i, &data32->handle);
|
||||
err |= put_user(i, &data->handle);
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
static int compat_put_ion_allocation_data(
|
||||
struct compat_ion_allocation_data __user *data32,
|
||||
struct ion_allocation_data __user *data)
|
||||
{
|
||||
compat_size_t s;
|
||||
compat_uint_t u;
|
||||
compat_int_t i;
|
||||
int err;
|
||||
|
||||
err = get_user(s, &data->len);
|
||||
err |= put_user(s, &data32->len);
|
||||
err |= get_user(s, &data->align);
|
||||
err |= put_user(s, &data32->align);
|
||||
err |= get_user(u, &data->heap_id_mask);
|
||||
err |= put_user(u, &data32->heap_id_mask);
|
||||
err |= get_user(u, &data->flags);
|
||||
err |= put_user(u, &data32->flags);
|
||||
err |= get_user(i, &data->handle);
|
||||
err |= put_user(i, &data32->handle);
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
static int compat_get_ion_custom_data(
|
||||
struct compat_ion_custom_data __user *data32,
|
||||
struct ion_custom_data __user *data)
|
||||
{
|
||||
compat_uint_t cmd;
|
||||
compat_ulong_t arg;
|
||||
int err;
|
||||
|
||||
err = get_user(cmd, &data32->cmd);
|
||||
err |= put_user(cmd, &data->cmd);
|
||||
err |= get_user(arg, &data32->arg);
|
||||
err |= put_user(arg, &data->arg);
|
||||
|
||||
return err;
|
||||
};
|
||||
|
||||
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 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, cmd,
|
||||
(unsigned long)data);
|
||||
err = compat_put_ion_allocation_data(data32, data);
|
||||
return ret ? ret : err;
|
||||
}
|
||||
case ION_IOC_FREE:
|
||||
{
|
||||
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;
|
||||
|
||||
return filp->f_op->unlocked_ioctl(filp, cmd,
|
||||
(unsigned long)data);
|
||||
}
|
||||
case 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, cmd,
|
||||
(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;
|
||||
}
|
||||
}
|
30
drivers/staging/android/ion/compat_ion.h
Normal file
30
drivers/staging/android/ion/compat_ion.h
Normal file
@ -0,0 +1,30 @@
|
||||
/*
|
||||
|
||||
* drivers/staging/android/ion/compat_ion.h
|
||||
*
|
||||
* Copyright (C) 2013 Google, Inc.
|
||||
*
|
||||
* This software is licensed under the terms of the GNU General Public
|
||||
* License version 2, as published by the Free Software Foundation, and
|
||||
* may be copied, distributed, and modified under those terms.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef _LINUX_COMPAT_ION_H
|
||||
#define _LINUX_COMPAT_ION_H
|
||||
|
||||
#if IS_ENABLED(CONFIG_COMPAT)
|
||||
|
||||
long compat_ion_ioctl(struct file *filp, unsigned int cmd, unsigned long arg);
|
||||
|
||||
#else
|
||||
|
||||
#define compat_ion_ioctl NULL
|
||||
|
||||
#endif /* CONFIG_COMPAT */
|
||||
#endif /* _LINUX_COMPAT_ION_H */
|
@ -38,6 +38,7 @@
|
||||
|
||||
#include "ion.h"
|
||||
#include "ion_priv.h"
|
||||
#include "compat_ion.h"
|
||||
|
||||
/**
|
||||
* struct ion_device - the metadata of the ion device node
|
||||
@ -1256,6 +1257,7 @@ static const struct file_operations ion_fops = {
|
||||
.open = ion_open,
|
||||
.release = ion_release,
|
||||
.unlocked_ioctl = ion_ioctl,
|
||||
.compat_ioctl = compat_ion_ioctl,
|
||||
};
|
||||
|
||||
static size_t ion_debug_heap_total(struct ion_client *client,
|
||||
|
Loading…
Reference in New Issue
Block a user