ocfs2: Avoid livelock in ocfs2_readpage()
authorJan Kara <jack@suse.cz>
Thu, 23 Jun 2011 20:51:47 +0000 (22:51 +0200)
committerJoel Becker <jlbec@evilplan.org>
Thu, 28 Jul 2011 09:07:19 +0000 (02:07 -0700)
commitc7e25e6e0b0486492c5faaf6312b37413642c48e
treec097a213a8eb2ad336fb2ef8046d2e71f0fa1f4a
parenta11f7e63c59810a81494d4c4b028af707d4c7ca4
ocfs2: Avoid livelock in ocfs2_readpage()

When someone writes to an inode, readers accessing the same inode via
ocfs2_readpage() just busyloop trying to get ip_alloc_sem because
do_generic_file_read() looks up the page again and retries ->readpage()
when previous attempt failed with AOP_TRUNCATED_PAGE. When there are enough
readers, they can occupy all CPUs and in non-preempt kernel the system is
deadlocked because writer holding ip_alloc_sem is never run to release the
semaphore. Fix the problem by making reader block on ip_alloc_sem to break
the busy loop.

Signed-off-by: Jan Kara <jack@suse.cz>
Signed-off-by: Joel Becker <jlbec@evilplan.org>
fs/ocfs2/aops.c