Skip to content

Commit

Permalink
block: Block all nodes involved in the block-commit operation
Browse files Browse the repository at this point in the history
After a successful block-commit operation all nodes between top and
base are removed from the backing chain, and top's overlay needs to
be updated to point to base. Because of that we should prevent other
block jobs from messing with them.

This patch blocks all operations in these nodes in commit_start().

Signed-off-by: Alberto Garcia <berto@igalia.com>
Reviewed-by: Kevin Wolf <kwolf@redhat.com>
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
  • Loading branch information
bertogg authored and kevmw committed Oct 31, 2016
1 parent 058223a commit 3e4c512
Showing 1 changed file with 14 additions and 0 deletions.
14 changes: 14 additions & 0 deletions block/commit.c
Expand Up @@ -216,6 +216,7 @@ void commit_start(const char *job_id, BlockDriverState *bs,
BlockReopenQueue *reopen_queue = NULL;
int orig_overlay_flags;
int orig_base_flags;
BlockDriverState *iter;
BlockDriverState *overlay_bs;
Error *local_err = NULL;

Expand Down Expand Up @@ -260,6 +261,19 @@ void commit_start(const char *job_id, BlockDriverState *bs,
}


/* Block all nodes between top and base, because they will
* disappear from the chain after this operation. */
assert(bdrv_chain_contains(top, base));
for (iter = top; iter != backing_bs(base); iter = backing_bs(iter)) {
block_job_add_bdrv(&s->common, iter);
}
/* overlay_bs must be blocked because it needs to be modified to
* update the backing image string, but if it's the root node then
* don't block it again */
if (bs != overlay_bs) {
block_job_add_bdrv(&s->common, overlay_bs);
}

s->base = blk_new();
blk_insert_bs(s->base, base);

Expand Down

0 comments on commit 3e4c512

Please sign in to comment.