[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [RFC v3 07/14] blockjobs: ensure abort is called for cancel
From: |
John Snow |
Subject: |
[Qemu-devel] [RFC v3 07/14] blockjobs: ensure abort is called for cancelled jobs |
Date: |
Fri, 26 Jan 2018 21:05:08 -0500 |
Presently, even if a job is canceled post-completion as a result of
a failing peer in a transaction, it will still call .commit because
nothing has updated or changed its return code.
The reason why this does not cause problems currently is because
backup's implementation of .commit checks for cancellation itself.
I'd like to simplify this contract:
(1) Abort is called if the job/transaction fails
(2) Commit is called if the job/transaction succeeds
To this end: A job's return code, if 0, will be forcibly set as
-ECANCELED if that job has already concluded. Remove the now
redundant check in the backup job implementation.
This does NOT affect mirror jobs that are "canceled" during their
synchronous phase. The mirror job itself forcibly sets the canceled
property to false prior to ceding control, so such cases will invoke
the "commit" callback.
Signed-off-by: John Snow <address@hidden>
---
block/backup.c | 2 +-
blockjob.c | 5 +++++
2 files changed, 6 insertions(+), 1 deletion(-)
diff --git a/block/backup.c b/block/backup.c
index d729263708..a17248feab 100644
--- a/block/backup.c
+++ b/block/backup.c
@@ -206,7 +206,7 @@ static void backup_cleanup_sync_bitmap(BackupBlockJob *job,
int ret)
BdrvDirtyBitmap *bm;
BlockDriverState *bs = blk_bs(job->common.blk);
- if (ret < 0 || block_job_is_cancelled(&job->common)) {
+ if (ret < 0) {
/* Merge the successor back into the parent, delete nothing. */
bm = bdrv_reclaim_dirty_bitmap(bs, job->sync_bitmap, NULL);
assert(bm);
diff --git a/blockjob.c b/blockjob.c
index 0083fd7b0c..3d678d6ce2 100644
--- a/blockjob.c
+++ b/blockjob.c
@@ -380,6 +380,11 @@ static void block_job_completed_single(BlockJob *job)
{
assert(job->completed);
+ /* Ensure abort is called and QMP client is notified of cancellation */
+ if (job->ret == 0 && block_job_is_cancelled(job)) {
+ job->ret = -ECANCELED;
+ }
+
if (!job->ret) {
if (job->driver->commit) {
job->driver->commit(job);
--
2.14.3
- Re: [Qemu-devel] [RFC v3 02/14] blockjobs: Add status enum, (continued)
[Qemu-devel] [RFC v3 05/14] blockjobs: add block_job_dismiss, John Snow, 2018/01/26
[Qemu-devel] [RFC v3 06/14] blockjobs: add CONCLUDED state, John Snow, 2018/01/26
[Qemu-devel] [RFC v3 07/14] blockjobs: ensure abort is called for cancelled jobs,
John Snow <=
[Qemu-devel] [RFC v3 08/14] blockjobs: add commit, abort, clean helpers, John Snow, 2018/01/26
[Qemu-devel] [RFC v3 13/14] blockjobs: Expose manual property, John Snow, 2018/01/26
[Qemu-devel] [RFC v3 09/14] blockjobs: add prepare callback, John Snow, 2018/01/26
[Qemu-devel] [RFC v3 12/14] blockjobs: add block-job-finalize, John Snow, 2018/01/26
[Qemu-devel] [RFC v3 11/14] blockjobs: add PENDING status and event, John Snow, 2018/01/26
[Qemu-devel] [RFC v3 10/14] blockjobs: Add waiting event, John Snow, 2018/01/26
[Qemu-devel] [RFC v3 14/14] iotests: test manual job dismissal, John Snow, 2018/01/26
Re: [Qemu-devel] [RFC v3 00/14] blockjobs: add explicit job management, no-reply, 2018/01/28
Re: [Qemu-devel] [RFC v3 00/14] blockjobs: add explicit job management, John Snow, 2018/01/31