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); }
int qed_read_l1_table_sync(BDRVQEDState *s) { int ret = -EINPROGRESS; qed_read_table(s, s->header.l1_table_offset, s->l1_table, qed_sync_cb, &ret); while (ret == -EINPROGRESS) { qemu_aio_wait(); } return ret; }
int qed_read_l1_table_sync(BDRVQEDState *s) { int ret = -EINPROGRESS; qed_read_table(s, s->header.l1_table_offset, s->l1_table, qed_sync_cb, &ret); while (ret == -EINPROGRESS) { aio_poll(bdrv_get_aio_context(s->bs), true); } return ret; }