Skip to content
  • Jan Kara's avatar
    ext3: Fix possible deadlock between ext3_truncate() and ext3_get_blocks() · 00171d3c
    Jan Kara authored
    
    
    During truncate we are sometimes forced to start a new transaction as the
    amount of blocks to be journaled is both quite large and hard to predict. So
    far we restarted a transaction while holding truncate_mutex and that violates
    lock ordering because truncate_mutex ranks below transaction start (and it
    can lead to a real deadlock with ext3_get_blocks() allocating new blocks
    from ext3_writepage()).
    
    Luckily, the problem is easy to fix: We just drop the truncate_mutex before
    restarting the transaction and acquire it afterwards. We are safe to do this as
    by the time ext3_truncate() is called, all the page cache for the truncated
    part of the file is dropped and so writepage() cannot come and allocate new
    blocks in the part of the file we are truncating. The rest of writers is
    stopped by us holding i_mutex.
    
    Signed-off-by: default avatarJan Kara <jack@suse.cz>
    00171d3c