/* Precise sleep: */
 extern long hrtimer_nanosleep(struct timespec64 *rqtp,
-                             struct timespec __user *rmtp,
                              const enum hrtimer_mode mode,
                              const clockid_t clockid);
 extern long hrtimer_nanosleep_restart(struct restart_block *restart_block);
 
 
        oldfs = get_fs();
        set_fs(KERNEL_DS);
-       ret = hrtimer_nanosleep(&tu64,
-                               rmtp ? (struct timespec __user *)&rmt : NULL,
-                               HRTIMER_MODE_REL, CLOCK_MONOTONIC);
+       current->restart_block.nanosleep.rmtp =
+                               rmtp ? (struct timespec __user *)&rmt : NULL;
+       ret = hrtimer_nanosleep(&tu64, HRTIMER_MODE_REL, CLOCK_MONOTONIC);
        set_fs(oldfs);
 
        /*
 
        return ret;
 }
 
-long hrtimer_nanosleep(struct timespec64 *rqtp, struct timespec __user *rmtp,
+long hrtimer_nanosleep(struct timespec64 *rqtp,
                       const enum hrtimer_mode mode, const clockid_t clockid)
 {
-       struct restart_block *restart;
+       struct restart_block *restart = ¤t->restart_block;
+       struct timespec __user *rmtp;
        struct hrtimer_sleeper t;
        int ret = 0;
        u64 slack;
                goto out;
        }
 
+       rmtp = restart->nanosleep.rmtp;
        if (rmtp) {
                ret = update_rmtp(&t.timer, rmtp);
                if (ret <= 0)
                        goto out;
        }
 
-       restart = ¤t->restart_block;
        restart->fn = hrtimer_nanosleep_restart;
        restart->nanosleep.clockid = t.timer.base->clockid;
-       restart->nanosleep.rmtp = rmtp;
        restart->nanosleep.expires = hrtimer_get_expires_tv64(&t.timer);
 
        ret = -ERESTART_RESTARTBLOCK;
        if (!timespec64_valid(&tu64))
                return -EINVAL;
 
-       return hrtimer_nanosleep(&tu64, rmtp, HRTIMER_MODE_REL, CLOCK_MONOTONIC);
+       current->restart_block.nanosleep.rmtp = rmtp;
+       return hrtimer_nanosleep(&tu64, HRTIMER_MODE_REL, CLOCK_MONOTONIC);
 }
 
 /*
 
                t64 = timespec_to_timespec64(t);
                if (!timespec64_valid(&t64))
                        return -EINVAL;
-               return hrtimer_nanosleep(&t64, rmtp, flags & TIMER_ABSTIME ?
+               if (flags & TIMER_ABSTIME)
+                       rmtp = NULL;
+               current->restart_block.nanosleep.rmtp = rmtp;
+               return hrtimer_nanosleep(&t64, flags & TIMER_ABSTIME ?
                                         HRTIMER_MODE_ABS : HRTIMER_MODE_REL,
                                         which_clock);
        default:
 
 static int common_nsleep(const clockid_t which_clock, int flags,
                         struct timespec64 *tsave, struct timespec __user *rmtp)
 {
-       return hrtimer_nanosleep(tsave, rmtp, flags & TIMER_ABSTIME ?
+       if (flags & TIMER_ABSTIME)
+               rmtp = NULL;
+       current->restart_block.nanosleep.rmtp = rmtp;
+       return hrtimer_nanosleep(tsave, flags & TIMER_ABSTIME ?
                                 HRTIMER_MODE_ABS : HRTIMER_MODE_REL,
                                 which_clock);
 }