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 |
---|---|---|
802 | ||
8021q | ||
9p | ||
appletalk | ||
atm | ||
ax25 | ||
bluetooth | ||
bridge | ||
can | ||
core | ||
dcb | ||
dccp | ||
decnet | ||
dsa | ||
econet | ||
ethernet | ||
ieee802154 | ||
ipv4 | ||
ipv6 | ||
ipx | ||
irda | ||
iucv | ||
key | ||
lapb | ||
llc | ||
mac80211 | ||
netfilter | ||
netlabel | ||
netlink | ||
netrom | ||
packet | ||
phonet | ||
rds | ||
rfkill | ||
rose | ||
rxrpc | ||
sched | ||
sctp | ||
sunrpc | ||
tipc | ||
unix | ||
wanrouter | ||
wimax | ||
wireless | ||
x25 | ||
xfrm | ||
Kconfig | -rw-r--r-- | 9.3 KB |
Makefile | -rw-r--r-- | 1.7 KB |
TUNABLE | -rw-r--r-- | 2.2 KB |
compat.c | -rw-r--r-- | 24.0 KB |
nonet.c | -rw-r--r-- | 528 bytes |
socket.c | -rw-r--r-- | 74.8 KB |
sysctl_net.c | -rw-r--r-- | 3.0 KB |
Computing file changes ...