diff options
Diffstat (limited to 'kernel/futex.c')
| -rw-r--r-- | kernel/futex.c | 51 | 
1 files changed, 23 insertions, 28 deletions
| diff --git a/kernel/futex.c b/kernel/futex.c index 1614be20173d..72efa1e4359a 100644 --- a/kernel/futex.c +++ b/kernel/futex.c @@ -2628,7 +2628,7 @@ void exit_robust_list(struct task_struct *curr)  long do_futex(u32 __user *uaddr, int op, u32 val, ktime_t *timeout,  		u32 __user *uaddr2, u32 val2, u32 val3)  { -	int ret = -ENOSYS, cmd = op & FUTEX_CMD_MASK; +	int cmd = op & FUTEX_CMD_MASK;  	unsigned int flags = 0;  	if (!(op & FUTEX_PRIVATE_FLAG)) @@ -2641,49 +2641,44 @@ long do_futex(u32 __user *uaddr, int op, u32 val, ktime_t *timeout,  	}  	switch (cmd) { +	case FUTEX_LOCK_PI: +	case FUTEX_UNLOCK_PI: +	case FUTEX_TRYLOCK_PI: +	case FUTEX_WAIT_REQUEUE_PI: +	case FUTEX_CMP_REQUEUE_PI: +		if (!futex_cmpxchg_enabled) +			return -ENOSYS; +	} + +	switch (cmd) {  	case FUTEX_WAIT:  		val3 = FUTEX_BITSET_MATCH_ANY;  	case FUTEX_WAIT_BITSET: -		ret = futex_wait(uaddr, flags, val, timeout, val3); -		break; +		return futex_wait(uaddr, flags, val, timeout, val3);  	case FUTEX_WAKE:  		val3 = FUTEX_BITSET_MATCH_ANY;  	case FUTEX_WAKE_BITSET: -		ret = futex_wake(uaddr, flags, val, val3); -		break; +		return futex_wake(uaddr, flags, val, val3);  	case FUTEX_REQUEUE: -		ret = futex_requeue(uaddr, flags, uaddr2, val, val2, NULL, 0); -		break; +		return futex_requeue(uaddr, flags, uaddr2, val, val2, NULL, 0);  	case FUTEX_CMP_REQUEUE: -		ret = futex_requeue(uaddr, flags, uaddr2, val, val2, &val3, 0); -		break; +		return futex_requeue(uaddr, flags, uaddr2, val, val2, &val3, 0);  	case FUTEX_WAKE_OP: -		ret = futex_wake_op(uaddr, flags, uaddr2, val, val2, val3); -		break; +		return futex_wake_op(uaddr, flags, uaddr2, val, val2, val3);  	case FUTEX_LOCK_PI: -		if (futex_cmpxchg_enabled) -			ret = futex_lock_pi(uaddr, flags, val, timeout, 0); -		break; +		return futex_lock_pi(uaddr, flags, val, timeout, 0);  	case FUTEX_UNLOCK_PI: -		if (futex_cmpxchg_enabled) -			ret = futex_unlock_pi(uaddr, flags); -		break; +		return futex_unlock_pi(uaddr, flags);  	case FUTEX_TRYLOCK_PI: -		if (futex_cmpxchg_enabled) -			ret = futex_lock_pi(uaddr, flags, 0, timeout, 1); -		break; +		return futex_lock_pi(uaddr, flags, 0, timeout, 1);  	case FUTEX_WAIT_REQUEUE_PI:  		val3 = FUTEX_BITSET_MATCH_ANY; -		ret = futex_wait_requeue_pi(uaddr, flags, val, timeout, val3, -					    uaddr2); -		break; +		return futex_wait_requeue_pi(uaddr, flags, val, timeout, val3, +					     uaddr2);  	case FUTEX_CMP_REQUEUE_PI: -		ret = futex_requeue(uaddr, flags, uaddr2, val, val2, &val3, 1); -		break; -	default: -		ret = -ENOSYS; +		return futex_requeue(uaddr, flags, uaddr2, val, val2, &val3, 1);  	} -	return ret; +	return -ENOSYS;  } | 
