• Jan Kara's avatar
    ext4: fix deadlock in ext4_symlink() in ENOSPC conditions · df5e6223
    Jan Kara authored
    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: default avatarJan Kara <jack@suse.cz>
    Signed-off-by: default avatar"Theodore Ts'o" <tytso@mit.edu>
    df5e6223
namei.c 70.6 KB