qseecom: Return already registered status
When a request to register a previously registered
listener is received return status indicating it was
already registered.
Change-Id: I2507396bf7bd114254e31547b54096cb0fad7aad
Signed-off-by: Mona Hossain <mhossain@codeaurora.org>
diff --git a/drivers/misc/qseecom.c b/drivers/misc/qseecom.c
index e4c3152..a8f9f35 100644
--- a/drivers/misc/qseecom.c
+++ b/drivers/misc/qseecom.c
@@ -199,7 +199,7 @@
};
static int __qseecom_is_svc_unique(struct qseecom_dev_handle *data,
- struct qseecom_register_listener_req svc)
+ struct qseecom_register_listener_req *svc)
{
struct qseecom_registered_listener_list *ptr;
int unique = 1;
@@ -207,7 +207,7 @@
spin_lock_irqsave(&qseecom.registered_listener_list_lock, flags);
list_for_each_entry(ptr, &qseecom.registered_listener_list_head, list) {
- if (ptr->svc.listener_id == svc.listener_id) {
+ if (ptr->svc.listener_id == svc->listener_id) {
pr_err("Service id: %u is already registered\n",
ptr->svc.listener_id);
unique = 0;
@@ -333,16 +333,12 @@
pr_err("copy_from_user failed\n");
return ret;
}
-
- if (!__qseecom_is_svc_unique(data, rcvd_lstnr)) {
+ data->listener.id = 0;
+ data->service = true;
+ if (!__qseecom_is_svc_unique(data, &rcvd_lstnr)) {
pr_err("Service is not unique and is already registered\n");
- return ret;
- }
-
- ret = copy_to_user(argp, &rcvd_lstnr, sizeof(rcvd_lstnr));
- if (ret) {
- pr_err("copy_to_user failed\n");
- return ret;
+ data->released = true;
+ return -EBUSY;
}
new_entry = kmalloc(sizeof(*new_entry), GFP_KERNEL);
@@ -360,13 +356,14 @@
kzfree(new_entry);
return -ENOMEM;
}
+
data->listener.id = rcvd_lstnr.listener_id;
- data->service = true;
init_waitqueue_head(&new_entry->rcv_req_wq);
spin_lock_irqsave(&qseecom.registered_listener_list_lock, flags);
list_add_tail(&new_entry->list, &qseecom.registered_listener_list_head);
spin_unlock_irqrestore(&qseecom.registered_listener_list_lock, flags);
+
return ret;
}
@@ -743,6 +740,7 @@
break;
} else {
ptr_app->ref_cnt--;
+ data->released = true;
break;
}
}