summaryrefslogtreecommitdiffstats
path: root/block/commit.c
diff options
context:
space:
mode:
authorPeter Maydell2018-05-15 18:02:00 +0200
committerPeter Maydell2018-05-15 18:02:00 +0200
commitc416eecea5f3aea863ab8fda5a36a24157b8f704 (patch)
treebb6df4bd5fc8bb53fef545fe8ca328ce540e4f29 /block/commit.c
parentMerge remote-tracking branch 'remotes/pmaydell/tags/pull-target-arm-20180515'... (diff)
parentMerge remote-tracking branch 'mreitz/tags/pull-block-2018-05-15' into queue-b... (diff)
downloadqemu-c416eecea5f3aea863ab8fda5a36a24157b8f704.tar.gz
qemu-c416eecea5f3aea863ab8fda5a36a24157b8f704.tar.xz
qemu-c416eecea5f3aea863ab8fda5a36a24157b8f704.zip
Merge remote-tracking branch 'remotes/kevin/tags/for-upstream' into staging
Block layer patches: - Switch AIO/callback based block drivers to a byte-based interface - Block jobs: Expose error string via query-block-jobs - Block job cleanups and fixes - hmp: Allow using a qdev id in block_set_io_throttle # gpg: Signature made Tue 15 May 2018 16:33:10 BST # gpg: using RSA key 7F09B272C88F2FD6 # gpg: Good signature from "Kevin Wolf <kwolf@redhat.com>" # Primary key fingerprint: DC3D EB15 9A9A F95D 3D74 56FE 7F09 B272 C88F 2FD6 * remotes/kevin/tags/for-upstream: (37 commits) iotests: Add test for -U/force-share conflicts qemu-img: Use only string options in img_open_opts qemu-io: Use purely string blockdev options block: Document BDRV_REQ_WRITE_UNCHANGED support qemu-img: Check post-truncation size iotests: Add test for COR across nodes iotests: Copy 197 for COR filter driver iotests: Clean up wrap image in 197 block: Support BDRV_REQ_WRITE_UNCHANGED in filters block/quorum: Support BDRV_REQ_WRITE_UNCHANGED block: Set BDRV_REQ_WRITE_UNCHANGED for COR writes block: Add BDRV_REQ_WRITE_UNCHANGED flag block: BLK_PERM_WRITE includes ..._UNCHANGED block: Add COR filter driver iotests: Skip 181 and 201 without userfaultfd iotests: Add failure matching to common.qemu docs: Document the new default sizes of the qcow2 caches qcow2: Give the refcount cache the minimum possible size by default specs/qcow2: Clarify that compressed clusters have the COPIED bit reset Fix error message about compressed clusters with OFLAG_COPIED ... Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
Diffstat (limited to 'block/commit.c')
-rw-r--r--block/commit.c35
1 files changed, 10 insertions, 25 deletions
diff --git a/block/commit.c b/block/commit.c
index 1432baeef4..ba5df6aa0a 100644
--- a/block/commit.c
+++ b/block/commit.c
@@ -31,11 +31,8 @@ enum {
COMMIT_BUFFER_SIZE = 512 * 1024, /* in bytes */
};
-#define SLICE_TIME 100000000ULL /* ns */
-
typedef struct CommitBlockJob {
BlockJob common;
- RateLimit limit;
BlockDriverState *commit_top_bs;
BlockBackend *top;
BlockBackend *base;
@@ -146,21 +143,21 @@ static void coroutine_fn commit_run(void *opaque)
int64_t n = 0; /* bytes */
void *buf = NULL;
int bytes_written = 0;
- int64_t base_len;
-
- ret = s->common.len = blk_getlength(s->top);
+ int64_t len, base_len;
- if (s->common.len < 0) {
+ ret = len = blk_getlength(s->top);
+ if (len < 0) {
goto out;
}
+ block_job_progress_set_remaining(&s->common, len);
ret = base_len = blk_getlength(s->base);
if (base_len < 0) {
goto out;
}
- if (base_len < s->common.len) {
- ret = blk_truncate(s->base, s->common.len, PREALLOC_MODE_OFF, NULL);
+ if (base_len < len) {
+ ret = blk_truncate(s->base, len, PREALLOC_MODE_OFF, NULL);
if (ret) {
goto out;
}
@@ -168,7 +165,7 @@ static void coroutine_fn commit_run(void *opaque)
buf = blk_blockalign(s->top, COMMIT_BUFFER_SIZE);
- for (offset = 0; offset < s->common.len; offset += n) {
+ for (offset = 0; offset < len; offset += n) {
bool copy;
/* Note that even when no rate limit is applied we need to yield
@@ -198,10 +195,10 @@ static void coroutine_fn commit_run(void *opaque)
}
}
/* Publish progress */
- s->common.offset += n;
+ block_job_progress_update(&s->common, n);
- if (copy && s->common.speed) {
- delay_ns = ratelimit_calculate_delay(&s->limit, n);
+ if (copy) {
+ delay_ns = block_job_ratelimit_get_delay(&s->common, n);
} else {
delay_ns = 0;
}
@@ -217,21 +214,9 @@ out:
block_job_defer_to_main_loop(&s->common, commit_complete, data);
}
-static void commit_set_speed(BlockJob *job, int64_t speed, Error **errp)
-{
- CommitBlockJob *s = container_of(job, CommitBlockJob, common);
-
- if (speed < 0) {
- error_setg(errp, QERR_INVALID_PARAMETER, "speed");
- return;
- }
- ratelimit_set_speed(&s->limit, speed, SLICE_TIME);
-}
-
static const BlockJobDriver commit_job_driver = {
.instance_size = sizeof(CommitBlockJob),
.job_type = BLOCK_JOB_TYPE_COMMIT,
- .set_speed = commit_set_speed,
.start = commit_run,
};