Pull fluff into release branch
[sfrench/cifs-2.6.git] / kernel / itimer.c
index 680e6b70c8726f00d6a5d4dc3888fa5218b498fe..307c6a632ef6baa7ff0cec46273293d4cc84afc6 100644 (file)
@@ -128,18 +128,13 @@ asmlinkage long sys_getitimer(int which, struct itimerval __user *value)
 /*
  * The timer is automagically restarted, when interval != 0
  */
-int it_real_fn(void *data)
+enum hrtimer_restart it_real_fn(struct hrtimer *timer)
 {
-       struct task_struct *tsk = (struct task_struct *) data;
+       struct signal_struct *sig =
+           container_of(timer, struct signal_struct, real_timer);
 
-       send_group_sig_info(SIGALRM, SEND_SIG_PRIV, tsk);
+       send_group_sig_info(SIGALRM, SEND_SIG_PRIV, sig->tsk);
 
-       if (tsk->signal->it_real_incr.tv64 != 0) {
-               hrtimer_forward(&tsk->signal->real_timer,
-                              tsk->signal->it_real_incr);
-
-               return HRTIMER_RESTART;
-       }
        return HRTIMER_NORESTART;
 }
 
@@ -231,11 +226,14 @@ again:
                        spin_unlock_irq(&tsk->sighand->siglock);
                        goto again;
                }
-               tsk->signal->it_real_incr =
-                       timeval_to_ktime(value->it_interval);
                expires = timeval_to_ktime(value->it_value);
-               if (expires.tv64 != 0)
-                       hrtimer_start(timer, expires, HRTIMER_REL);
+               if (expires.tv64 != 0) {
+                       tsk->signal->it_real_incr =
+                               timeval_to_ktime(value->it_interval);
+                       hrtimer_start(timer, expires, HRTIMER_MODE_REL);
+               } else
+                       tsk->signal->it_real_incr.tv64 = 0;
+
                spin_unlock_irq(&tsk->sighand->siglock);
                break;
        case ITIMER_VIRTUAL: