diff options
author | 2011-05-03 11:12:58 -0400 | |
---|---|---|
committer | 2011-05-03 11:12:58 -0400 | |
commit | df5e6223407e3e645065c4bd968fee007f0e0287 (patch) | |
tree | d5027dc9645dea4a5536819ac98f4299757fff22 /fs/jbd2/commit.c | |
parent | ext4: Fix fs corruption when make_indexed_dir() fails (diff) | |
download | linux-dev-df5e6223407e3e645065c4bd968fee007f0e0287.tar.xz linux-dev-df5e6223407e3e645065c4bd968fee007f0e0287.zip |
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>
Diffstat (limited to 'fs/jbd2/commit.c')
0 files changed, 0 insertions, 0 deletions