diff --git a/module/bdev/ocf/utils.c b/module/bdev/ocf/utils.c index fadb82116..f475a16aa 100644 --- a/module/bdev/ocf/utils.c +++ b/module/bdev/ocf/utils.c @@ -129,8 +129,19 @@ vbdev_ocf_mngt_poll(struct vbdev_ocf *vbdev, vbdev_ocf_mngt_fn fn) } void -vbdev_ocf_mngt_stop(struct vbdev_ocf *vbdev) +vbdev_ocf_mngt_stop(struct vbdev_ocf *vbdev, vbdev_ocf_mngt_fn *rollback_path, int status) { + if (status) { + vbdev->mngt_ctx.status = status; + } + + if (vbdev->mngt_ctx.status && rollback_path) { + vbdev->mngt_ctx.poller_fn = NULL; + vbdev->mngt_ctx.current_step = rollback_path; + (*vbdev->mngt_ctx.current_step)(vbdev); + return; + } + spdk_poller_unregister(&vbdev->mngt_ctx.poller); if (vbdev->mngt_ctx.cb) { @@ -158,5 +169,11 @@ vbdev_ocf_mngt_continue(struct vbdev_ocf *vbdev, int status) return; } - vbdev_ocf_mngt_stop(vbdev); + vbdev_ocf_mngt_stop(vbdev, NULL, 0); +} + +int +vbdev_ocf_mngt_get_status(struct vbdev_ocf *vbdev) +{ + return vbdev->mngt_ctx.status; } diff --git a/module/bdev/ocf/utils.h b/module/bdev/ocf/utils.h index 54ce4be2a..73bf6c93a 100644 --- a/module/bdev/ocf/utils.h +++ b/module/bdev/ocf/utils.h @@ -57,7 +57,11 @@ void vbdev_ocf_mngt_poll(struct vbdev_ocf *vbdev, vbdev_ocf_mngt_fn fn); * If next function is NULL, finish management operation and invoke callback */ void vbdev_ocf_mngt_continue(struct vbdev_ocf *vbdev, int status); -/* Stop the execution and invoke callback with last status returned */ -void vbdev_ocf_mngt_stop(struct vbdev_ocf *vbdev); +/* Stop the execution, if status is non zero set it, + * if rollback function is not null invoke rollback + * else invoke callback with last status returned */ +void vbdev_ocf_mngt_stop(struct vbdev_ocf *vbdev, vbdev_ocf_mngt_fn *rollback_path, int status); +/* Get status */ +int vbdev_ocf_mngt_get_status(struct vbdev_ocf *vbdev); #endif diff --git a/module/bdev/ocf/vbdev_ocf.c b/module/bdev/ocf/vbdev_ocf.c index 0e7bce96a..d8dc28c5f 100644 --- a/module/bdev/ocf/vbdev_ocf.c +++ b/module/bdev/ocf/vbdev_ocf.c @@ -986,8 +986,7 @@ start_cache(struct vbdev_ocf *vbdev) int rc; if (vbdev->ocf_cache) { - vbdev->mngt_ctx.status = -EALREADY; - vbdev_ocf_mngt_stop(vbdev); + vbdev_ocf_mngt_stop(vbdev, NULL, -EALREADY); return; } @@ -1005,8 +1004,7 @@ start_cache(struct vbdev_ocf *vbdev) vbdev->cache_ctx = calloc(1, sizeof(struct vbdev_ocf_cache_ctx)); if (vbdev->cache_ctx == NULL) { - vbdev->mngt_ctx.status = -ENOMEM; - vbdev_ocf_mngt_stop(vbdev); + vbdev_ocf_mngt_stop(vbdev, NULL, -ENOMEM); return; } @@ -1016,8 +1014,7 @@ 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->mngt_ctx.status = rc; - vbdev_ocf_mngt_stop(vbdev); + vbdev_ocf_mngt_stop(vbdev, NULL, rc); return; } @@ -1028,8 +1025,7 @@ start_cache(struct vbdev_ocf *vbdev) if (rc) { SPDK_ERRLOG("Unable to create mngt_queue: %d\n", rc); vbdev_ocf_cache_ctx_put(vbdev->cache_ctx); - vbdev->mngt_ctx.status = rc; - vbdev_ocf_mngt_stop(vbdev); + vbdev_ocf_mngt_stop(vbdev, NULL, rc); return; }