rt_mutex_finish_proxy_lock() can return failure code (e.g. -EINTR, -ETIMEDOUT).
Original implementation has already noticed about it, but not check it before next work. Also let coments within 80 columns to pass "./scripts/checkpatch.pl". Signed-off-by: Chen Gang <[email protected]> --- kernel/futex.c | 30 ++++++++++++++++-------------- 1 files changed, 16 insertions(+), 14 deletions(-) diff --git a/kernel/futex.c b/kernel/futex.c index c3a1a55..1a94e7d 100644 --- a/kernel/futex.c +++ b/kernel/futex.c @@ -2373,21 +2373,23 @@ static int futex_wait_requeue_pi(u32 __user *uaddr, unsigned int flags, ret = rt_mutex_finish_proxy_lock(pi_mutex, to, &rt_waiter, 1); debug_rt_mutex_free_waiter(&rt_waiter); - spin_lock(q.lock_ptr); - /* - * Fixup the pi_state owner and possibly acquire the lock if we - * haven't already. - */ - res = fixup_owner(uaddr2, &q, !ret); - /* - * If fixup_owner() returned an error, proprogate that. If it - * acquired the lock, clear -ETIMEDOUT or -EINTR. - */ - if (res) - ret = (res < 0) ? res : 0; + if (!ret) { + spin_lock(q.lock_ptr); + /* + * Fixup the pi_state owner and possibly acquire the + * lock if we haven't already. + */ + res = fixup_owner(uaddr2, &q, !ret); + /* + * If fixup_owner() returned an error, proprogate that. + * If it acquired the lock, clear -ETIMEDOUT or -EINTR. + */ + if (res) + ret = (res < 0) ? res : 0; - /* Unqueue and drop the lock. */ - unqueue_me_pi(&q); + /* Unqueue and drop the lock. */ + unqueue_me_pi(&q); + } } /* -- 1.7.7.6 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/

