void qed_read_l2_table(BDRVQEDState *s, QEDRequest *request, uint64_t offset, BlockDriverCompletionFunc *cb, void *opaque) { QEDReadL2TableCB *read_l2_table_cb; qed_unref_l2_cache_entry(request->l2_table); /* Check for cached L2 entry */ request->l2_table = qed_find_l2_cache_entry(&s->l2_cache, offset); if (request->l2_table) { cb(opaque, 0); return; } request->l2_table = qed_alloc_l2_cache_entry(&s->l2_cache); request->l2_table->table = qed_alloc_table(s); read_l2_table_cb = gencb_alloc(sizeof(*read_l2_table_cb), cb, opaque); read_l2_table_cb->s = s; read_l2_table_cb->l2_offset = offset; read_l2_table_cb->request = request; BLKDBG_EVENT(s->bs->file, BLKDBG_L2_LOAD); qed_read_table(s, offset, request->l2_table->table, qed_read_l2_table_cb, read_l2_table_cb); }
/** * Allocate a new zeroed L2 table */ static CachedL2Table *qed_new_l2_table(BDRVQEDState *s) { CachedL2Table *l2_table = qed_alloc_l2_cache_entry(&s->l2_cache); l2_table->table = qed_alloc_table(s); l2_table->offset = qed_alloc_clusters(s, s->header.table_size); memset(l2_table->table->offsets, 0, s->header.cluster_size * s->header.table_size); return l2_table; }