|
@@ -646,14 +646,11 @@ static int mirror_exit_common(Job *job)
|
|
bdrv_ref(mirror_top_bs);
|
|
bdrv_ref(mirror_top_bs);
|
|
bdrv_ref(target_bs);
|
|
bdrv_ref(target_bs);
|
|
|
|
|
|
- /* Remove target parent that still uses BLK_PERM_WRITE/RESIZE before
|
|
|
|
|
|
+ /*
|
|
|
|
+ * Remove target parent that still uses BLK_PERM_WRITE/RESIZE before
|
|
* inserting target_bs at s->to_replace, where we might not be able to get
|
|
* inserting target_bs at s->to_replace, where we might not be able to get
|
|
* these permissions.
|
|
* these permissions.
|
|
- *
|
|
|
|
- * Note that blk_unref() alone doesn't necessarily drop permissions because
|
|
|
|
- * we might be running nested inside mirror_drain(), which takes an extra
|
|
|
|
- * reference, so use an explicit blk_set_perm() first. */
|
|
|
|
- blk_set_perm(s->target, 0, BLK_PERM_ALL, &error_abort);
|
|
|
|
|
|
+ */
|
|
blk_unref(s->target);
|
|
blk_unref(s->target);
|
|
s->target = NULL;
|
|
s->target = NULL;
|
|
|
|
|
|
@@ -1149,28 +1146,12 @@ static bool mirror_drained_poll(BlockJob *job)
|
|
return !!s->in_flight;
|
|
return !!s->in_flight;
|
|
}
|
|
}
|
|
|
|
|
|
-static void mirror_drain(BlockJob *job)
|
|
|
|
-{
|
|
|
|
- MirrorBlockJob *s = container_of(job, MirrorBlockJob, common);
|
|
|
|
-
|
|
|
|
- /* Need to keep a reference in case blk_drain triggers execution
|
|
|
|
- * of mirror_complete...
|
|
|
|
- */
|
|
|
|
- if (s->target) {
|
|
|
|
- BlockBackend *target = s->target;
|
|
|
|
- blk_ref(target);
|
|
|
|
- blk_drain(target);
|
|
|
|
- blk_unref(target);
|
|
|
|
- }
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
static const BlockJobDriver mirror_job_driver = {
|
|
static const BlockJobDriver mirror_job_driver = {
|
|
.job_driver = {
|
|
.job_driver = {
|
|
.instance_size = sizeof(MirrorBlockJob),
|
|
.instance_size = sizeof(MirrorBlockJob),
|
|
.job_type = JOB_TYPE_MIRROR,
|
|
.job_type = JOB_TYPE_MIRROR,
|
|
.free = block_job_free,
|
|
.free = block_job_free,
|
|
.user_resume = block_job_user_resume,
|
|
.user_resume = block_job_user_resume,
|
|
- .drain = block_job_drain,
|
|
|
|
.run = mirror_run,
|
|
.run = mirror_run,
|
|
.prepare = mirror_prepare,
|
|
.prepare = mirror_prepare,
|
|
.abort = mirror_abort,
|
|
.abort = mirror_abort,
|
|
@@ -1178,7 +1159,6 @@ static const BlockJobDriver mirror_job_driver = {
|
|
.complete = mirror_complete,
|
|
.complete = mirror_complete,
|
|
},
|
|
},
|
|
.drained_poll = mirror_drained_poll,
|
|
.drained_poll = mirror_drained_poll,
|
|
- .drain = mirror_drain,
|
|
|
|
};
|
|
};
|
|
|
|
|
|
static const BlockJobDriver commit_active_job_driver = {
|
|
static const BlockJobDriver commit_active_job_driver = {
|
|
@@ -1187,7 +1167,6 @@ static const BlockJobDriver commit_active_job_driver = {
|
|
.job_type = JOB_TYPE_COMMIT,
|
|
.job_type = JOB_TYPE_COMMIT,
|
|
.free = block_job_free,
|
|
.free = block_job_free,
|
|
.user_resume = block_job_user_resume,
|
|
.user_resume = block_job_user_resume,
|
|
- .drain = block_job_drain,
|
|
|
|
.run = mirror_run,
|
|
.run = mirror_run,
|
|
.prepare = mirror_prepare,
|
|
.prepare = mirror_prepare,
|
|
.abort = mirror_abort,
|
|
.abort = mirror_abort,
|
|
@@ -1195,7 +1174,6 @@ static const BlockJobDriver commit_active_job_driver = {
|
|
.complete = mirror_complete,
|
|
.complete = mirror_complete,
|
|
},
|
|
},
|
|
.drained_poll = mirror_drained_poll,
|
|
.drained_poll = mirror_drained_poll,
|
|
- .drain = mirror_drain,
|
|
|
|
};
|
|
};
|
|
|
|
|
|
static void coroutine_fn
|
|
static void coroutine_fn
|