qed: Remove recursion in qed_aio_next_io()
Instead of calling itself recursively as the last thing, just convert qed_aio_next_io() into a loop. This patch is best reviewed with 'git show -w' because most of it is just whitespace changes. Signed-off-by: Kevin Wolf <kwolf@redhat.com> Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
This commit is contained in:
parent
dddf8db10b
commit
018598747c
73
block/qed.c
73
block/qed.c
|
@ -1280,45 +1280,46 @@ static void qed_aio_next_io(QEDAIOCB *acb)
|
||||||
size_t len;
|
size_t len;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
trace_qed_aio_next_io(s, acb, 0, acb->cur_pos + acb->cur_qiov.size);
|
while (1) {
|
||||||
|
trace_qed_aio_next_io(s, acb, 0, acb->cur_pos + acb->cur_qiov.size);
|
||||||
|
|
||||||
if (acb->backing_qiov) {
|
if (acb->backing_qiov) {
|
||||||
qemu_iovec_destroy(acb->backing_qiov);
|
qemu_iovec_destroy(acb->backing_qiov);
|
||||||
g_free(acb->backing_qiov);
|
g_free(acb->backing_qiov);
|
||||||
acb->backing_qiov = NULL;
|
acb->backing_qiov = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
acb->qiov_offset += acb->cur_qiov.size;
|
acb->qiov_offset += acb->cur_qiov.size;
|
||||||
acb->cur_pos += acb->cur_qiov.size;
|
acb->cur_pos += acb->cur_qiov.size;
|
||||||
qemu_iovec_reset(&acb->cur_qiov);
|
qemu_iovec_reset(&acb->cur_qiov);
|
||||||
|
|
||||||
/* Complete request */
|
/* Complete request */
|
||||||
if (acb->cur_pos >= acb->end_pos) {
|
if (acb->cur_pos >= acb->end_pos) {
|
||||||
qed_aio_complete(acb, 0);
|
qed_aio_complete(acb, 0);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Find next cluster and start I/O */
|
/* Find next cluster and start I/O */
|
||||||
len = acb->end_pos - acb->cur_pos;
|
len = acb->end_pos - acb->cur_pos;
|
||||||
ret = qed_find_cluster(s, &acb->request, acb->cur_pos, &len, &offset);
|
ret = qed_find_cluster(s, &acb->request, acb->cur_pos, &len, &offset);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
qed_aio_complete(acb, ret);
|
qed_aio_complete(acb, ret);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (acb->flags & QED_AIOCB_WRITE) {
|
if (acb->flags & QED_AIOCB_WRITE) {
|
||||||
ret = qed_aio_write_data(acb, ret, offset, len);
|
ret = qed_aio_write_data(acb, ret, offset, len);
|
||||||
} else {
|
} else {
|
||||||
ret = qed_aio_read_data(acb, ret, offset, len);
|
ret = qed_aio_read_data(acb, ret, offset, len);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
if (ret != -EINPROGRESS) {
|
if (ret != -EINPROGRESS) {
|
||||||
qed_aio_complete(acb, ret);
|
qed_aio_complete(acb, ret);
|
||||||
|
}
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
qed_aio_next_io(acb);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static BlockAIOCB *qed_aio_setup(BlockDriverState *bs,
|
static BlockAIOCB *qed_aio_setup(BlockDriverState *bs,
|
||||||
|
|
Loading…
Reference in New Issue