* [PATCH] mirror: stop cancelling in-flight requests on non-force cancel in READY
@ 2021-04-21 7:58 Vladimir Sementsov-Ogievskiy
2021-04-30 10:56 ` Max Reitz
0 siblings, 1 reply; 2+ messages in thread
From: Vladimir Sementsov-Ogievskiy @ 2021-04-21 7:58 UTC (permalink / raw)
To: qemu-block
Cc: qemu-devel, mreitz, kwolf, vsementsov, jsnow, den, nshirokovskiy
If mirror is READY than cancel operation is not discarding the whole
result of the operation, but instead it's a documented way get a
point-in-time snapshot of source disk.
So, we should not cancel any requests if mirror is READ and
force=false. Let's fix that case.
Note, that bug that we have before this commit is not critical, as the
only .bdrv_cancel_in_flight implementation is nbd_cancel_in_flight()
and it cancels only requests waiting for reconnection, so it should be
rare case.
Fixes: 521ff8b779b11c394dbdc43f02e158dd99df308a
Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
---
include/block/block_int.h | 2 +-
include/qemu/job.h | 2 +-
block/backup.c | 2 +-
block/mirror.c | 6 ++++--
job.c | 2 +-
tests/qemu-iotests/264 | 2 +-
6 files changed, 9 insertions(+), 7 deletions(-)
diff --git a/include/block/block_int.h b/include/block/block_int.h
index 88e4111939..584381fdb0 100644
--- a/include/block/block_int.h
+++ b/include/block/block_int.h
@@ -357,7 +357,7 @@ struct BlockDriver {
* of in-flight requests, so don't waste the time if possible.
*
* One example usage is to avoid waiting for an nbd target node reconnect
- * timeout during job-cancel.
+ * timeout during job-cancel with force=true.
*/
void (*bdrv_cancel_in_flight)(BlockDriverState *bs);
diff --git a/include/qemu/job.h b/include/qemu/job.h
index efc6fa7544..41162ed494 100644
--- a/include/qemu/job.h
+++ b/include/qemu/job.h
@@ -254,7 +254,7 @@ struct JobDriver {
/**
* If the callback is not NULL, it will be invoked in job_cancel_async
*/
- void (*cancel)(Job *job);
+ void (*cancel)(Job *job, bool force);
/** Called when the job is freed */
diff --git a/block/backup.c b/block/backup.c
index 6cf2f974aa..bd3614ce70 100644
--- a/block/backup.c
+++ b/block/backup.c
@@ -331,7 +331,7 @@ static void coroutine_fn backup_set_speed(BlockJob *job, int64_t speed)
}
}
-static void backup_cancel(Job *job)
+static void backup_cancel(Job *job, bool force)
{
BackupBlockJob *s = container_of(job, BackupBlockJob, common.job);
diff --git a/block/mirror.c b/block/mirror.c
index 5a71bd8bbc..fcd1b56991 100644
--- a/block/mirror.c
+++ b/block/mirror.c
@@ -1178,12 +1178,14 @@ static bool mirror_drained_poll(BlockJob *job)
return !!s->in_flight;
}
-static void mirror_cancel(Job *job)
+static void mirror_cancel(Job *job, bool force)
{
MirrorBlockJob *s = container_of(job, MirrorBlockJob, common.job);
BlockDriverState *target = blk_bs(s->target);
- bdrv_cancel_in_flight(target);
+ if (force || !job_is_ready(job)) {
+ bdrv_cancel_in_flight(target);
+ }
}
static const BlockJobDriver mirror_job_driver = {
diff --git a/job.c b/job.c
index 4aff13d95a..8775c1803b 100644
--- a/job.c
+++ b/job.c
@@ -716,7 +716,7 @@ static int job_finalize_single(Job *job)
static void job_cancel_async(Job *job, bool force)
{
if (job->driver->cancel) {
- job->driver->cancel(job);
+ job->driver->cancel(job, force);
}
if (job->user_paused) {
/* Do not call job_enter here, the caller will handle it. */
diff --git a/tests/qemu-iotests/264 b/tests/qemu-iotests/264
index 4f96825a22..bc431d1a19 100755
--- a/tests/qemu-iotests/264
+++ b/tests/qemu-iotests/264
@@ -95,7 +95,7 @@ class TestNbdReconnect(iotests.QMPTestCase):
self.assert_qmp(result, 'return', {})
def cancel_job(self):
- result = self.vm.qmp('block-job-cancel', device='drive0')
+ result = self.vm.qmp('block-job-cancel', device='drive0', force=True)
self.assert_qmp(result, 'return', {})
start_t = time.time()
--
2.29.2
^ permalink raw reply related [flat|nested] 2+ messages in thread
* Re: [PATCH] mirror: stop cancelling in-flight requests on non-force cancel in READY
2021-04-21 7:58 [PATCH] mirror: stop cancelling in-flight requests on non-force cancel in READY Vladimir Sementsov-Ogievskiy
@ 2021-04-30 10:56 ` Max Reitz
0 siblings, 0 replies; 2+ messages in thread
From: Max Reitz @ 2021-04-30 10:56 UTC (permalink / raw)
To: Vladimir Sementsov-Ogievskiy, qemu-block
Cc: kwolf, den, jsnow, qemu-devel, nshirokovskiy
On 21.04.21 09:58, Vladimir Sementsov-Ogievskiy wrote:
> If mirror is READY than cancel operation is not discarding the whole
> result of the operation, but instead it's a documented way get a
> point-in-time snapshot of source disk.
>
> So, we should not cancel any requests if mirror is READ and
> force=false. Let's fix that case.
>
> Note, that bug that we have before this commit is not critical, as the
> only .bdrv_cancel_in_flight implementation is nbd_cancel_in_flight()
> and it cancels only requests waiting for reconnection, so it should be
> rare case.
>
> Fixes: 521ff8b779b11c394dbdc43f02e158dd99df308a
> Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
> ---
> include/block/block_int.h | 2 +-
> include/qemu/job.h | 2 +-
> block/backup.c | 2 +-
> block/mirror.c | 6 ++++--
> job.c | 2 +-
> tests/qemu-iotests/264 | 2 +-
> 6 files changed, 9 insertions(+), 7 deletions(-)
Thanks, applied to my block branch:
https://github.com/XanClic/qemu/commits/block
Max
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2021-04-30 12:03 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-04-21 7:58 [PATCH] mirror: stop cancelling in-flight requests on non-force cancel in READY Vladimir Sementsov-Ogievskiy
2021-04-30 10:56 ` Max Reitz
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.