Linux Headquarters
[ Register ]
[ About us ] [ Home Page ]

Advertisement
[ Kernel ] [ Documentation ] [ Links ] [ Books ]

Advertisement

Kernel v2.6.24 /kernel/posix-timers.c

Filename:/kernel/posix-timers.c
Lines Added:21
Lines Deleted:9
Also changed in: (Previous) 2.6.24-rc8  2.6.24-rc7  2.6.24-rc6  2.6.24-rc5  2.6.24-rc4  2.6.24-rc3 
(Following) 2.6.24-git14  2.6.24-git15  2.6.24-git16  2.6.24-git17  2.6.24-git18  2.6.24-git19 

Location
[  2.6.24
  [  kernel
     o  posix-timers.c

Patch

diff --git a/kernel/posix-timers.c b/kernel/posix-timers.c
index 7a15afb..35b4bbf 100644
--- a/kernel/posix-timers.c
+++ b/kernel/posix-timers.c
@@ -241,7 +241,8 @@ static __init int init_posix_timers(void)
    register_posix_clock(CLOCK_MONOTONIC, &clock_monotonic);
 
    posix_timers_cache = kmem_cache_create("posix_timers_cache",
-               sizeof (struct k_itimer), 0, 0, NULL);
+               sizeof (struct k_itimer), 0, SLAB_PANIC,
+               NULL);
    idr_init(&posix_timers_id);
    return 0;
 }
@@ -403,7 +404,7 @@ static struct task_struct * good_sigevent(sigevent_t * event)
 
    if ((event->sigev_notify & SIGEV_THREAD_ID ) &&
       (!(rtn = find_task_by_pid(event->sigev_notify_thread_id)) ||
-       rtn->tgid != current->tgid ||
+       !same_thread_group(rtn, current) ||
        (event->sigev_notify & ~SIGEV_THREAD_ID) != SIGEV_SIGNAL))
       return NULL;
 
@@ -607,7 +608,7 @@ static struct k_itimer * lock_timer(timer_t timer_id, unsigned long *flags)
       spin_lock(&timr->it_lock);
 
       if ((timr->it_id != timer_id) || !(timr->it_process) ||
-            timr->it_process->tgid != current->tgid) {
+            !same_thread_group(timr->it_process, current)) {
          spin_unlock(&timr->it_lock);
          spin_unlock_irqrestore(&idr_lock, *flags);
          timr = NULL;
@@ -712,7 +713,7 @@ sys_timer_getoverrun(timer_t timer_id)
 {
    struct k_itimer *timr;
    int overrun;
-   long flags;
+   unsigned long flags;
 
    timr = lock_timer(timer_id, &flags);
    if (!timr)
@@ -784,7 +785,7 @@ sys_timer_settime(timer_t timer_id, int flags,
    struct k_itimer *timr;
    struct itimerspec new_spec, old_spec;
    int error = 0;
-   long flag;
+   unsigned long flag;
    struct itimerspec *rtn = old_setting ? &old_spec : NULL;
 
    if (!new_setting)
@@ -836,7 +837,7 @@ asmlinkage long
 sys_timer_delete(timer_t timer_id)
 {
    struct k_itimer *timer;
-   long flags;
+   unsigned long flags;
 
 retry_delete:
    timer = lock_timer(timer_id, &flags);
@@ -980,9 +981,20 @@ sys_clock_getres(const clockid_t which_clock, struct timespec __user *tp)
 static int common_nsleep(const clockid_t which_clock, int flags,
           struct timespec *tsave, struct timespec __user *rmtp)
 {
-   return hrtimer_nanosleep(tsave, rmtp, flags & TIMER_ABSTIME ?
-             HRTIMER_MODE_ABS : HRTIMER_MODE_REL,
-             which_clock);
+   struct timespec rmt;
+   int ret;
+
+   ret = hrtimer_nanosleep(tsave, rmtp ? &rmt : NULL,
+            flags & TIMER_ABSTIME ?
+            HRTIMER_MODE_ABS : HRTIMER_MODE_REL,
+            which_clock);
+
+   if (ret && rmtp) {
+      if (copy_to_user(rmtp, &rmt, sizeof(*rmtp)))
+         return -EFAULT;
+   }
+
+   return ret;
 }
 
 asmlinkage long


Comments: webmaster (at) linuxhq.com.
Advertising: banners (at) linuxhq.com.
Compilation ©1998-2008 Linux Headquarters, Inc.