“22c5044e020148d4dace1900f26d327f49cc9e0b”上不存在“test/java/awt/git@gitcode.net:openanolis/dragonwell8_jdk.git”
  • Z
    jbd2: fix outstanding credits assert in jbd2_journal_commit_transaction() · 746805a7
    Zhang Yi 提交于
    hulk inclusion
    category: bugfix
    bugzilla: 186882, https://gitee.com/openeuler/kernel/issues/I5C3AI
    
    ----------------------------------------
    
    We catch an assert problem in jbd2_journal_commit_transaction() when
    doing fsstress and request falut injection tests. The problem is
    happened in a race condition between jbd2_journal_commit_transaction()
    and ext4_end_io_end(). Firstly, ext4_writepages() writeback dirty pages
    and start reserved handle, and then the journal was aborted due to some
    previous metadata IO error, jbd2_journal_abort() start to commit current
    running transaction, the committing procedure could be raced by
    ext4_end_io_end() and lead to subtract j_reserved_credits twice from
    commit_transaction->t_outstanding_credits, finally the
    t_outstanding_credits is mistakenly smaller than t_nr_buffers and
    trigger assert.
    
    kjournald2           kworker
    
    jbd2_journal_commit_transaction()
     write_unlock(&journal->j_state_lock);
     atomic_sub(j_reserved_credits, t_outstanding_credits); //sub once
    
         	             jbd2_journal_start_reserved()
         	              start_this_handle()  //detect aborted journal
         	              jbd2_journal_free_reserved()  //get running transaction
                           read_lock(&journal->j_state_lock)
         	                __jbd2_journal_unreserve_handle()
         	               atomic_sub(j_reserved_credits, t_outstanding_credits);
                           //sub again
                           read_unlock(&journal->j_state_lock);
    
     journal->j_running_transaction = NULL;
     J_ASSERT(t_nr_buffers <= t_outstanding_credits) //bomb!!!
    
    Fix this issue by using journal->j_state_lock to protect the subtraction
    in jbd2_journal_commit_transaction().
    
    Fixes: 96f1e097 ("jbd2: avoid long hold times of j_state_lock while committing a transaction")
    Signed-off-by: NZhang Yi <yi.zhang@huawei.com>
    Signed-off-by: NZhihao Cheng <chengzhihao1@huawei.com>
    Reviewed-by: NZhang Yi <yi.zhang@huawei.com>
    Signed-off-by: NZheng Zengkai <zhengzengkai@huawei.com>
    746805a7
commit.c 36.5 KB