]> git.proxmox.com Git - mirror_qemu.git/commit
blockjob: add .clean property
authorJohn Snow <jsnow@redhat.com>
Tue, 8 Nov 2016 06:50:35 +0000 (01:50 -0500)
committerJeff Cody <jcody@redhat.com>
Tue, 15 Nov 2016 03:47:34 +0000 (22:47 -0500)
commite8a40bf71d606f9f87866fb2461eaed52814b38e
tree4474066f2b85abd51936afb6e2bde28d3866a8ee
parent1e93b9fba2e0e23105e91574fcfc193f899d8e74
blockjob: add .clean property

Cleaning up after we have deferred to the main thread but before the
transaction has converged can be dangerous and result in deadlocks
if the job cleanup invokes any BH polling loops.

A job may attempt to begin cleaning up, but may induce another job to
enter its cleanup routine. The second job, part of our same transaction,
will block waiting for the first job to finish, so neither job may now
make progress.

To rectify this, allow jobs to register a cleanup operation that will
always run regardless of if the job was in a transaction or not, and
if the transaction job group completed successfully or not.

Move sensitive cleanup to this callback instead which is guaranteed to
be run only after the transaction has converged, which removes sensitive
timing constraints from said cleanup.

Furthermore, in future patches these cleanup operations will be performed
regardless of whether or not we actually started the job. Therefore,
cleanup callbacks should essentially confine themselves to undoing create
operations, e.g. setup actions taken in what is now backup_start.

Reported-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
Signed-off-by: John Snow <jsnow@redhat.com>
Reviewed-by: Kevin Wolf <kwolf@redhat.com>
Message-id: 1478587839-9834-3-git-send-email-jsnow@redhat.com
Signed-off-by: Jeff Cody <jcody@redhat.com>
block/backup.c
blockjob.c
include/block/blockjob_int.h