ext3: Fix lock inversion in ext3_symlink()
commitae54870a1dc978a88377ae8af0780648f2ccd4dc
authorJan Kara <jack@suse.cz>
Thu, 21 Apr 2011 21:47:16 +0000 (21 23:47 +0200)
committerJan Kara <jack@suse.cz>
Fri, 29 Apr 2011 21:20:03 +0000 (29 23:20 +0200)
tree220268d2087adac3191a54805dd6c0c203d50606
parentfafc9929c668f8bae6dd1f109f33a86d2cb3c460
ext3: Fix lock inversion in ext3_symlink()

ext3_symlink() cannot call __page_symlink() with transaction open.
__page_symlink() calls ext3_write_begin() which gets page lock which ranks
above transaction start (thus lock ordering is violated) and and also
ext3_write_begin() waits for a transaction commit when we run out of space
which never happens if we hold transaction open.

Fix the problem by stopping a transaction before calling __page_symlink()
(we have to be careful and put inode to orphan list so that it gets deleted
in case of crash) and starting another one after __page_symlink() returns
for addition of symlink into a directory.

Signed-off-by: Jan Kara <jack@suse.cz>
fs/ext3/namei.c