blockjob: add devops to blockjob backends
This lets us hook into drained_begin and drained_end requests from the backend level, which is particularly useful for making sure that all jobs associated with a particular node (whether the source or the target) receive a drain request. Suggested-by: Kevin Wolf <kwolf@redhat.com> Signed-off-by: John Snow <jsnow@redhat.com> Reviewed-by: Jeff Cody <jcody@redhat.com> Message-id: 20170316212351.13797-4-jsnow@redhat.com Signed-off-by: Jeff Cody <jcody@redhat.com>
This commit is contained in:
parent
f4d9cc88ee
commit
600ac6a0ef
29
blockjob.c
29
blockjob.c
@ -68,6 +68,23 @@ static const BdrvChildRole child_job = {
|
|||||||
.stay_at_node = true,
|
.stay_at_node = true,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static void block_job_drained_begin(void *opaque)
|
||||||
|
{
|
||||||
|
BlockJob *job = opaque;
|
||||||
|
block_job_pause(job);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void block_job_drained_end(void *opaque)
|
||||||
|
{
|
||||||
|
BlockJob *job = opaque;
|
||||||
|
block_job_resume(job);
|
||||||
|
}
|
||||||
|
|
||||||
|
static const BlockDevOps block_job_dev_ops = {
|
||||||
|
.drained_begin = block_job_drained_begin,
|
||||||
|
.drained_end = block_job_drained_end,
|
||||||
|
};
|
||||||
|
|
||||||
BlockJob *block_job_next(BlockJob *job)
|
BlockJob *block_job_next(BlockJob *job)
|
||||||
{
|
{
|
||||||
if (!job) {
|
if (!job) {
|
||||||
@ -205,11 +222,6 @@ void *block_job_create(const char *job_id, const BlockJobDriver *driver,
|
|||||||
}
|
}
|
||||||
|
|
||||||
job = g_malloc0(driver->instance_size);
|
job = g_malloc0(driver->instance_size);
|
||||||
error_setg(&job->blocker, "block device is in use by block job: %s",
|
|
||||||
BlockJobType_lookup[driver->job_type]);
|
|
||||||
block_job_add_bdrv(job, "main node", bs, 0, BLK_PERM_ALL, &error_abort);
|
|
||||||
bdrv_op_unblock(bs, BLOCK_OP_TYPE_DATAPLANE, job->blocker);
|
|
||||||
|
|
||||||
job->driver = driver;
|
job->driver = driver;
|
||||||
job->id = g_strdup(job_id);
|
job->id = g_strdup(job_id);
|
||||||
job->blk = blk;
|
job->blk = blk;
|
||||||
@ -219,8 +231,15 @@ void *block_job_create(const char *job_id, const BlockJobDriver *driver,
|
|||||||
job->paused = true;
|
job->paused = true;
|
||||||
job->pause_count = 1;
|
job->pause_count = 1;
|
||||||
job->refcnt = 1;
|
job->refcnt = 1;
|
||||||
|
|
||||||
|
error_setg(&job->blocker, "block device is in use by block job: %s",
|
||||||
|
BlockJobType_lookup[driver->job_type]);
|
||||||
|
block_job_add_bdrv(job, "main node", bs, 0, BLK_PERM_ALL, &error_abort);
|
||||||
bs->job = job;
|
bs->job = job;
|
||||||
|
|
||||||
|
blk_set_dev_ops(blk, &block_job_dev_ops, job);
|
||||||
|
bdrv_op_unblock(bs, BLOCK_OP_TYPE_DATAPLANE, job->blocker);
|
||||||
|
|
||||||
QLIST_INSERT_HEAD(&block_jobs, job, job_list);
|
QLIST_INSERT_HEAD(&block_jobs, job, job_list);
|
||||||
|
|
||||||
blk_add_aio_context_notifier(blk, block_job_attached_aio_context,
|
blk_add_aio_context_notifier(blk, block_job_attached_aio_context,
|
||||||
|
Loading…
Reference in New Issue
Block a user