From: Andrei Vagin <ava...@gmail.com>

Wire timer_settime() syscall into time namespace virtualization.

Signed-off-by: Andrei Vagin <ava...@openvz.org>
Signed-off-by: Dmitry Safonov <d...@arista.com>
---
 kernel/time/posix-timers.c | 13 +++++++++----
 1 file changed, 9 insertions(+), 4 deletions(-)

diff --git a/kernel/time/posix-timers.c b/kernel/time/posix-timers.c
index 782708054df2..d008dfd5b081 100644
--- a/kernel/time/posix-timers.c
+++ b/kernel/time/posix-timers.c
@@ -854,10 +854,6 @@ static int do_timer_settime(timer_t timer_id, int flags,
        unsigned long flag;
        int error = 0;
 
-       if (!timespec64_valid(&new_spec64->it_interval) ||
-           !timespec64_valid(&new_spec64->it_value))
-               return -EINVAL;
-
        if (old_spec64)
                memset(old_spec64, 0, sizeof(*old_spec64));
 retry:
@@ -865,6 +861,15 @@ static int do_timer_settime(timer_t timer_id, int flags,
        if (!timr)
                return -EINVAL;
 
+       if (flags & TIMER_ABSTIME)
+               timens_clock_to_host(timr->it_clock, &new_spec64->it_value);
+
+       if (!timespec64_valid(&new_spec64->it_interval) ||
+           !timespec64_valid(&new_spec64->it_value)) {
+               unlock_timer(timr, flag);
+               return -EINVAL;
+       }
+
        kc = timr->kclock;
        if (WARN_ON_ONCE(!kc || !kc->timer_set))
                error = -EINVAL;
-- 
2.20.1

Reply via email to