diff options
author | John M. Calandrino <jmc@jupiter-cs.cs.unc.edu> | 2007-04-19 15:42:41 -0400 |
---|---|---|
committer | John M. Calandrino <jmc@jupiter-cs.cs.unc.edu> | 2007-04-19 15:42:41 -0400 |
commit | 9d490044d8cba5ee31e6795d0cb029c107db1ebf (patch) | |
tree | e8d99c61182c6c36cb4c258e3393c91086d09d83 /arch | |
parent | 1263c9776c7eed5b8654e68eb847e7459f7ad240 (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.c | 23 |
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. */ |
20 | void __init pi_sema_boot_init(void) | 20 | void __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. */ |
31 | asmlinkage long sys_pi_sema_init (pi_sema_id *sem_id) | 31 | asmlinkage 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; |