Commit a6dae6ac authored by Russell King's avatar Russell King

[ARM] ecard.c locking and wait_event_interruptible() fix

Add locking for use of kecardd services.
Use wait_event_interruptible() rather htan interruptible_sleep_on().
parent 2c612bdf
...@@ -224,7 +224,7 @@ static void ecard_do_request(struct ecard_request *req) ...@@ -224,7 +224,7 @@ static void ecard_do_request(struct ecard_request *req)
static pid_t ecard_pid; static pid_t ecard_pid;
static wait_queue_head_t ecard_wait; static wait_queue_head_t ecard_wait;
static struct ecard_request *ecard_req; static struct ecard_request *ecard_req;
static DECLARE_MUTEX(ecard_sem);
static DECLARE_COMPLETION(ecard_completion); static DECLARE_COMPLETION(ecard_completion);
/* /*
...@@ -282,8 +282,6 @@ static int ecard_init_mm(void) ...@@ -282,8 +282,6 @@ static int ecard_init_mm(void)
static int static int
ecard_task(void * unused) ecard_task(void * unused)
{ {
struct task_struct *tsk = current;
daemonize("kecardd"); daemonize("kecardd");
/* /*
...@@ -298,15 +296,10 @@ ecard_task(void * unused) ...@@ -298,15 +296,10 @@ ecard_task(void * unused)
while (1) { while (1) {
struct ecard_request *req; struct ecard_request *req;
do { wait_event_interruptible(ecard_wait, ecard_req != NULL);
req = xchg(&ecard_req, NULL);
if (req == NULL) {
sigemptyset(&tsk->pending.signal);
interruptible_sleep_on(&ecard_wait);
}
} while (req == NULL);
req = xchg(&ecard_req, NULL);
if (req != NULL)
ecard_do_request(req); ecard_do_request(req);
complete(&ecard_completion); complete(&ecard_completion);
} }
...@@ -330,6 +323,7 @@ ecard_call(struct ecard_request *req) ...@@ -330,6 +323,7 @@ ecard_call(struct ecard_request *req)
if (ecard_pid <= 0) if (ecard_pid <= 0)
ecard_pid = kernel_thread(ecard_task, NULL, CLONE_KERNEL); ecard_pid = kernel_thread(ecard_task, NULL, CLONE_KERNEL);
down(&ecard_sem);
ecard_req = req; ecard_req = req;
wake_up(&ecard_wait); wake_up(&ecard_wait);
...@@ -337,6 +331,7 @@ ecard_call(struct ecard_request *req) ...@@ -337,6 +331,7 @@ ecard_call(struct ecard_request *req)
* Now wait for kecardd to run. * Now wait for kecardd to run.
*/ */
wait_for_completion(&ecard_completion); wait_for_completion(&ecard_completion);
up(&ecard_sem);
} }
/* ======================= Mid-level card control ===================== */ /* ======================= Mid-level card control ===================== */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment