• Jan Kara's avatar
    jbd2: fix assertion failure in commit code due to lacking transaction credits · b794e7a6
    Jan Kara authored
    ext4 users of data=journal mode with blocksize < pagesize were
    occasionally hitting assertion failure in
    jbd2_journal_commit_transaction() checking whether the transaction has
    at least as many credits reserved as buffers attached.  The core of the
    problem is that when a file gets truncated, buffers that still need
    checkpointing or that are attached to the committing transaction are
    left with buffer_mapped set. When this happens to buffers beyond i_size
    attached to a page stradding i_size, subsequent write extending the file
    will see these buffers and as they are mapped (but underlying blocks
    were freed) things go awry from here.
    
    The assertion failure just coincidentally (and in this case luckily as
    we would start corrupting filesystem) triggers due to journal_head not
    being properly cleaned up as well.
    
    We fix the problem by unmapping buffers if possible (in lots of cases we
    just need a buffer attached to a transaction as a place holder but it
    must not be written out anyway).  And in one case, we just have to bite
    the bullet and wait for transaction commit to finish.
    
    CC: Josef Bacik <jbacik@fusionio.com>
    Signed-off-by: default avatarJan Kara <jack@suse.cz>
    b794e7a6
transaction.c 69.8 KB