summaryrefslogtreecommitdiffstats
path: root/job.c
diff options
context:
space:
mode:
authorHanna Reitz2021-10-06 17:19:33 +0200
committerVladimir Sementsov-Ogievskiy2021-10-07 10:42:34 +0200
commit73895f3838cd7fdaf185cf1dbc47be58844a966f (patch)
treeffc814f4d4452dcaf8097ae23e3d73a7e5b570e7 /job.c
parentjob: @force parameter for job_cancel_sync() (diff)
downloadqemu-73895f3838cd7fdaf185cf1dbc47be58844a966f.tar.gz
qemu-73895f3838cd7fdaf185cf1dbc47be58844a966f.tar.xz
qemu-73895f3838cd7fdaf185cf1dbc47be58844a966f.zip
jobs: Give Job.force_cancel more meaning
We largely have two cancel modes for jobs: First, there is actual cancelling. The job is terminated as soon as possible, without trying to reach a consistent result. Second, we have mirror in the READY state. Technically, the job is not really cancelled, but it just is a different completion mode. The job can still run for an indefinite amount of time while it tries to reach a consistent result. We want to be able to clearly distinguish which cancel mode a job is in (when it has been cancelled). We can use Job.force_cancel for this, but right now it only reflects cancel requests from the user with force=true, but clearly, jobs that do not even distinguish between force=false and force=true are effectively always force-cancelled. So this patch has Job.force_cancel signify whether the job will terminate as soon as possible (force_cancel=true) or whether it will effectively remain running despite being "cancelled" (force_cancel=false). To this end, we let jobs that provide JobDriver.cancel() tell the generic job code whether they will terminate as soon as possible or not, and for jobs that do not provide that method we assume they will. Signed-off-by: Hanna Reitz <hreitz@redhat.com> Reviewed-by: Eric Blake <eblake@redhat.com> Reviewed-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com> Reviewed-by: Kevin Wolf <kwolf@redhat.com> Message-Id: <20211006151940.214590-7-hreitz@redhat.com> Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
Diffstat (limited to 'job.c')
-rw-r--r--job.c6
1 files changed, 5 insertions, 1 deletions
diff --git a/job.c b/job.c
index dfac35d553..81c016eb10 100644
--- a/job.c
+++ b/job.c
@@ -719,8 +719,12 @@ static int job_finalize_single(Job *job)
static void job_cancel_async(Job *job, bool force)
{
if (job->driver->cancel) {
- job->driver->cancel(job, force);
+ force = job->driver->cancel(job, force);
+ } else {
+ /* No .cancel() means the job will behave as if force-cancelled */
+ force = true;
}
+
if (job->user_paused) {
/* Do not call job_enter here, the caller will handle it. */
if (job->driver->user_resume) {