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
Tip revision: 5ecb01cfdf96c5f465192bdb2a4fd4a61a24c6cc authored by Mikael Pettersson on 23 January 2010, 21:36:29 UTC
futex_lock_pi() key refcnt fix
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 |
Computing file changes ...