Skip to content

Commit

Permalink
block-backend: Allow more "can inactivate" cases
Browse files Browse the repository at this point in the history
These two conditions corresponds to mirror job's source and target,
which need to be allowed as they are part of the non-shared storage
migration workflow: failing to inactivate either will result in a
failure during migration completion.

Signed-off-by: Fam Zheng <famz@redhat.com>
Message-Id: <20170823134242.12080-3-famz@redhat.com>
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
[eblake: improve comment grammar]
Signed-off-by: Eric Blake <eblake@redhat.com>
  • Loading branch information
Fam Zheng authored and ebblake committed Aug 23, 2017
1 parent c16de8f commit ca2e214
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 5 deletions.
22 changes: 17 additions & 5 deletions block/block-backend.c
Expand Up @@ -70,6 +70,7 @@ struct BlockBackend {

int quiesce_counter;
VMChangeStateEntry *vmsh;
bool force_allow_inactivate;
};

typedef struct BlockBackendAIOCB {
Expand Down Expand Up @@ -192,17 +193,28 @@ static void blk_root_activate(BdrvChild *child, Error **errp)
}
}

void blk_set_force_allow_inactivate(BlockBackend *blk)
{
blk->force_allow_inactivate = true;
}

static bool blk_can_inactivate(BlockBackend *blk)
{
/* Only inactivate BlockBackends for guest devices (which are inactive at
* this point because the VM is stopped) and unattached monitor-owned
* BlockBackends. If there is still any other user like a block job, then
* we simply can't inactivate the image. */
/* If it is a guest device, inactivate is ok. */
if (blk->dev || blk_name(blk)[0]) {
return true;
}

return false;
/* Inactivating means no more writes to the image can be done,
* even if those writes would be changes invisible to the
* guest. For block job BBs that satisfy this, we can just allow
* it. This is the case for mirror job source, which is required
* by libvirt non-shared block migration. */
if (!(blk->perm & (BLK_PERM_WRITE | BLK_PERM_WRITE_UNCHANGED))) {
return true;
}

return blk->force_allow_inactivate;
}

static int blk_root_inactivate(BdrvChild *child)
Expand Down
1 change: 1 addition & 0 deletions include/sysemu/block-backend.h
Expand Up @@ -241,5 +241,6 @@ void blk_set_io_limits(BlockBackend *blk, ThrottleConfig *cfg);
void blk_io_limits_disable(BlockBackend *blk);
void blk_io_limits_enable(BlockBackend *blk, const char *group);
void blk_io_limits_update_group(BlockBackend *blk, const char *group);
void blk_set_force_allow_inactivate(BlockBackend *blk);

#endif

0 comments on commit ca2e214

Please sign in to comment.