block: mark blk_remove_bs() as GRAPH_UNLOCKED
The function blk_remove_bs() calls bdrv_graph_wrlock_drained() and can also call bdrv_drained_begin(), both of which which must be called with the graph unlocked. Marking blk_remove_bs() as GRAPH_UNLOCKED requires temporarily unlocking in hmp_drive_del(). Signed-off-by: Fiona Ebner <f.ebner@proxmox.com> Message-ID: <20250530151125.955508-38-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
7525aa25db
commit
b326b127df
2 changed files with 11 additions and 6 deletions
|
|
@ -144,7 +144,7 @@ void hmp_drive_del(Monitor *mon, const QDict *qdict)
|
|||
Error *local_err = NULL;
|
||||
|
||||
GLOBAL_STATE_CODE();
|
||||
GRAPH_RDLOCK_GUARD_MAINLOOP();
|
||||
bdrv_graph_rdlock_main_loop();
|
||||
|
||||
bs = bdrv_find_node(id);
|
||||
if (bs) {
|
||||
|
|
@ -152,29 +152,31 @@ void hmp_drive_del(Monitor *mon, const QDict *qdict)
|
|||
if (local_err) {
|
||||
error_report_err(local_err);
|
||||
}
|
||||
return;
|
||||
goto unlock;
|
||||
}
|
||||
|
||||
blk = blk_by_name(id);
|
||||
if (!blk) {
|
||||
error_report("Device '%s' not found", id);
|
||||
return;
|
||||
goto unlock;
|
||||
}
|
||||
|
||||
if (!blk_legacy_dinfo(blk)) {
|
||||
error_report("Deleting device added with blockdev-add"
|
||||
" is not supported");
|
||||
return;
|
||||
goto unlock;
|
||||
}
|
||||
|
||||
bs = blk_bs(blk);
|
||||
if (bs) {
|
||||
if (bdrv_op_is_blocked(bs, BLOCK_OP_TYPE_DRIVE_DEL, &local_err)) {
|
||||
error_report_err(local_err);
|
||||
return;
|
||||
goto unlock;
|
||||
}
|
||||
|
||||
bdrv_graph_rdunlock_main_loop();
|
||||
blk_remove_bs(blk);
|
||||
bdrv_graph_rdlock_main_loop();
|
||||
}
|
||||
|
||||
/* Make the BlockBackend and the attached BlockDriverState anonymous */
|
||||
|
|
@ -191,6 +193,9 @@ void hmp_drive_del(Monitor *mon, const QDict *qdict)
|
|||
} else {
|
||||
blk_unref(blk);
|
||||
}
|
||||
|
||||
unlock:
|
||||
bdrv_graph_rdunlock_main_loop();
|
||||
}
|
||||
|
||||
void hmp_commit(Monitor *mon, const QDict *qdict)
|
||||
|
|
|
|||
|
|
@ -55,7 +55,7 @@ void monitor_remove_blk(BlockBackend *blk);
|
|||
|
||||
BlockBackendPublic *blk_get_public(BlockBackend *blk);
|
||||
|
||||
void blk_remove_bs(BlockBackend *blk);
|
||||
void GRAPH_UNLOCKED blk_remove_bs(BlockBackend *blk);
|
||||
int blk_insert_bs(BlockBackend *blk, BlockDriverState *bs, Error **errp);
|
||||
int blk_replace_bs(BlockBackend *blk, BlockDriverState *new_bs, Error **errp);
|
||||
bool GRAPH_RDLOCK bdrv_has_blk(BlockDriverState *bs);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue