|
@@ -75,6 +75,7 @@ static const BlockExportDriver *blk_exp_find_driver(BlockExportType type)
|
|
|
BlockExport *blk_exp_add(BlockExportOptions *export, Error **errp)
|
|
|
{
|
|
|
bool fixed_iothread = export->has_fixed_iothread && export->fixed_iothread;
|
|
|
+ bool allow_inactive = export->has_allow_inactive && export->allow_inactive;
|
|
|
const BlockExportDriver *drv;
|
|
|
BlockExport *exp = NULL;
|
|
|
BlockDriverState *bs;
|
|
@@ -138,17 +139,24 @@ BlockExport *blk_exp_add(BlockExportOptions *export, Error **errp)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- /*
|
|
|
- * Block exports are used for non-shared storage migration. Make sure
|
|
|
- * that BDRV_O_INACTIVE is cleared and the image is ready for write
|
|
|
- * access since the export could be available before migration handover.
|
|
|
- * ctx was acquired in the caller.
|
|
|
- */
|
|
|
bdrv_graph_rdlock_main_loop();
|
|
|
- ret = bdrv_activate(bs, errp);
|
|
|
- if (ret < 0) {
|
|
|
- bdrv_graph_rdunlock_main_loop();
|
|
|
- goto fail;
|
|
|
+ if (allow_inactive) {
|
|
|
+ if (!drv->supports_inactive) {
|
|
|
+ error_setg(errp, "Export type does not support inactive exports");
|
|
|
+ bdrv_graph_rdunlock_main_loop();
|
|
|
+ goto fail;
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ /*
|
|
|
+ * Block exports are used for non-shared storage migration. Make sure
|
|
|
+ * that BDRV_O_INACTIVE is cleared and the image is ready for write
|
|
|
+ * access since the export could be available before migration handover.
|
|
|
+ */
|
|
|
+ ret = bdrv_activate(bs, errp);
|
|
|
+ if (ret < 0) {
|
|
|
+ bdrv_graph_rdunlock_main_loop();
|
|
|
+ goto fail;
|
|
|
+ }
|
|
|
}
|
|
|
bdrv_graph_rdunlock_main_loop();
|
|
|
|
|
@@ -162,6 +170,9 @@ BlockExport *blk_exp_add(BlockExportOptions *export, Error **errp)
|
|
|
if (!fixed_iothread) {
|
|
|
blk_set_allow_aio_context_change(blk, true);
|
|
|
}
|
|
|
+ if (allow_inactive) {
|
|
|
+ blk_set_force_allow_inactivate(blk);
|
|
|
+ }
|
|
|
|
|
|
ret = blk_insert_bs(blk, bs, errp);
|
|
|
if (ret < 0) {
|