aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorIliyan Malchev <malchev@google.com>2011-08-02 16:59:26 -0700
committerIliyan Malchev <malchev@google.com>2011-08-02 19:24:56 -0700
commit93ea5148c66669e0eca5ae72681c3630da5a6f14 (patch)
tree5f8cc3feb36cd5ca2a08d4b90abb209e1946880f
parent55981a570ae9d4073a98a4d5df92320caeedcf90 (diff)
downloadkernel_samsung_tuna-93ea5148c66669e0eca5ae72681c3630da5a6f14.zip
kernel_samsung_tuna-93ea5148c66669e0eca5ae72681c3630da5a6f14.tar.gz
kernel_samsung_tuna-93ea5148c66669e0eca5ae72681c3630da5a6f14.tar.bz2
rpmsg: clean up error codes
Do not return -EFAULT to user space for non copy_to/from_user errors. Signed-off-by: Iliyan Malchev <malchev@google.com>
-rw-r--r--drivers/rpmsg/rpmsg_omx.c45
-rw-r--r--drivers/rpmsg/rpmsg_resmgr.c6
2 files changed, 36 insertions, 15 deletions
diff --git a/drivers/rpmsg/rpmsg_omx.c b/drivers/rpmsg/rpmsg_omx.c
index 6315e50..4d71dc3 100644
--- a/drivers/rpmsg/rpmsg_omx.c
+++ b/drivers/rpmsg/rpmsg_omx.c
@@ -133,7 +133,7 @@ static u32 _rpmsg_omx_buffer_lookup(struct rpmsg_omx_instance *omx, long buffer)
static int _rpmsg_omx_map_buf(struct rpmsg_omx_instance *omx, char *packet)
{
- int ret = -1, offset = 0;
+ int ret = -EINVAL, offset = 0;
long *buffer;
char *data;
enum rpc_omx_map_info_type maptype;
@@ -163,7 +163,7 @@ static int _rpmsg_omx_map_buf(struct rpmsg_omx_instance *omx, char *packet)
if (!ret && (maptype >= RPC_OMX_MAP_INFO_TWO_BUF)) {
buffer = (long *)((int)data + offset + sizeof(*buffer));
if (*buffer != 0) {
- ret = -1;
+ ret = -EIO;
pa = _rpmsg_omx_buffer_lookup(omx, *buffer);
if (pa) {
@@ -176,7 +176,7 @@ static int _rpmsg_omx_map_buf(struct rpmsg_omx_instance *omx, char *packet)
if (!ret && maptype >= RPC_OMX_MAP_INFO_THREE_BUF) {
buffer = (long *)((int)data + offset + 2*sizeof(*buffer));
if (*buffer != 0) {
- ret = -1;
+ ret = -EIO;
pa = _rpmsg_omx_buffer_lookup(omx, *buffer);
if (pa) {
*buffer = pa;
@@ -310,7 +310,9 @@ long rpmsg_omx_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
case OMX_IOCCONNECT:
ret = copy_from_user(buf, (char __user *) arg, sizeof(buf));
if (ret) {
- dev_err(omxserv->dev, "copy_from_user fail: %d\n", ret);
+ dev_err(omxserv->dev,
+ "%s: %d: copy_from_user fail: %d\n", __func__,
+ _IOC_NR(cmd), ret);
ret = -EFAULT;
break;
}
@@ -322,23 +324,39 @@ long rpmsg_omx_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
case OMX_IOCIONREGISTER:
{
struct ion_fd_data data;
- if (copy_from_user(&data, (char __user *) arg, sizeof(data)))
+ if (copy_from_user(&data, (char __user *) arg, sizeof(data))) {
+ dev_err(omxserv->dev,
+ "%s: %d: copy_from_user fail: %d\n", __func__,
+ _IOC_NR(cmd), ret);
return -EFAULT;
+ }
data.handle = ion_import_fd(omx->ion_client, data.fd);
if (IS_ERR(data.handle))
data.handle = NULL;
- if (copy_to_user(&data, (char __user *) arg, sizeof(data)))
+ if (copy_to_user(&data, (char __user *) arg, sizeof(data))) {
+ dev_err(omxserv->dev,
+ "%s: %d: copy_to_user fail: %d\n", __func__,
+ _IOC_NR(cmd), ret);
return -EFAULT;
+ }
break;
}
case OMX_IOCIONUNREGISTER:
{
struct ion_fd_data data;
- if (copy_from_user(&data, (char __user *) arg, sizeof(data)))
+ if (copy_from_user(&data, (char __user *) arg, sizeof(data))) {
+ dev_err(omxserv->dev,
+ "%s: %d: copy_from_user fail: %d\n", __func__,
+ _IOC_NR(cmd), ret);
return -EFAULT;
+ }
ion_free(omx->ion_client, data.handle);
- if (copy_to_user(&data, (char __user *) arg, sizeof(data)))
+ if (copy_to_user(&data, (char __user *) arg, sizeof(data))) {
+ dev_err(omxserv->dev,
+ "%s: %d: copy_to_user fail: %d\n", __func__,
+ _IOC_NR(cmd), ret);
return -EFAULT;
+ }
break;
}
#endif
@@ -458,15 +476,17 @@ static ssize_t rpmsg_omx_read(struct file *filp, char __user *buf,
skb = skb_dequeue(&omx->queue);
if (!skb) {
dev_err(omx->omxserv->dev, "err is rmpsg_omx racy ?\n");
- return -EFAULT;
+ return -EIO;
}
mutex_unlock(&omx->lock);
use = min(len, skb->len);
- if (copy_to_user(buf, skb->data, use))
+ if (copy_to_user(buf, skb->data, use)) {
+ dev_err(omx->omxserv->dev, "%s: copy_to_user fail\n", __func__);
use = -EFAULT;
+ }
kfree_skb(skb);
return use;
@@ -497,8 +517,9 @@ static ssize_t rpmsg_omx_write(struct file *filp, const char __user *ubuf,
if (copy_from_user(hdr->data, ubuf, use))
return -EMSGSIZE;
- if (_rpmsg_omx_map_buf(omx, hdr->data))
- return -EFAULT;
+ ret = _rpmsg_omx_map_buf(omx, hdr->data);
+ if (ret < 0)
+ return ret;
hdr->type = OMX_RAW_MSG;
hdr->flags = 0;
diff --git a/drivers/rpmsg/rpmsg_resmgr.c b/drivers/rpmsg/rpmsg_resmgr.c
index b9a23c3..d785e89 100644
--- a/drivers/rpmsg/rpmsg_resmgr.c
+++ b/drivers/rpmsg/rpmsg_resmgr.c
@@ -187,7 +187,7 @@ static int rprm_auxclk_request(struct rprm_elem *e, struct rprm_auxclk *obj)
acd->aux_clk = clk_get(NULL, clk_name);
if (!acd->aux_clk) {
pr_err("%s: unable to get clock %s\n", __func__, clk_name);
- ret = -EFAULT;
+ ret = -EIO;
goto error;
}
@@ -198,7 +198,7 @@ static int rprm_auxclk_request(struct rprm_elem *e, struct rprm_auxclk *obj)
acd->src = clk_get(NULL, src_clk_name);
if (!acd->src) {
pr_err("%s: unable to get clock %s\n", __func__, src_clk_name);
- ret = -EFAULT;
+ ret = -EIO;
goto error_aux;
}
@@ -206,7 +206,7 @@ static int rprm_auxclk_request(struct rprm_elem *e, struct rprm_auxclk *obj)
if (!src_parent) {
pr_err("%s: unable to get parent clock %s\n", __func__,
clk_src_name[obj->parent_src_clk]);
- ret = -EFAULT;
+ ret = -EIO;
goto error_aux_src;
}