Loading block/qed-table.c +12 −35 Original line number Diff line number Diff line Loading @@ -61,12 +61,9 @@ out: * @index: Index of first element * @n: Number of elements * @flush: Whether or not to sync to disk * @cb: Completion function * @opaque: Argument for completion function */ static void qed_write_table(BDRVQEDState *s, uint64_t offset, QEDTable *table, unsigned int index, unsigned int n, bool flush, BlockCompletionFunc *cb, void *opaque) static int qed_write_table(BDRVQEDState *s, uint64_t offset, QEDTable *table, unsigned int index, unsigned int n, bool flush) { unsigned int sector_mask = BDRV_SECTOR_SIZE / sizeof(uint64_t) - 1; unsigned int start, end, i; Loading Loading @@ -118,15 +115,7 @@ static void qed_write_table(BDRVQEDState *s, uint64_t offset, QEDTable *table, ret = 0; out: qemu_vfree(new_table); cb(opaque, ret); } /** * Propagate return value from async callback */ static void qed_sync_cb(void *opaque, int ret) { *(int *)opaque = ret; return ret; } int qed_read_l1_table_sync(BDRVQEDState *s) Loading @@ -134,23 +123,17 @@ int qed_read_l1_table_sync(BDRVQEDState *s) return qed_read_table(s, s->header.l1_table_offset, s->l1_table); } void qed_write_l1_table(BDRVQEDState *s, unsigned int index, unsigned int n, BlockCompletionFunc *cb, void *opaque) int qed_write_l1_table(BDRVQEDState *s, unsigned int index, unsigned int n) { BLKDBG_EVENT(s->bs->file, BLKDBG_L1_UPDATE); qed_write_table(s, s->header.l1_table_offset, s->l1_table, index, n, false, cb, opaque); return qed_write_table(s, s->header.l1_table_offset, s->l1_table, index, n, false); } int qed_write_l1_table_sync(BDRVQEDState *s, unsigned int index, unsigned int n) { int ret = -EINPROGRESS; qed_write_l1_table(s, index, n, qed_sync_cb, &ret); BDRV_POLL_WHILE(s->bs, ret == -EINPROGRESS); return ret; return qed_write_l1_table(s, index, n); } int qed_read_l2_table(BDRVQEDState *s, QEDRequest *request, uint64_t offset) Loading Loading @@ -197,22 +180,16 @@ int qed_read_l2_table_sync(BDRVQEDState *s, QEDRequest *request, uint64_t offset return qed_read_l2_table(s, request, offset); } void qed_write_l2_table(BDRVQEDState *s, QEDRequest *request, unsigned int index, unsigned int n, bool flush, BlockCompletionFunc *cb, void *opaque) int qed_write_l2_table(BDRVQEDState *s, QEDRequest *request, unsigned int index, unsigned int n, bool flush) { BLKDBG_EVENT(s->bs->file, BLKDBG_L2_UPDATE); qed_write_table(s, request->l2_table->offset, request->l2_table->table, index, n, flush, cb, opaque); return qed_write_table(s, request->l2_table->offset, request->l2_table->table, index, n, flush); } int qed_write_l2_table_sync(BDRVQEDState *s, QEDRequest *request, unsigned int index, unsigned int n, bool flush) { int ret = -EINPROGRESS; qed_write_l2_table(s, request, index, n, flush, qed_sync_cb, &ret); BDRV_POLL_WHILE(s->bs, ret == -EINPROGRESS); return ret; return qed_write_l2_table(s, request, index, n, flush); } block/qed.c +7 −5 Original line number Diff line number Diff line Loading @@ -1000,7 +1000,8 @@ static void qed_aio_write_l1_update(void *opaque, int ret) index = qed_l1_index(s, acb->cur_pos); s->l1_table->offsets[index] = acb->request.l2_table->offset; qed_write_l1_table(s, index, 1, qed_commit_l2_update, acb); ret = qed_write_l1_table(s, index, 1); qed_commit_l2_update(acb, ret); } /** Loading @@ -1027,12 +1028,13 @@ static void qed_aio_write_l2_update(QEDAIOCB *acb, int ret, uint64_t offset) if (need_alloc) { /* Write out the whole new L2 table */ qed_write_l2_table(s, &acb->request, 0, s->table_nelems, true, qed_aio_write_l1_update, acb); ret = qed_write_l2_table(s, &acb->request, 0, s->table_nelems, true); qed_aio_write_l1_update(acb, ret); } else { /* Write out only the updated part of the L2 table */ qed_write_l2_table(s, &acb->request, index, acb->cur_nclusters, false, qed_aio_next_io_cb, acb); ret = qed_write_l2_table(s, &acb->request, index, acb->cur_nclusters, false); qed_aio_next_io(acb, ret); } return; Loading block/qed.h +3 −5 Original line number Diff line number Diff line Loading @@ -220,16 +220,14 @@ void qed_commit_l2_cache_entry(L2TableCache *l2_cache, CachedL2Table *l2_table); * Table I/O functions */ int qed_read_l1_table_sync(BDRVQEDState *s); void qed_write_l1_table(BDRVQEDState *s, unsigned int index, unsigned int n, BlockCompletionFunc *cb, void *opaque); int qed_write_l1_table(BDRVQEDState *s, unsigned int index, unsigned int n); int qed_write_l1_table_sync(BDRVQEDState *s, unsigned int index, unsigned int n); int qed_read_l2_table_sync(BDRVQEDState *s, QEDRequest *request, uint64_t offset); int qed_read_l2_table(BDRVQEDState *s, QEDRequest *request, uint64_t offset); void qed_write_l2_table(BDRVQEDState *s, QEDRequest *request, unsigned int index, unsigned int n, bool flush, BlockCompletionFunc *cb, void *opaque); int qed_write_l2_table(BDRVQEDState *s, QEDRequest *request, unsigned int index, unsigned int n, bool flush); int qed_write_l2_table_sync(BDRVQEDState *s, QEDRequest *request, unsigned int index, unsigned int n, bool flush); Loading Loading
block/qed-table.c +12 −35 Original line number Diff line number Diff line Loading @@ -61,12 +61,9 @@ out: * @index: Index of first element * @n: Number of elements * @flush: Whether or not to sync to disk * @cb: Completion function * @opaque: Argument for completion function */ static void qed_write_table(BDRVQEDState *s, uint64_t offset, QEDTable *table, unsigned int index, unsigned int n, bool flush, BlockCompletionFunc *cb, void *opaque) static int qed_write_table(BDRVQEDState *s, uint64_t offset, QEDTable *table, unsigned int index, unsigned int n, bool flush) { unsigned int sector_mask = BDRV_SECTOR_SIZE / sizeof(uint64_t) - 1; unsigned int start, end, i; Loading Loading @@ -118,15 +115,7 @@ static void qed_write_table(BDRVQEDState *s, uint64_t offset, QEDTable *table, ret = 0; out: qemu_vfree(new_table); cb(opaque, ret); } /** * Propagate return value from async callback */ static void qed_sync_cb(void *opaque, int ret) { *(int *)opaque = ret; return ret; } int qed_read_l1_table_sync(BDRVQEDState *s) Loading @@ -134,23 +123,17 @@ int qed_read_l1_table_sync(BDRVQEDState *s) return qed_read_table(s, s->header.l1_table_offset, s->l1_table); } void qed_write_l1_table(BDRVQEDState *s, unsigned int index, unsigned int n, BlockCompletionFunc *cb, void *opaque) int qed_write_l1_table(BDRVQEDState *s, unsigned int index, unsigned int n) { BLKDBG_EVENT(s->bs->file, BLKDBG_L1_UPDATE); qed_write_table(s, s->header.l1_table_offset, s->l1_table, index, n, false, cb, opaque); return qed_write_table(s, s->header.l1_table_offset, s->l1_table, index, n, false); } int qed_write_l1_table_sync(BDRVQEDState *s, unsigned int index, unsigned int n) { int ret = -EINPROGRESS; qed_write_l1_table(s, index, n, qed_sync_cb, &ret); BDRV_POLL_WHILE(s->bs, ret == -EINPROGRESS); return ret; return qed_write_l1_table(s, index, n); } int qed_read_l2_table(BDRVQEDState *s, QEDRequest *request, uint64_t offset) Loading Loading @@ -197,22 +180,16 @@ int qed_read_l2_table_sync(BDRVQEDState *s, QEDRequest *request, uint64_t offset return qed_read_l2_table(s, request, offset); } void qed_write_l2_table(BDRVQEDState *s, QEDRequest *request, unsigned int index, unsigned int n, bool flush, BlockCompletionFunc *cb, void *opaque) int qed_write_l2_table(BDRVQEDState *s, QEDRequest *request, unsigned int index, unsigned int n, bool flush) { BLKDBG_EVENT(s->bs->file, BLKDBG_L2_UPDATE); qed_write_table(s, request->l2_table->offset, request->l2_table->table, index, n, flush, cb, opaque); return qed_write_table(s, request->l2_table->offset, request->l2_table->table, index, n, flush); } int qed_write_l2_table_sync(BDRVQEDState *s, QEDRequest *request, unsigned int index, unsigned int n, bool flush) { int ret = -EINPROGRESS; qed_write_l2_table(s, request, index, n, flush, qed_sync_cb, &ret); BDRV_POLL_WHILE(s->bs, ret == -EINPROGRESS); return ret; return qed_write_l2_table(s, request, index, n, flush); }
block/qed.c +7 −5 Original line number Diff line number Diff line Loading @@ -1000,7 +1000,8 @@ static void qed_aio_write_l1_update(void *opaque, int ret) index = qed_l1_index(s, acb->cur_pos); s->l1_table->offsets[index] = acb->request.l2_table->offset; qed_write_l1_table(s, index, 1, qed_commit_l2_update, acb); ret = qed_write_l1_table(s, index, 1); qed_commit_l2_update(acb, ret); } /** Loading @@ -1027,12 +1028,13 @@ static void qed_aio_write_l2_update(QEDAIOCB *acb, int ret, uint64_t offset) if (need_alloc) { /* Write out the whole new L2 table */ qed_write_l2_table(s, &acb->request, 0, s->table_nelems, true, qed_aio_write_l1_update, acb); ret = qed_write_l2_table(s, &acb->request, 0, s->table_nelems, true); qed_aio_write_l1_update(acb, ret); } else { /* Write out only the updated part of the L2 table */ qed_write_l2_table(s, &acb->request, index, acb->cur_nclusters, false, qed_aio_next_io_cb, acb); ret = qed_write_l2_table(s, &acb->request, index, acb->cur_nclusters, false); qed_aio_next_io(acb, ret); } return; Loading
block/qed.h +3 −5 Original line number Diff line number Diff line Loading @@ -220,16 +220,14 @@ void qed_commit_l2_cache_entry(L2TableCache *l2_cache, CachedL2Table *l2_table); * Table I/O functions */ int qed_read_l1_table_sync(BDRVQEDState *s); void qed_write_l1_table(BDRVQEDState *s, unsigned int index, unsigned int n, BlockCompletionFunc *cb, void *opaque); int qed_write_l1_table(BDRVQEDState *s, unsigned int index, unsigned int n); int qed_write_l1_table_sync(BDRVQEDState *s, unsigned int index, unsigned int n); int qed_read_l2_table_sync(BDRVQEDState *s, QEDRequest *request, uint64_t offset); int qed_read_l2_table(BDRVQEDState *s, QEDRequest *request, uint64_t offset); void qed_write_l2_table(BDRVQEDState *s, QEDRequest *request, unsigned int index, unsigned int n, bool flush, BlockCompletionFunc *cb, void *opaque); int qed_write_l2_table(BDRVQEDState *s, QEDRequest *request, unsigned int index, unsigned int n, bool flush); int qed_write_l2_table_sync(BDRVQEDState *s, QEDRequest *request, unsigned int index, unsigned int n, bool flush); Loading