• Z
    jbd2: ensure abort the journal if detect IO error when writing original buffer back · 72c9e4df
    Zhang Yi 提交于
    hulk inclusion
    category: bugfix
    bugzilla: 50788
    CVE: NA
    ---------------------------
    
    Although we merged c044f3d8 ("jbd2: abort journal if free a async
    write error metadata buffer"), there is a race between
    jbd2_journal_try_to_free_buffers() and jbd2_journal_destroy(), so the
    jbd2_log_do_checkpoint() may still fail to detect the buffer write
    io error flag which may lead to filesystem inconsistency.
    
    jbd2_journal_try_to_free_buffers()     ext4_put_super()
                                            jbd2_journal_destroy()
      __jbd2_journal_remove_checkpoint()
      detect buffer write error              jbd2_log_do_checkpoint()
                                             jbd2_cleanup_journal_tail()
                                               <--- lead to inconsistency
      jbd2_journal_abort()
    
    Fix this issue by introducing a new atomic flag which only have one
    JBD2_CHECKPOINT_IO_ERROR bit now, and set it in
    __jbd2_journal_remove_checkpoint() when freeing a checkpoint buffer
    which has write_io_error flag. Then jbd2_journal_destroy() will detect
    this mark and abort the journal to prevent updating log tail.
    Signed-off-by: NZhang Yi <yi.zhang@huawei.com>
    Reviewed-by: NZhang Xiaoxu <zhangxiaoxu5@huawei.com>
    Reviewed-by: NZhang Xiaoxu <zhangxiaoxu5@huawei.com>
    Signed-off-by: NYang Yingliang <yangyingliang@huawei.com>
    72c9e4df
journal.c 77.3 KB