mirror of https://github.com/xemu-project/xemu.git
block/backup-top: drop .active
We don't need this workaround anymore: bdrv_append is already smart
enough and we can use new bdrv_drop_filter().
This commit efficiently reverts also recent 705dde27c6
, which
checked .active on io path. Still it said that the problem should be
theoretical. And the logic of filter removement is changed anyway.
Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
Reviewed-by: Kevin Wolf <kwolf@redhat.com>
Message-Id: <20210428151804.439460-25-vsementsov@virtuozzo.com>
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
This commit is contained in:
parent
3108a15cf0
commit
b75d64b329
|
@ -37,7 +37,6 @@
|
||||||
typedef struct BDRVBackupTopState {
|
typedef struct BDRVBackupTopState {
|
||||||
BlockCopyState *bcs;
|
BlockCopyState *bcs;
|
||||||
BdrvChild *target;
|
BdrvChild *target;
|
||||||
bool active;
|
|
||||||
int64_t cluster_size;
|
int64_t cluster_size;
|
||||||
} BDRVBackupTopState;
|
} BDRVBackupTopState;
|
||||||
|
|
||||||
|
@ -45,12 +44,6 @@ static coroutine_fn int backup_top_co_preadv(
|
||||||
BlockDriverState *bs, uint64_t offset, uint64_t bytes,
|
BlockDriverState *bs, uint64_t offset, uint64_t bytes,
|
||||||
QEMUIOVector *qiov, int flags)
|
QEMUIOVector *qiov, int flags)
|
||||||
{
|
{
|
||||||
BDRVBackupTopState *s = bs->opaque;
|
|
||||||
|
|
||||||
if (!s->active) {
|
|
||||||
return -EIO;
|
|
||||||
}
|
|
||||||
|
|
||||||
return bdrv_co_preadv(bs->backing, offset, bytes, qiov, flags);
|
return bdrv_co_preadv(bs->backing, offset, bytes, qiov, flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -60,10 +53,6 @@ static coroutine_fn int backup_top_cbw(BlockDriverState *bs, uint64_t offset,
|
||||||
BDRVBackupTopState *s = bs->opaque;
|
BDRVBackupTopState *s = bs->opaque;
|
||||||
uint64_t off, end;
|
uint64_t off, end;
|
||||||
|
|
||||||
if (!s->active) {
|
|
||||||
return -EIO;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (flags & BDRV_REQ_WRITE_UNCHANGED) {
|
if (flags & BDRV_REQ_WRITE_UNCHANGED) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -137,21 +126,6 @@ static void backup_top_child_perm(BlockDriverState *bs, BdrvChild *c,
|
||||||
uint64_t perm, uint64_t shared,
|
uint64_t perm, uint64_t shared,
|
||||||
uint64_t *nperm, uint64_t *nshared)
|
uint64_t *nperm, uint64_t *nshared)
|
||||||
{
|
{
|
||||||
BDRVBackupTopState *s = bs->opaque;
|
|
||||||
|
|
||||||
if (!s->active) {
|
|
||||||
/*
|
|
||||||
* The filter node may be in process of bdrv_append(), which firstly do
|
|
||||||
* bdrv_set_backing_hd() and then bdrv_replace_node(). This means that
|
|
||||||
* we can't unshare BLK_PERM_WRITE during bdrv_append() operation. So,
|
|
||||||
* let's require nothing during bdrv_append() and refresh permissions
|
|
||||||
* after it (see bdrv_backup_top_append()).
|
|
||||||
*/
|
|
||||||
*nperm = 0;
|
|
||||||
*nshared = BLK_PERM_ALL;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!(role & BDRV_CHILD_FILTERED)) {
|
if (!(role & BDRV_CHILD_FILTERED)) {
|
||||||
/*
|
/*
|
||||||
* Target child
|
* Target child
|
||||||
|
@ -241,17 +215,6 @@ BlockDriverState *bdrv_backup_top_append(BlockDriverState *source,
|
||||||
}
|
}
|
||||||
appended = true;
|
appended = true;
|
||||||
|
|
||||||
/*
|
|
||||||
* bdrv_append() finished successfully, now we can require permissions
|
|
||||||
* we want.
|
|
||||||
*/
|
|
||||||
state->active = true;
|
|
||||||
ret = bdrv_child_refresh_perms(top, top->backing, errp);
|
|
||||||
if (ret < 0) {
|
|
||||||
error_prepend(errp, "Cannot set permissions for backup-top filter: ");
|
|
||||||
goto fail;
|
|
||||||
}
|
|
||||||
|
|
||||||
state->cluster_size = cluster_size;
|
state->cluster_size = cluster_size;
|
||||||
state->bcs = block_copy_state_new(top->backing, state->target,
|
state->bcs = block_copy_state_new(top->backing, state->target,
|
||||||
cluster_size, perf->use_copy_range,
|
cluster_size, perf->use_copy_range,
|
||||||
|
@ -268,7 +231,6 @@ BlockDriverState *bdrv_backup_top_append(BlockDriverState *source,
|
||||||
|
|
||||||
fail:
|
fail:
|
||||||
if (appended) {
|
if (appended) {
|
||||||
state->active = false;
|
|
||||||
bdrv_backup_top_drop(top);
|
bdrv_backup_top_drop(top);
|
||||||
} else {
|
} else {
|
||||||
bdrv_unref(top);
|
bdrv_unref(top);
|
||||||
|
@ -283,16 +245,9 @@ void bdrv_backup_top_drop(BlockDriverState *bs)
|
||||||
{
|
{
|
||||||
BDRVBackupTopState *s = bs->opaque;
|
BDRVBackupTopState *s = bs->opaque;
|
||||||
|
|
||||||
bdrv_drained_begin(bs);
|
bdrv_drop_filter(bs, &error_abort);
|
||||||
|
|
||||||
block_copy_state_free(s->bcs);
|
block_copy_state_free(s->bcs);
|
||||||
|
|
||||||
s->active = false;
|
|
||||||
bdrv_child_refresh_perms(bs, bs->backing, &error_abort);
|
|
||||||
bdrv_replace_node(bs, bs->backing->bs, &error_abort);
|
|
||||||
bdrv_set_backing_hd(bs, NULL, &error_abort);
|
|
||||||
|
|
||||||
bdrv_drained_end(bs);
|
|
||||||
|
|
||||||
bdrv_unref(bs);
|
bdrv_unref(bs);
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
{"execute": "blockdev-add", "arguments": {"driver": "blkdebug", "image": "base", "node-name": "other", "take-child-perms": ["write"]}}
|
{"execute": "blockdev-add", "arguments": {"driver": "blkdebug", "image": "base", "node-name": "other", "take-child-perms": ["write"]}}
|
||||||
{"return": {}}
|
{"return": {}}
|
||||||
{"execute": "blockdev-backup", "arguments": {"device": "source", "sync": "full", "target": "target"}}
|
{"execute": "blockdev-backup", "arguments": {"device": "source", "sync": "full", "target": "target"}}
|
||||||
{"error": {"class": "GenericError", "desc": "Cannot set permissions for backup-top filter: Conflicts with use by source as 'image', which does not allow 'write' on base"}}
|
{"error": {"class": "GenericError", "desc": "Cannot append backup-top filter: Conflicts with use by source as 'image', which does not allow 'write' on base"}}
|
||||||
|
|
||||||
=== backup-top should be gone after job-finalize ===
|
=== backup-top should be gone after job-finalize ===
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue