weixin_39718006 2020-11-22 02:52
浏览 0

zfs_receive_raw_incremental causes VERIFY panic


panic(cpu 0 caller 0xffffff7f882e2e0f): "VERIFY3( 0 " "==" " dmu_object_dirty_raw(os, object, tx) ) " "failed (" "0" " " "==" " " "17" ")\n".c:950
Backtrace (CPU 0), Frame : Return Address
0xffffff90a7a439a0 : 0xffffff8005030c64 mach_kernel : _panic + 0x194
0xffffff90a7a43e40 : 0xffffff7f882e2e0f net.lundman.zfs : _dmu_free_long_object_impl + 0x11f
0xffffff90a7a43e80 : 0xffffff7f882e2e62 net.lundman.zfs : _dmu_free_long_object_raw + 0x22
0xffffff90a7a43ea0 : 0xffffff7f88305e7a net.lundman.zfs : _receive_freeobjects + 0xca
0xffffff90a7a43ee0 : 0xffffff7f883051cf net.lundman.zfs : _receive_process_record + 0x15f
0xffffff90a7a43f80 : 0xffffff7f882fce02 net.lundman.zfs : _receive_writer_thread + 0x62
0xffffff90a7a43fb0 : 0xffffff8004fd68f7 mach_kernel : _call_continuation + 0x17

Which appears to be EEXISTS returned from dnode_hold().

该提问来源于开源项目:openzfsonosx/zfs

  • 写回答

6条回答 默认 最新

  • weixin_39718006 2020-11-22 02:52
    关注

    The EEXISTS is returned by:

    
    @@ -1190,6 +1192,7 @@ dnode_hold_impl(objset_t *os, uint64_t object, int flag,
                    mutex_exit(&dn->dn_mtx);
                    zrl_remove(&dnh->dnh_zrlock);
                    dbuf_rele(db, FTAG);
                    return (type == DMU_OT_NONE ? ENOENT : EEXIST);
            }
    

    Allowing dmu_object_dirty_raw() to return EEXISTS in

    
    @@ -952,7 +952,9 @@ dmu_free_long_object_impl(objset_t *os, uint64_t object, boo
    lean_t raw)
            if (err == 0) {
                    err = dmu_object_free(os, object, tx);
                    if (err == 0 && raw)
    -                       VERIFY0(dmu_object_dirty_raw(os, object, tx));
    +                       printf("dirty raw baby %d \n",
    +                               dmu_object_dirty_raw(os, object, tx));
    +               //VERIFY0(dmu_object_dirty_raw(os, object, tx));
    

    Allows everything to keep running. Cause is still unknown.

    评论

报告相同问题?