Closed guoweilkd closed 9 months ago
db_unlock() is called under the tag __exit, but db_lock() not called before the first goto __exit
db_unlock()
__exit
db_lock()
goto __exit
static fdb_err_t _fdb_kv_load(fdb_kvdb_t db) { fdb_err_t result = FDB_NO_ERR; struct fdb_kv kv; struct kvdb_sec_info sector; size_t check_failed_count = 0; db->in_recovery_check = true; /* check all sector header */ sector_iterator(db, §or, FDB_SECTOR_STORE_UNUSED, &check_failed_count, db, check_sec_hdr_cb, false); if (db->parent.not_formatable && check_failed_count > 0) { result = FDB_READ_ERR; goto __exit; //此时还未调用 db_lock(db); } /* all sector header check failed */ if (check_failed_count == SECTOR_NUM) { FDB_INFO("All sector header is incorrect. Set it to default.\n"); fdb_kv_set_default(db); } /* lock the KV cache */ db_lock(db); /* check all sector header for recovery GC */ sector_iterator(db, §or, FDB_SECTOR_STORE_UNUSED, db, NULL, check_and_recovery_gc_cb, false); __retry: /* check all KV for recovery */ kv_iterator(db, &kv, db, NULL, check_and_recovery_kv_cb); if (db->gc_request) { gc_collect(db); goto __retry; } db->in_recovery_check = false; __exit: /* unlock the KV cache */ db_unlock(db); return result; }
确实,这里直接 return FDB_READ_ERR 就行了,你方便提交一笔 PR 修正下嘛
db_unlock()
is called under the tag__exit
, butdb_lock()
not called before the firstgoto __exit