qed: Add return value to qed_aio_write_cow()

Don't recurse into qed_aio_next_io() and qed_aio_complete() here, but
just return an error code and let the caller handle it.

While refactoring qed_aio_write_alloc() to accomodate the change,
qed_aio_write_zero_cluster() ended up with a single line, so I chose to
inline that line and remove the function completely.

Signed-off-by: Kevin Wolf <kwolf@redhat.com>
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
master
Kevin Wolf 2016-11-17 15:40:41 +01:00
parent eaf0bc56f5
commit a101341aa0
1 changed files with 22 additions and 38 deletions

View File

@ -1065,11 +1065,11 @@ static int qed_aio_write_main(QEDAIOCB *acb)
/**
* Populate untouched regions of new data cluster
*/
static void qed_aio_write_cow(void *opaque, int ret)
static int qed_aio_write_cow(QEDAIOCB *acb)
{
QEDAIOCB *acb = opaque;
BDRVQEDState *s = acb_to_s(acb);
uint64_t start, len, offset;
int ret;
/* Populate front untouched region of new data cluster */
start = qed_start_of_cluster(s, acb->cur_pos);
@ -1077,9 +1077,8 @@ static void qed_aio_write_cow(void *opaque, int ret)
trace_qed_aio_write_prefill(s, acb, start, len, acb->cur_cluster);
ret = qed_copy_from_backing_file(s, start, len, acb->cur_cluster);
if (ret) {
qed_aio_complete(acb, ret);
return;
if (ret < 0) {
return ret;
}
/* Populate back untouched region of new data cluster */
@ -1091,17 +1090,11 @@ static void qed_aio_write_cow(void *opaque, int ret)
trace_qed_aio_write_postfill(s, acb, start, len, offset);
ret = qed_copy_from_backing_file(s, start, len, offset);
if (ret) {
qed_aio_complete(acb, ret);
return;
if (ret < 0) {
return ret;
}
ret = qed_aio_write_main(acb);
if (ret < 0) {
qed_aio_complete(acb, ret);
return;
}
qed_aio_next_io(acb, 0);
return qed_aio_write_main(acb);
}
/**
@ -1117,23 +1110,6 @@ static bool qed_should_set_need_check(BDRVQEDState *s)
return !(s->header.features & QED_F_NEED_CHECK);
}
static void qed_aio_write_zero_cluster(void *opaque, int ret)
{
QEDAIOCB *acb = opaque;
if (ret) {
qed_aio_complete(acb, ret);
return;
}
ret = qed_aio_write_l2_update(acb, 1);
if (ret < 0) {
qed_aio_complete(acb, ret);
return;
}
qed_aio_next_io(acb, 0);
}
/**
* Write new data cluster
*
@ -1145,7 +1121,6 @@ static void qed_aio_write_zero_cluster(void *opaque, int ret)
static void qed_aio_write_alloc(QEDAIOCB *acb, size_t len)
{
BDRVQEDState *s = acb_to_s(acb);
BlockCompletionFunc *cb;
int ret;
/* Cancel timer when the first allocating request comes in */
@ -1172,20 +1147,29 @@ static void qed_aio_write_alloc(QEDAIOCB *acb, size_t len)
qed_aio_start_io(acb);
return;
}
cb = qed_aio_write_zero_cluster;
} else {
cb = qed_aio_write_cow;
acb->cur_cluster = qed_alloc_clusters(s, acb->cur_nclusters);
}
if (qed_should_set_need_check(s)) {
s->header.features |= QED_F_NEED_CHECK;
ret = qed_write_header(s);
cb(acb, ret);
} else {
cb(acb, 0);
if (ret < 0) {
qed_aio_complete(acb, ret);
return;
}
}
if (acb->flags & QED_AIOCB_ZERO) {
ret = qed_aio_write_l2_update(acb, 1);
} else {
ret = qed_aio_write_cow(acb);
}
if (ret < 0) {
qed_aio_complete(acb, ret);
return;
}
qed_aio_next_io(acb, 0);
}
/**