|
@@ -3560,10 +3560,14 @@ out:
|
|
|
int bdrv_set_backing_hd(BlockDriverState *bs, BlockDriverState *backing_hd,
|
|
|
Error **errp)
|
|
|
{
|
|
|
- BlockDriverState *drain_bs = bs->backing ? bs->backing->bs : bs;
|
|
|
+ BlockDriverState *drain_bs;
|
|
|
int ret;
|
|
|
GLOBAL_STATE_CODE();
|
|
|
|
|
|
+ bdrv_graph_rdlock_main_loop();
|
|
|
+ drain_bs = bs->backing ? bs->backing->bs : bs;
|
|
|
+ bdrv_graph_rdunlock_main_loop();
|
|
|
+
|
|
|
bdrv_ref(drain_bs);
|
|
|
bdrv_drained_begin(drain_bs);
|
|
|
bdrv_graph_wrlock(backing_hd);
|
|
@@ -3602,6 +3606,7 @@ int bdrv_open_backing_file(BlockDriverState *bs, QDict *parent_options,
|
|
|
Error *local_err = NULL;
|
|
|
|
|
|
GLOBAL_STATE_CODE();
|
|
|
+ GRAPH_RDLOCK_GUARD_MAINLOOP();
|
|
|
|
|
|
if (bs->backing != NULL) {
|
|
|
goto free_exit;
|
|
@@ -3643,10 +3648,7 @@ int bdrv_open_backing_file(BlockDriverState *bs, QDict *parent_options,
|
|
|
implicit_backing = !strcmp(bs->auto_backing_file, bs->backing_file);
|
|
|
}
|
|
|
|
|
|
- bdrv_graph_rdlock_main_loop();
|
|
|
backing_filename = bdrv_get_full_backing_filename(bs, &local_err);
|
|
|
- bdrv_graph_rdunlock_main_loop();
|
|
|
-
|
|
|
if (local_err) {
|
|
|
ret = -EINVAL;
|
|
|
error_propagate(errp, local_err);
|
|
@@ -3677,9 +3679,7 @@ int bdrv_open_backing_file(BlockDriverState *bs, QDict *parent_options,
|
|
|
}
|
|
|
|
|
|
if (implicit_backing) {
|
|
|
- bdrv_graph_rdlock_main_loop();
|
|
|
bdrv_refresh_filename(backing_hd);
|
|
|
- bdrv_graph_rdunlock_main_loop();
|
|
|
pstrcpy(bs->auto_backing_file, sizeof(bs->auto_backing_file),
|
|
|
backing_hd->filename);
|
|
|
}
|
|
@@ -4750,8 +4750,8 @@ bdrv_reopen_parse_file_or_backing(BDRVReopenState *reopen_state,
|
|
|
{
|
|
|
BlockDriverState *bs = reopen_state->bs;
|
|
|
BlockDriverState *new_child_bs;
|
|
|
- BlockDriverState *old_child_bs = is_backing ? child_bs(bs->backing) :
|
|
|
- child_bs(bs->file);
|
|
|
+ BlockDriverState *old_child_bs;
|
|
|
+
|
|
|
const char *child_name = is_backing ? "backing" : "file";
|
|
|
QObject *value;
|
|
|
const char *str;
|
|
@@ -4797,6 +4797,7 @@ bdrv_reopen_parse_file_or_backing(BDRVReopenState *reopen_state,
|
|
|
g_assert_not_reached();
|
|
|
}
|
|
|
|
|
|
+ old_child_bs = is_backing ? child_bs(bs->backing) : child_bs(bs->file);
|
|
|
if (old_child_bs == new_child_bs) {
|
|
|
ret = 0;
|
|
|
goto out_rdlock;
|
|
@@ -5008,13 +5009,16 @@ bdrv_reopen_prepare(BDRVReopenState *reopen_state, BlockReopenQueue *queue,
|
|
|
* file or if the image file has a backing file name as part of
|
|
|
* its metadata. Otherwise the 'backing' option can be omitted.
|
|
|
*/
|
|
|
+ bdrv_graph_rdlock_main_loop();
|
|
|
if (drv->supports_backing && reopen_state->backing_missing &&
|
|
|
(reopen_state->bs->backing || reopen_state->bs->backing_file[0])) {
|
|
|
error_setg(errp, "backing is missing for '%s'",
|
|
|
reopen_state->bs->node_name);
|
|
|
+ bdrv_graph_rdunlock_main_loop();
|
|
|
ret = -EINVAL;
|
|
|
goto error;
|
|
|
}
|
|
|
+ bdrv_graph_rdunlock_main_loop();
|
|
|
|
|
|
/*
|
|
|
* Allow changing the 'backing' option. The new value can be
|
|
@@ -5204,10 +5208,11 @@ static void bdrv_close(BlockDriverState *bs)
|
|
|
QLIST_FOREACH_SAFE(child, &bs->children, next, next) {
|
|
|
bdrv_unref_child(bs, child);
|
|
|
}
|
|
|
- bdrv_graph_wrunlock();
|
|
|
|
|
|
assert(!bs->backing);
|
|
|
assert(!bs->file);
|
|
|
+ bdrv_graph_wrunlock();
|
|
|
+
|
|
|
g_free(bs->opaque);
|
|
|
bs->opaque = NULL;
|
|
|
qatomic_set(&bs->copy_on_read, 0);
|
|
@@ -5531,7 +5536,9 @@ int bdrv_append(BlockDriverState *bs_new, BlockDriverState *bs_top,
|
|
|
|
|
|
GLOBAL_STATE_CODE();
|
|
|
|
|
|
+ bdrv_graph_rdlock_main_loop();
|
|
|
assert(!bs_new->backing);
|
|
|
+ bdrv_graph_rdunlock_main_loop();
|
|
|
|
|
|
old_context = bdrv_get_aio_context(bs_top);
|
|
|
bdrv_drained_begin(bs_top);
|
|
@@ -8115,7 +8122,7 @@ static bool append_strong_runtime_options(QDict *d, BlockDriverState *bs)
|
|
|
/* Note: This function may return false positives; it may return true
|
|
|
* even if opening the backing file specified by bs's image header
|
|
|
* would result in exactly bs->backing. */
|
|
|
-static bool bdrv_backing_overridden(BlockDriverState *bs)
|
|
|
+static bool GRAPH_RDLOCK bdrv_backing_overridden(BlockDriverState *bs)
|
|
|
{
|
|
|
GLOBAL_STATE_CODE();
|
|
|
if (bs->backing) {
|