diff options
Diffstat (limited to 'kernel/futex_compat.c')
| -rw-r--r-- | kernel/futex_compat.c | 22 | 
1 files changed, 11 insertions, 11 deletions
diff --git a/kernel/futex_compat.c b/kernel/futex_compat.c index 50f24eea6cd..338a9b489fb 100644 --- a/kernel/futex_compat.c +++ b/kernel/futex_compat.c @@ -141,24 +141,24 @@ asmlinkage long compat_sys_futex(u32 __user *uaddr, int op, u32 val,  		struct compat_timespec __user *utime, u32 __user *uaddr2,  		u32 val3)  { -	struct timespec t; -	unsigned long timeout = MAX_SCHEDULE_TIMEOUT; +	struct timespec ts; +	ktime_t t, *tp = NULL;  	int val2 = 0;  	if (utime && (op == FUTEX_WAIT || op == FUTEX_LOCK_PI)) { -		if (get_compat_timespec(&t, utime)) +		if (get_compat_timespec(&ts, utime))  			return -EFAULT; -		if (!timespec_valid(&t)) +		if (!timespec_valid(&ts))  			return -EINVAL; + +		t = timespec_to_ktime(ts);  		if (op == FUTEX_WAIT) -			timeout = timespec_to_jiffies(&t) + 1; -		else { -			timeout = t.tv_sec; -			val2 = t.tv_nsec; -		} +			t = ktime_add(ktime_get(), t); +		tp = &t;  	} -	if (op == FUTEX_REQUEUE || op == FUTEX_CMP_REQUEUE) +	if (op == FUTEX_REQUEUE || op == FUTEX_CMP_REQUEUE +	    || op == FUTEX_CMP_REQUEUE_PI)  		val2 = (int) (unsigned long) utime; -	return do_futex(uaddr, op, val, timeout, uaddr2, val2, val3); +	return do_futex(uaddr, op, val, tp, uaddr2, val2, val3);  }  | 
