diff options
author | Oleg Nesterov <oleg@tv-sign.ru> | 2008-09-22 17:42:51 -0400 |
---|---|---|
committer | Thomas Gleixner <tglx@linutronix.de> | 2008-09-24 09:45:48 -0400 |
commit | 5a51b713ccf8835d5adf7217e2f86eb12b1ca851 (patch) | |
tree | b5c67c0252bcbd5d8df9b10e9fd306d79e53e8b1 | |
parent | 5a9fa73072854981a5c05eb7ba18a96d49c2804f (diff) |
posix-timers: lock_timer: kill the bogus ->it_id check
lock_timer() checks that the timer found by idr_find(timer_id) has ->it_id
== timer_id. This buys nothing. This check can fail only if
sys_timer_create() unlocked idr_lock after idr_get_new(), but didn't set
->it_id = new_timer_id yet. But in that case ->it_process == NULL so
lock_timer() can't succeed anyway.
Also remove a couple of unneeded typecasts.
Note that with or without this patch we have a small problem.
sys_timer_create() doesn't ensure that the result of setting (say)
->it_sigev_notify must be visible if lock_timer() succeeds.
Signed-off-by: Oleg Nesterov <oleg@tv-sign.ru>
Cc: mingo@elte.hu
Cc: Roland McGrath <roland@redhat.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
-rw-r--r-- | kernel/posix-timers.c | 9 |
1 files changed, 4 insertions, 5 deletions
diff --git a/kernel/posix-timers.c b/kernel/posix-timers.c index 3eff47b0d8d5..7185f05d53a9 100644 --- a/kernel/posix-timers.c +++ b/kernel/posix-timers.c | |||
@@ -474,8 +474,7 @@ sys_timer_create(const clockid_t which_clock, | |||
474 | goto out; | 474 | goto out; |
475 | } | 475 | } |
476 | spin_lock_irq(&idr_lock); | 476 | spin_lock_irq(&idr_lock); |
477 | error = idr_get_new(&posix_timers_id, (void *) new_timer, | 477 | error = idr_get_new(&posix_timers_id, new_timer, &new_timer_id); |
478 | &new_timer_id); | ||
479 | spin_unlock_irq(&idr_lock); | 478 | spin_unlock_irq(&idr_lock); |
480 | if (error) { | 479 | if (error) { |
481 | if (error == -EAGAIN) | 480 | if (error == -EAGAIN) |
@@ -567,12 +566,12 @@ static struct k_itimer * lock_timer(timer_t timer_id, unsigned long *flags) | |||
567 | */ | 566 | */ |
568 | 567 | ||
569 | spin_lock_irqsave(&idr_lock, *flags); | 568 | spin_lock_irqsave(&idr_lock, *flags); |
570 | timr = (struct k_itimer *) idr_find(&posix_timers_id, (int) timer_id); | 569 | timr = idr_find(&posix_timers_id, (int) timer_id); |
571 | if (timr) { | 570 | if (timr) { |
572 | spin_lock(&timr->it_lock); | 571 | spin_lock(&timr->it_lock); |
573 | 572 | ||
574 | if ((timr->it_id != timer_id) || !(timr->it_process) || | 573 | if (!timr->it_process || |
575 | !same_thread_group(timr->it_process, current)) { | 574 | !same_thread_group(timr->it_process, current)) { |
576 | spin_unlock(&timr->it_lock); | 575 | spin_unlock(&timr->it_lock); |
577 | spin_unlock_irqrestore(&idr_lock, *flags); | 576 | spin_unlock_irqrestore(&idr_lock, *flags); |
578 | timr = NULL; | 577 | timr = NULL; |