• J
    [PATCH] jbd: fix BUG in journal_commit_transaction() · 9ada7340
    Jan Kara 提交于
    Fix possible assertion failure in journal_commit_transaction() on
    jh->b_next_transaction == NULL (when we are processing BJ_Forget list and
    buffer is not jbddirty).
    
    !jbddirty buffers can be placed on BJ_Forget list for example by
    journal_forget() or by __dispose_buffer() - generally such buffer means
    that it has been freed by this transaction.
    
    Freed buffers should not be reallocated until the transaction has committed
    (that's why we have the assertion there) but they *can* be reallocated when
    the transaction has already been committed to disk and we are just
    processing the BJ_Forget list (as soon as we remove b_committed_data from
    the bitmap bh, ext3 will be able to reallocate buffers freed by the
    committing transaction).  So we have to also count with the case that the
    buffer has been reallocated and b_next_transaction has been already set.
    
    And one more subtle point: it can happen that we manage to reallocate the
    buffer and also mark it jbddirty.  Then we also add the freed buffer to the
    checkpoint list of the committing trasaction.  But that should do no harm.
    
    Non-jbddirty buffers should be filed to BJ_Reserved and not BJ_Metadata
    list.  It can actually happen that we refile such buffers during the commit
    phase when we reallocate in the running transaction blocks deleted in
    committing transaction (and that can happen if the committing transaction
    already wrote all the data and is just cleaning up BJ_Forget list).
    Signed-off-by: NJan Kara <jack@suse.cz>
    Acked-by: N"Stephen C. Tweedie" <sct@redhat.com>
    Signed-off-by: NAndrew Morton <akpm@osdl.org>
    Signed-off-by: NLinus Torvalds <torvalds@osdl.org>
    9ada7340
transaction.c 60.9 KB