]> git.baikalelectronics.ru Git - kernel.git/commit
ext4: fix deadlock in ext4_symlink() in ENOSPC conditions
authorJan Kara <jack@suse.cz>
Tue, 3 May 2011 15:12:58 +0000 (11:12 -0400)
committerTheodore Ts'o <tytso@mit.edu>
Tue, 3 May 2011 15:12:58 +0000 (11:12 -0400)
commit9419e6a441d7819132e702ec55e1bedd601cfad4
treed5027dc9645dea4a5536819ac98f4299757fff22
parent58de2b18cbfc3d361a285ed408a3e21cb782a744
ext4: fix deadlock in ext4_symlink() in ENOSPC conditions

ext4_symlink() cannot call __page_symlink() with transaction open.
__page_symlink() calls ext4_write_begin() which can wait for
transaction commit if we are running out of space thus causing a
deadlock. Also error recovery in ext4_truncate_failed_write() does not
count with the transaction being already started (although I'm not
aware of any particular deadlock here).

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>
Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
fs/ext4/namei.c