mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-10 02:54:58 -06:00
blockdev: drain while unlocked in internal_snapshot_action()
This is in preparation to mark bdrv_drained_begin() as GRAPH_UNLOCKED. Signed-off-by: Fiona Ebner <f.ebner@proxmox.com> Message-ID: <20250530151125.955508-18-f.ebner@proxmox.com> Reviewed-by: Kevin Wolf <kwolf@redhat.com> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
This commit is contained in:
parent
d75f8ed1d7
commit
6f101614f9
1 changed files with 17 additions and 2 deletions
19
blockdev.c
19
blockdev.c
|
@ -1208,7 +1208,7 @@ static void internal_snapshot_action(BlockdevSnapshotInternal *internal,
|
||||||
Error *local_err = NULL;
|
Error *local_err = NULL;
|
||||||
const char *device;
|
const char *device;
|
||||||
const char *name;
|
const char *name;
|
||||||
BlockDriverState *bs;
|
BlockDriverState *bs, *check_bs;
|
||||||
QEMUSnapshotInfo old_sn, *sn;
|
QEMUSnapshotInfo old_sn, *sn;
|
||||||
bool ret;
|
bool ret;
|
||||||
int64_t rt;
|
int64_t rt;
|
||||||
|
@ -1216,7 +1216,7 @@ static void internal_snapshot_action(BlockdevSnapshotInternal *internal,
|
||||||
int ret1;
|
int ret1;
|
||||||
|
|
||||||
GLOBAL_STATE_CODE();
|
GLOBAL_STATE_CODE();
|
||||||
GRAPH_RDLOCK_GUARD_MAINLOOP();
|
bdrv_graph_rdlock_main_loop();
|
||||||
|
|
||||||
tran_add(tran, &internal_snapshot_drv, state);
|
tran_add(tran, &internal_snapshot_drv, state);
|
||||||
|
|
||||||
|
@ -1225,14 +1225,29 @@ static void internal_snapshot_action(BlockdevSnapshotInternal *internal,
|
||||||
|
|
||||||
bs = qmp_get_root_bs(device, errp);
|
bs = qmp_get_root_bs(device, errp);
|
||||||
if (!bs) {
|
if (!bs) {
|
||||||
|
bdrv_graph_rdunlock_main_loop();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
state->bs = bs;
|
state->bs = bs;
|
||||||
|
|
||||||
|
/* Need to drain while unlocked. */
|
||||||
|
bdrv_graph_rdunlock_main_loop();
|
||||||
/* Paired with .clean() */
|
/* Paired with .clean() */
|
||||||
bdrv_drained_begin(bs);
|
bdrv_drained_begin(bs);
|
||||||
|
|
||||||
|
GRAPH_RDLOCK_GUARD_MAINLOOP();
|
||||||
|
|
||||||
|
/* Make sure the root bs did not change with the drain. */
|
||||||
|
check_bs = qmp_get_root_bs(device, errp);
|
||||||
|
if (bs != check_bs) {
|
||||||
|
if (check_bs) {
|
||||||
|
error_setg(errp, "Block node of device '%s' unexpectedly changed",
|
||||||
|
device);
|
||||||
|
} /* else errp is already set */
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (bdrv_op_is_blocked(bs, BLOCK_OP_TYPE_INTERNAL_SNAPSHOT, errp)) {
|
if (bdrv_op_is_blocked(bs, BLOCK_OP_TYPE_INTERNAL_SNAPSHOT, errp)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue