[hrtimer] Enforce resolution as lower limit of intervals
[deliverable/linux.git] / kernel / compat.c
index ddfcaaa86623a0c02b68bc93a62c3d54bbe51762..256e5d9f06470480283a04cfc8f5f15e8113b30a 100644 (file)
@@ -48,8 +48,7 @@ static long compat_nanosleep_restart(struct restart_block *restart)
        if (!time_after(expire, now))
                return 0;
 
-       current->state = TASK_INTERRUPTIBLE;
-       expire = schedule_timeout(expire - now);
+       expire = schedule_timeout_interruptible(expire - now);
        if (expire == 0)
                return 0;
 
@@ -82,8 +81,7 @@ asmlinkage long compat_sys_nanosleep(struct compat_timespec __user *rqtp,
                return -EINVAL;
 
        expire = timespec_to_jiffies(&t) + (t.tv_sec || t.tv_nsec);
-       current->state = TASK_INTERRUPTIBLE;
-       expire = schedule_timeout(expire);
+       expire = schedule_timeout_interruptible(expire);
        if (expire == 0)
                return 0;
 
@@ -516,6 +514,24 @@ static int put_compat_itimerspec(struct compat_itimerspec __user *dst,
        return 0;
 } 
 
+long compat_sys_timer_create(clockid_t which_clock,
+                       struct compat_sigevent __user *timer_event_spec,
+                       timer_t __user *created_timer_id)
+{
+       struct sigevent __user *event = NULL;
+
+       if (timer_event_spec) {
+               struct sigevent kevent;
+
+               event = compat_alloc_user_space(sizeof(*event));
+               if (get_compat_sigevent(&kevent, timer_event_spec) ||
+                   copy_to_user(event, &kevent, sizeof(*event)))
+                       return -EFAULT;
+       }
+
+       return sys_timer_create(which_clock, event, created_timer_id);
+}
+
 long compat_sys_timer_settime(timer_t timer_id, int flags,
                          struct compat_itimerspec __user *new, 
                          struct compat_itimerspec __user *old)
@@ -651,8 +667,6 @@ int get_compat_sigevent(struct sigevent *event,
                ? -EFAULT : 0;
 }
 
-/* timer_create is architecture specific because it needs sigevent conversion */
-
 long compat_get_bitmap(unsigned long *mask, compat_ulong_t __user *umask,
                       unsigned long bitmap_size)
 {
@@ -795,8 +809,7 @@ compat_sys_rt_sigtimedwait (compat_sigset_t __user *uthese,
                        recalc_sigpending();
                        spin_unlock_irq(&current->sighand->siglock);
 
-                       current->state = TASK_INTERRUPTIBLE;
-                       timeout = schedule_timeout(timeout);
+                       timeout = schedule_timeout_interruptible(timeout);
 
                        spin_lock_irq(&current->sighand->siglock);
                        sig = dequeue_signal(current, &s, &info);
This page took 0.031649 seconds and 5 git commands to generate.