diff --git a/module/bdev/ocf/vbdev_ocf.c b/module/bdev/ocf/vbdev_ocf.c index d8dc28c5f..412eaebb9 100644 --- a/module/bdev/ocf/vbdev_ocf.c +++ b/module/bdev/ocf/vbdev_ocf.c @@ -876,6 +876,12 @@ const struct ocf_queue_ops mngt_queue_ops = { .stop = vbdev_ocf_ctx_mngt_queue_stop, }; +static void +clear_starting_indicator_vbdev(struct vbdev_ocf *vbdev) +{ + vbdev->state.starting = false; +} + /* Create exported spdk object */ static void finish_register(struct vbdev_ocf *vbdev) @@ -900,7 +906,11 @@ finish_register(struct vbdev_ocf *vbdev) sizeof(struct vbdev_ocf_qcxt), vbdev->name); result = spdk_bdev_register(&vbdev->exp_bdev); if (result) { - SPDK_ERRLOG("Could not register exposed bdev\n"); + SPDK_ERRLOG("Could not register exposed bdev %s\n", + vbdev->name); + clear_starting_indicator_vbdev(vbdev); + vbdev_ocf_mngt_stop(vbdev, unregister_path_dirty, result); + return; } else { vbdev->state.started = true; } @@ -916,7 +926,11 @@ add_core_cmpl(ocf_cache_t cache, ocf_core_t core, void *priv, int error) ocf_mngt_cache_unlock(cache); if (error) { - SPDK_ERRLOG("Failed to add core device to cache instance\n"); + SPDK_ERRLOG("Error %d, failed to add core device to cache instance %s," + "starting rollback\n", error, vbdev->name); + clear_starting_indicator_vbdev(vbdev); + vbdev_ocf_mngt_stop(vbdev, unregister_path_dirty, error); + return; } else { vbdev->ocf_core = core; vbdev->core.id = ocf_core_get_id(core); @@ -951,6 +965,14 @@ start_cache_cmpl(ocf_cache_t cache, void *priv, int error) ocf_mngt_cache_unlock(cache); + if (error) { + SPDK_ERRLOG("Error %d during start cache %s, starting rollback\n", + error, vbdev->name); + clear_starting_indicator_vbdev(vbdev); + vbdev_ocf_mngt_stop(vbdev, unregister_path_dirty, error); + return; + } + vbdev_ocf_mngt_continue(vbdev, error); } @@ -1004,7 +1026,8 @@ start_cache(struct vbdev_ocf *vbdev) vbdev->cache_ctx = calloc(1, sizeof(struct vbdev_ocf_cache_ctx)); if (vbdev->cache_ctx == NULL) { - vbdev_ocf_mngt_stop(vbdev, NULL, -ENOMEM); + clear_starting_indicator_vbdev(vbdev); + vbdev_ocf_mngt_stop(vbdev, unregister_path_dirty, -ENOMEM); return; } @@ -1013,8 +1036,8 @@ start_cache(struct vbdev_ocf *vbdev) rc = ocf_mngt_cache_start(vbdev_ocf_ctx, &vbdev->ocf_cache, &vbdev->cfg.cache); if (rc) { - vbdev_ocf_cache_ctx_put(vbdev->cache_ctx); - vbdev_ocf_mngt_stop(vbdev, NULL, rc); + clear_starting_indicator_vbdev(vbdev); + vbdev_ocf_mngt_stop(vbdev, unregister_path_dirty, rc); return; } @@ -1024,8 +1047,8 @@ start_cache(struct vbdev_ocf *vbdev) rc = create_management_queue(vbdev); if (rc) { SPDK_ERRLOG("Unable to create mngt_queue: %d\n", rc); - vbdev_ocf_cache_ctx_put(vbdev->cache_ctx); - vbdev_ocf_mngt_stop(vbdev, NULL, rc); + clear_starting_indicator_vbdev(vbdev); + vbdev_ocf_mngt_stop(vbdev, unregister_path_dirty, rc); return; }