[PATCH] genirq: cleanup: turn ARCH_HAS_IRQ_PER_CPU into CONFIG_IRQ_PER_CPU
[firefly-linux-kernel-4.4.55.git] / kernel / futex_compat.c
index 9c077cf9aa84b81c0da8d87450b6fb491b3a231f..d1d92b441fb7d7a327f229def2db99d4359063ee 100644 (file)
@@ -129,12 +129,19 @@ asmlinkage long compat_sys_futex(u32 __user *uaddr, int op, u32 val,
        unsigned long timeout = MAX_SCHEDULE_TIMEOUT;
        int val2 = 0;
 
-       if ((op == FUTEX_WAIT) && utime) {
+       if (utime && (op == FUTEX_WAIT || op == FUTEX_LOCK_PI)) {
                if (get_compat_timespec(&t, utime))
                        return -EFAULT;
-               timeout = timespec_to_jiffies(&t) + 1;
+               if (!timespec_valid(&t))
+                       return -EINVAL;
+               if (op == FUTEX_WAIT)
+                       timeout = timespec_to_jiffies(&t) + 1;
+               else {
+                       timeout = t.tv_sec;
+                       val2 = t.tv_nsec;
+               }
        }
-       if (op >= FUTEX_REQUEUE)
+       if (op == FUTEX_REQUEUE || op == FUTEX_CMP_REQUEUE)
                val2 = (int) (unsigned long) utime;
 
        return do_futex(uaddr, op, val, timeout, uaddr2, val2, val3);