https://github.com/torvalds/linux
Revision 5ecb01cfdf96c5f465192bdb2a4fd4a61a24c6cc authored by Mikael Pettersson on 23 January 2010, 21:36:29 UTC, committed by Thomas Gleixner on 03 February 2010, 14:13:22 UTC
This fixes a futex key reference count bug in futex_lock_pi(),
where a key's reference count is incremented twice but decremented
only once, causing the backing object to not be released.

If the futex is created in a temporary file in an ext3 file system,
this bug causes the file's inode to become an "undead" orphan,
which causes an oops from a BUG_ON() in ext3_put_super() when the
file system is unmounted. glibc's test suite is known to trigger this,
see <http://bugzilla.kernel.org/show_bug.cgi?id=14256>.

The bug is a regression from 2.6.28-git3, namely Peter Zijlstra's
38d47c1b7075bd7ec3881141bb3629da58f88dab "[PATCH] futex: rely on
get_user_pages() for shared futexes". That commit made get_futex_key()
also increment the reference count of the futex key, and updated its
callers to decrement the key's reference count before returning.
Unfortunately the normal exit path in futex_lock_pi() wasn't corrected:
the reference count is incremented by get_futex_key() and queue_lock(),
but the normal exit path only decrements once, via unqueue_me_pi().
The fix is to put_futex_key() after unqueue_me_pi(), since 2.6.31
this is easily done by 'goto out_put_key' rather than 'goto out'.

Signed-off-by: Mikael Pettersson <mikpe@it.uu.se>
Acked-by: Peter Zijlstra <a.p.zijlstra@chello.nl>
Acked-by: Darren Hart <dvhltc@us.ibm.com>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Cc: <stable@kernel.org>
1 parent d6ad3e2
History
Tip revision: 5ecb01cfdf96c5f465192bdb2a4fd4a61a24c6cc authored by Mikael Pettersson on 23 January 2010, 21:36:29 UTC
futex_lock_pi() key refcnt fix
Tip revision: 5ecb01c
File Mode Size
Kconfig -rw-r--r-- 1.0 KB
Makefile -rw-r--r-- 426 bytes
af_rxrpc.c -rw-r--r-- 20.4 KB
ar-accept.c -rw-r--r-- 12.1 KB
ar-ack.c -rw-r--r-- 32.5 KB
ar-call.c -rw-r--r-- 21.2 KB
ar-connection.c -rw-r--r-- 22.8 KB
ar-connevent.c -rw-r--r-- 9.1 KB
ar-error.c -rw-r--r-- 5.8 KB
ar-input.c -rw-r--r-- 19.9 KB
ar-internal.h -rw-r--r-- 27.8 KB
ar-key.c -rw-r--r-- 27.9 KB
ar-local.c -rw-r--r-- 7.5 KB
ar-output.c -rw-r--r-- 17.9 KB
ar-peer.c -rw-r--r-- 7.4 KB
ar-proc.c -rw-r--r-- 5.0 KB
ar-recvmsg.c -rw-r--r-- 10.7 KB
ar-security.c -rw-r--r-- 5.6 KB
ar-skbuff.c -rw-r--r-- 3.4 KB
ar-transport.c -rw-r--r-- 7.0 KB
rxkad.c -rw-r--r-- 27.3 KB

back to top