qed: Remove callback from qed_copy_from_backing_file()
With this change, qed_aio_write_prefill() and qed_aio_write_postfill() collapse into a single function. This is reflected by a rename of the combined function to qed_aio_write_cow(). Signed-off-by: Kevin Wolf <kwolf@redhat.com> Reviewed-by: Eric Blake <eblake@redhat.com> Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
This commit is contained in:
parent
0f7aa24d2c
commit
b4ac32f34f
57
block/qed.c
57
block/qed.c
|
@ -861,13 +861,9 @@ static int qed_read_backing_file(BDRVQEDState *s, uint64_t pos,
|
||||||
* @pos: Byte position in device
|
* @pos: Byte position in device
|
||||||
* @len: Number of bytes
|
* @len: Number of bytes
|
||||||
* @offset: Byte offset in image file
|
* @offset: Byte offset in image file
|
||||||
* @cb: Completion function
|
|
||||||
* @opaque: User data for completion function
|
|
||||||
*/
|
*/
|
||||||
static void qed_copy_from_backing_file(BDRVQEDState *s, uint64_t pos,
|
static int qed_copy_from_backing_file(BDRVQEDState *s, uint64_t pos,
|
||||||
uint64_t len, uint64_t offset,
|
uint64_t len, uint64_t offset)
|
||||||
BlockCompletionFunc *cb,
|
|
||||||
void *opaque)
|
|
||||||
{
|
{
|
||||||
QEMUIOVector qiov;
|
QEMUIOVector qiov;
|
||||||
QEMUIOVector *backing_qiov = NULL;
|
QEMUIOVector *backing_qiov = NULL;
|
||||||
|
@ -876,8 +872,7 @@ static void qed_copy_from_backing_file(BDRVQEDState *s, uint64_t pos,
|
||||||
|
|
||||||
/* Skip copy entirely if there is no work to do */
|
/* Skip copy entirely if there is no work to do */
|
||||||
if (len == 0) {
|
if (len == 0) {
|
||||||
cb(opaque, 0);
|
return 0;
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
iov = (struct iovec) {
|
iov = (struct iovec) {
|
||||||
|
@ -906,7 +901,7 @@ static void qed_copy_from_backing_file(BDRVQEDState *s, uint64_t pos,
|
||||||
ret = 0;
|
ret = 0;
|
||||||
out:
|
out:
|
||||||
qemu_vfree(iov.iov_base);
|
qemu_vfree(iov.iov_base);
|
||||||
cb(opaque, ret);
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -1133,42 +1128,36 @@ static void qed_aio_write_main(void *opaque, int ret)
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Populate back untouched region of new data cluster
|
* Populate untouched regions of new data cluster
|
||||||
*/
|
*/
|
||||||
static void qed_aio_write_postfill(void *opaque, int ret)
|
static void qed_aio_write_cow(void *opaque, int ret)
|
||||||
{
|
{
|
||||||
QEDAIOCB *acb = opaque;
|
QEDAIOCB *acb = opaque;
|
||||||
BDRVQEDState *s = acb_to_s(acb);
|
BDRVQEDState *s = acb_to_s(acb);
|
||||||
uint64_t start = acb->cur_pos + acb->cur_qiov.size;
|
uint64_t start, len, offset;
|
||||||
uint64_t len =
|
|
||||||
qed_start_of_cluster(s, start + s->header.cluster_size - 1) - start;
|
|
||||||
uint64_t offset = acb->cur_cluster +
|
|
||||||
qed_offset_into_cluster(s, acb->cur_pos) +
|
|
||||||
acb->cur_qiov.size;
|
|
||||||
|
|
||||||
|
/* Populate front untouched region of new data cluster */
|
||||||
|
start = qed_start_of_cluster(s, acb->cur_pos);
|
||||||
|
len = qed_offset_into_cluster(s, acb->cur_pos);
|
||||||
|
|
||||||
|
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) {
|
if (ret) {
|
||||||
qed_aio_complete(acb, ret);
|
qed_aio_complete(acb, ret);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Populate back untouched region of new data cluster */
|
||||||
|
start = acb->cur_pos + acb->cur_qiov.size;
|
||||||
|
len = qed_start_of_cluster(s, start + s->header.cluster_size - 1) - start;
|
||||||
|
offset = acb->cur_cluster +
|
||||||
|
qed_offset_into_cluster(s, acb->cur_pos) +
|
||||||
|
acb->cur_qiov.size;
|
||||||
|
|
||||||
trace_qed_aio_write_postfill(s, acb, start, len, offset);
|
trace_qed_aio_write_postfill(s, acb, start, len, offset);
|
||||||
qed_copy_from_backing_file(s, start, len, offset,
|
ret = qed_copy_from_backing_file(s, start, len, offset);
|
||||||
qed_aio_write_main, acb);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
qed_aio_write_main(acb, ret);
|
||||||
* Populate front untouched region of new data cluster
|
|
||||||
*/
|
|
||||||
static void qed_aio_write_prefill(void *opaque, int ret)
|
|
||||||
{
|
|
||||||
QEDAIOCB *acb = opaque;
|
|
||||||
BDRVQEDState *s = acb_to_s(acb);
|
|
||||||
uint64_t start = qed_start_of_cluster(s, acb->cur_pos);
|
|
||||||
uint64_t len = qed_offset_into_cluster(s, acb->cur_pos);
|
|
||||||
|
|
||||||
trace_qed_aio_write_prefill(s, acb, start, len, acb->cur_cluster);
|
|
||||||
qed_copy_from_backing_file(s, start, len, acb->cur_cluster,
|
|
||||||
qed_aio_write_postfill, acb);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -1236,7 +1225,7 @@ static void qed_aio_write_alloc(QEDAIOCB *acb, size_t len)
|
||||||
|
|
||||||
cb = qed_aio_write_zero_cluster;
|
cb = qed_aio_write_zero_cluster;
|
||||||
} else {
|
} else {
|
||||||
cb = qed_aio_write_prefill;
|
cb = qed_aio_write_cow;
|
||||||
acb->cur_cluster = qed_alloc_clusters(s, acb->cur_nclusters);
|
acb->cur_cluster = qed_alloc_clusters(s, acb->cur_nclusters);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue