aboutsummaryrefslogtreecommitdiffstats
path: root/arch
diff options
context:
space:
mode:
authorJohn M. Calandrino <jmc@jupiter-cs.cs.unc.edu>2007-04-19 15:42:41 -0400
committerJohn M. Calandrino <jmc@jupiter-cs.cs.unc.edu>2007-04-19 15:42:41 -0400
commit9d490044d8cba5ee31e6795d0cb029c107db1ebf (patch)
treee8d99c61182c6c36cb4c258e3393c91086d09d83 /arch
parent1263c9776c7eed5b8654e68eb847e7459f7ad240 (diff)
Another small fix to system call sys_pi_sema_init, in order to eliminate
another pointer issue.
Diffstat (limited to 'arch')
-rw-r--r--arch/i386/kernel/pi_sem_syscalls.c23
1 files changed, 13 insertions, 10 deletions
diff --git a/arch/i386/kernel/pi_sem_syscalls.c b/arch/i386/kernel/pi_sem_syscalls.c
index 5f474d2779..bf79896654 100644
--- a/arch/i386/kernel/pi_sem_syscalls.c
+++ b/arch/i386/kernel/pi_sem_syscalls.c
@@ -19,7 +19,7 @@ typedef int pi_sema_id; /* Userspace ID of a pi_semaphore */
19/* Initialize PI semaphores at boot time. */ 19/* Initialize PI semaphores at boot time. */
20void __init pi_sema_boot_init(void) 20void __init pi_sema_boot_init(void)
21{ 21{
22 int sem_id; 22 pi_sema_id sem_id;
23 23
24 printk("Initializing PI semaphores..."); 24 printk("Initializing PI semaphores...");
25 for (sem_id = 0; sem_id < MAX_PI_SEMAPHORES; sem_id++) 25 for (sem_id = 0; sem_id < MAX_PI_SEMAPHORES; sem_id++)
@@ -28,15 +28,17 @@ void __init pi_sema_boot_init(void)
28} 28}
29 29
30/* Find a free semaphore and assign to sem. */ 30/* Find a free semaphore and assign to sem. */
31asmlinkage long sys_pi_sema_init (pi_sema_id *sem_id) 31asmlinkage long sys_pi_sema_init (void)
32{ 32{
33 for (*sem_id = 0; *sem_id < MAX_PI_SEMAPHORES; (*sem_id)++) { 33 pi_sema_id sem_id;
34 if (!cmpxchg(&pi_sems[*sem_id].used, 0, 1)) { 34
35 atomic_set(&pi_sems[*sem_id].count, 1); 35 for (sem_id = 0; sem_id < MAX_PI_SEMAPHORES; sem_id++) {
36 pi_sems[*sem_id].sleepers = 0; 36 if (!cmpxchg(&pi_sems[sem_id].used, 0, 1)) {
37 init_waitqueue_head(&pi_sems[*sem_id].wait); 37 atomic_set(&pi_sems[sem_id].count, 1);
38 pi_sems[*sem_id].sem_prio = LOWEST_SEM_PRIO; 38 pi_sems[sem_id].sleepers = 0;
39 return 0; 39 init_waitqueue_head(&pi_sems[sem_id].wait);
40 pi_sems[sem_id].sem_prio = LOWEST_SEM_PRIO;
41 return sem_id;
40 } 42 }
41 } 43 }
42 return -ENOMEM; 44 return -ENOMEM;
@@ -111,7 +113,8 @@ asmlinkage long sys_pi_sema_free(pi_sema_id sem_id)
111 list_for_each_safe(tmp, next, &pi_sems[sem_id].wait.task_list) { 113 list_for_each_safe(tmp, next, &pi_sems[sem_id].wait.task_list) {
112 wait_queue_t *curr = list_entry(tmp, wait_queue_t, task_list); 114 wait_queue_t *curr = list_entry(tmp, wait_queue_t, task_list);
113 list_del(tmp); 115 list_del(tmp);
114 curr->func(curr, TASK_UNINTERRUPTIBLE | TASK_INTERRUPTIBLE, 0, NULL); 116 curr->func(curr, TASK_UNINTERRUPTIBLE | TASK_INTERRUPTIBLE,
117 0, NULL);
115 } 118 }
116 spin_unlock_irqrestore(&pi_sems[sem_id].wait.lock, flags); 119 spin_unlock_irqrestore(&pi_sems[sem_id].wait.lock, flags);
117 pi_sems[sem_id].used = 0; 120 pi_sems[sem_id].used = 0;