• X
    ocfs2: extend transaction for ocfs2_remove_rightmost_path() and... · 17215989
    Xue jiufei 提交于
    ocfs2: extend transaction for ocfs2_remove_rightmost_path() and ocfs2_update_edge_lengths() before to avoid inconsistency between inode and et
    
    I found that jbd2_journal_restart() is called in some places without
    keeping things consistently before.  However, jbd2_journal_restart() may
    commit the handle's transaction and restart another one.  If the first
    transaction is committed successfully while another not, it may cause
    filesystem inconsistency or read only.  This is an effort to fix this
    kind of problems.
    
    This patch (of 3):
    
    The following functions will be called while truncating an extent:
    ocfs2_remove_btree_range
      -> ocfs2_start_trans
      -> ocfs2_remove_extent
         -> ocfs2_truncate_rec
           -> ocfs2_extend_rotate_transaction
             -> jbd2_journal_restart if jbd2_journal_extend fail
           -> ocfs2_rotate_tree_left
             -> ocfs2_remove_rightmost_path
                 -> ocfs2_extend_rotate_transaction
                   -> ocfs2_unlink_subtree
                    -> ocfs2_update_edge_lengths
                      -> ocfs2_extend_trans
                        -> jbd2_journal_restart if jbd2_journal_extend fail
      -> ocfs2_et_update_clusters
      -> ocfs2_commit_trans
    
    jbd2_journal_restart() may be called and it may happened that the buffers
    dirtied in ocfs2_truncate_rec() are committed while buffers dirtied in
    ocfs2_et_update_clusters() are not, the total clusters on extent tree and
    i_clusters in ocfs2_dinode is inconsistency.  So the clusters got from
    ocfs2_dinode is incorrect, and it also cause read-only problem when call
    ocfs2_commit_truncate() with the error message: "Inode %llu has empty
    extent block at %llu".
    
    We should extend enough credits for function ocfs2_remove_rightmost_path
    and ocfs2_update_edge_lengths to avoid this inconsistency.
    Signed-off-by: Njoyce.xue <xuejiufei@huawei.com>
    Acked-by: NJoseph Qi <joseph.qi@huawei.com>
    Cc: Mark Fasheh <mfasheh@suse.com>
    Cc: Joel Becker <jlbec@evilplan.org>
    Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
    17215989
alloc.c 189.6 KB