[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH v2 15/20] backup: Switch block_backup.h to byte-base
From: |
Eric Blake |
Subject: |
[Qemu-devel] [PATCH v2 15/20] backup: Switch block_backup.h to byte-based |
Date: |
Wed, 10 May 2017 21:20:31 -0500 |
We are gradually converting to byte-based interfaces, as they are
easier to reason about than sector-based. Continue by converting
the public interface to backup jobs (no semantic change), including
a change to CowRequest to track by bytes instead of cluster indices.
Note that this does not change the difference between the public
interface (starting point, and size of the subsequent range) and
the internal interface (starting and end points).
Signed-off-by: Eric Blake <address@hidden>
---
v2: change a couple more parameter names
---
include/block/block_backup.h | 11 +++++------
block/backup.c | 33 ++++++++++++++++-----------------
block/replication.c | 12 ++++++++----
3 files changed, 29 insertions(+), 27 deletions(-)
diff --git a/include/block/block_backup.h b/include/block/block_backup.h
index 8a75947..994a3bd 100644
--- a/include/block/block_backup.h
+++ b/include/block/block_backup.h
@@ -21,17 +21,16 @@
#include "block/block_int.h"
typedef struct CowRequest {
- int64_t start;
- int64_t end;
+ int64_t start_byte;
+ int64_t end_byte;
QLIST_ENTRY(CowRequest) list;
CoQueue wait_queue; /* coroutines blocked on this request */
} CowRequest;
-void backup_wait_for_overlapping_requests(BlockJob *job, int64_t sector_num,
- int nb_sectors);
+void backup_wait_for_overlapping_requests(BlockJob *job, int64_t offset,
+ uint64_t bytes);
void backup_cow_request_begin(CowRequest *req, BlockJob *job,
- int64_t sector_num,
- int nb_sectors);
+ int64_t offset, uint64_t bytes);
void backup_cow_request_end(CowRequest *req);
void backup_do_checkpoint(BlockJob *job, Error **errp);
diff --git a/block/backup.c b/block/backup.c
index a64a162..568d454 100644
--- a/block/backup.c
+++ b/block/backup.c
@@ -55,7 +55,7 @@ static inline int64_t cluster_size_sectors(BackupBlockJob
*job)
/* See if in-flight requests overlap and wait for them to complete */
static void coroutine_fn wait_for_overlapping_requests(BackupBlockJob *job,
- int64_t start,
+ int64_t offset,
int64_t end)
{
CowRequest *req;
@@ -64,7 +64,7 @@ static void coroutine_fn
wait_for_overlapping_requests(BackupBlockJob *job,
do {
retry = false;
QLIST_FOREACH(req, &job->inflight_reqs, list) {
- if (end > req->start && start < req->end) {
+ if (end > req->start_byte && offset < req->end_byte) {
qemu_co_queue_wait(&req->wait_queue, NULL);
retry = true;
break;
@@ -75,10 +75,10 @@ static void coroutine_fn
wait_for_overlapping_requests(BackupBlockJob *job,
/* Keep track of an in-flight request */
static void cow_request_begin(CowRequest *req, BackupBlockJob *job,
- int64_t start, int64_t end)
+ int64_t offset, int64_t end)
{
- req->start = start;
- req->end = end;
+ req->start_byte = offset;
+ req->end_byte = end;
qemu_co_queue_init(&req->wait_queue);
QLIST_INSERT_HEAD(&job->inflight_reqs, req, list);
}
@@ -114,8 +114,10 @@ static int coroutine_fn backup_do_cow(BackupBlockJob *job,
sector_num * BDRV_SECTOR_SIZE,
nb_sectors * BDRV_SECTOR_SIZE);
- wait_for_overlapping_requests(job, start, end);
- cow_request_begin(&cow_request, job, start, end);
+ wait_for_overlapping_requests(job, start * job->cluster_size,
+ end * job->cluster_size);
+ cow_request_begin(&cow_request, job, start * job->cluster_size,
+ end * job->cluster_size);
for (; start < end; start++) {
if (test_bit(start, job->done_bitmap)) {
@@ -277,32 +279,29 @@ void backup_do_checkpoint(BlockJob *job, Error **errp)
bitmap_zero(backup_job->done_bitmap, len);
}
-void backup_wait_for_overlapping_requests(BlockJob *job, int64_t sector_num,
- int nb_sectors)
+void backup_wait_for_overlapping_requests(BlockJob *job, int64_t offset,
+ uint64_t bytes)
{
BackupBlockJob *backup_job = container_of(job, BackupBlockJob, common);
- int64_t sectors_per_cluster = cluster_size_sectors(backup_job);
int64_t start, end;
assert(job->driver->job_type == BLOCK_JOB_TYPE_BACKUP);
- start = sector_num / sectors_per_cluster;
- end = DIV_ROUND_UP(sector_num + nb_sectors, sectors_per_cluster);
+ start = QEMU_ALIGN_DOWN(offset, backup_job->cluster_size);
+ end = QEMU_ALIGN_UP(offset + bytes, backup_job->cluster_size);
wait_for_overlapping_requests(backup_job, start, end);
}
void backup_cow_request_begin(CowRequest *req, BlockJob *job,
- int64_t sector_num,
- int nb_sectors)
+ int64_t offset, uint64_t bytes)
{
BackupBlockJob *backup_job = container_of(job, BackupBlockJob, common);
- int64_t sectors_per_cluster = cluster_size_sectors(backup_job);
int64_t start, end;
assert(job->driver->job_type == BLOCK_JOB_TYPE_BACKUP);
- start = sector_num / sectors_per_cluster;
- end = DIV_ROUND_UP(sector_num + nb_sectors, sectors_per_cluster);
+ start = QEMU_ALIGN_DOWN(offset, backup_job->cluster_size);
+ end = QEMU_ALIGN_UP(offset + bytes, backup_job->cluster_size);
cow_request_begin(req, backup_job, start, end);
}
diff --git a/block/replication.c b/block/replication.c
index d300c15..137a7fc 100644
--- a/block/replication.c
+++ b/block/replication.c
@@ -234,10 +234,14 @@ static coroutine_fn int
replication_co_readv(BlockDriverState *bs,
}
if (job) {
- backup_wait_for_overlapping_requests(child->bs->job, sector_num,
- remaining_sectors);
- backup_cow_request_begin(&req, child->bs->job, sector_num,
- remaining_sectors);
+ uint64_t remaining_bytes = remaining_sectors * BDRV_SECTOR_SIZE;
+
+ backup_wait_for_overlapping_requests(child->bs->job,
+ sector_num * BDRV_SECTOR_SIZE,
+ remaining_bytes);
+ backup_cow_request_begin(&req, child->bs->job,
+ sector_num * BDRV_SECTOR_SIZE,
+ remaining_bytes);
ret = bdrv_co_readv(bs->file, sector_num, remaining_sectors,
qiov);
backup_cow_request_end(&req);
--
2.9.3
- [Qemu-devel] [PATCH v2 05/20] commit: Switch commit_populate() to byte-based, (continued)
- [Qemu-devel] [PATCH v2 05/20] commit: Switch commit_populate() to byte-based, Eric Blake, 2017/05/10
- [Qemu-devel] [PATCH v2 06/20] commit: Switch commit_run() to byte-based, Eric Blake, 2017/05/10
- [Qemu-devel] [PATCH v2 07/20] mirror: Switch MirrorBlockJob to byte-based, Eric Blake, 2017/05/10
- [Qemu-devel] [PATCH v2 08/20] mirror: Switch mirror_do_zero_or_discard() to byte-based, Eric Blake, 2017/05/10
- [Qemu-devel] [PATCH v2 09/20] mirror: Update signature of mirror_clip_sectors(), Eric Blake, 2017/05/10
- [Qemu-devel] [PATCH v2 10/20] mirror: Switch mirror_cow_align() to byte-based, Eric Blake, 2017/05/10
- [Qemu-devel] [PATCH v2 11/20] mirror: Switch mirror_do_read() to byte-based, Eric Blake, 2017/05/10
- [Qemu-devel] [PATCH v2 12/20] mirror: Switch mirror_iteration() to byte-based, Eric Blake, 2017/05/10
- [Qemu-devel] [PATCH v2 13/20] block: Drop unused bdrv_round_sectors_to_clusters(), Eric Blake, 2017/05/10
- [Qemu-devel] [PATCH v2 14/20] backup: Switch BackupBlockJob to byte-based, Eric Blake, 2017/05/10
- [Qemu-devel] [PATCH v2 15/20] backup: Switch block_backup.h to byte-based,
Eric Blake <=
- [Qemu-devel] [PATCH v2 16/20] backup: Switch backup_do_cow() to byte-based, Eric Blake, 2017/05/10
- [Qemu-devel] [PATCH v2 17/20] backup: Switch backup_run() to byte-based, Eric Blake, 2017/05/10
- [Qemu-devel] [PATCH v2 19/20] block: Minimize raw use of bds->total_sectors, Eric Blake, 2017/05/10
- [Qemu-devel] [PATCH v2 18/20] block: Make bdrv_is_allocated() byte-based, Eric Blake, 2017/05/10
- [Qemu-devel] [PATCH v2 20/20] block: Make bdrv_is_allocated_above() byte-based, Eric Blake, 2017/05/10