Files
linux-legacy-genesi-2/kernel
Mikael Pettersson b2547d0901 futex_lock_pi() key refcnt fix
commit 5ecb01cfdf96c5f465192bdb2a4fd4a61a24c6cc upstream.

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
38d47c1b70 "[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>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
2010-04-01 15:55:26 -07:00
..
2009-07-12 12:22:34 -07:00
2009-12-18 13:43:19 -08:00
2009-06-24 00:02:38 -04:00
2009-06-24 00:02:38 -04:00
2009-07-29 19:10:35 -07:00
2010-04-01 15:55:26 -07:00
2009-06-16 19:47:48 -07:00
2009-07-10 17:32:55 +02:00
2009-05-15 07:56:24 -05:00
2009-07-08 09:31:56 -07:00
2009-07-27 12:15:46 -07:00
2009-06-18 13:03:56 -07:00
2009-07-24 15:30:45 -04:00
2009-11-09 16:22:22 -08:00
2009-06-18 13:03:55 -07:00
2009-03-30 22:05:16 +10:30
2009-12-08 10:22:06 -08:00
2009-08-07 10:39:55 -07:00
2009-06-16 19:47:48 -07:00
2009-12-08 10:21:16 -08:00
2009-06-18 13:03:55 -07:00