diff --git a/lib/bdev/ocf/vbdev_ocf.c b/lib/bdev/ocf/vbdev_ocf.c index 81c06ad2e..82880b6cf 100644 --- a/lib/bdev/ocf/vbdev_ocf.c +++ b/lib/bdev/ocf/vbdev_ocf.c @@ -181,6 +181,15 @@ close_core_bdev(struct vbdev_ocf *vbdev) vbdev_ocf_mngt_continue(vbdev, 0); } +static void +remove_core_cmpl(void *priv, int error) +{ + struct vbdev_ocf *vbdev = priv; + + ocf_mngt_cache_unlock(vbdev->ocf_cache); + vbdev_ocf_mngt_continue(vbdev, error); +} + /* Try to lock cache, then remove core */ static void remove_core_poll(struct vbdev_ocf *vbdev) @@ -192,11 +201,8 @@ remove_core_poll(struct vbdev_ocf *vbdev) return; } - rc = ocf_mngt_cache_remove_core(vbdev->ocf_core); - - ocf_mngt_cache_unlock(vbdev->ocf_cache); - - vbdev_ocf_mngt_continue(vbdev, rc); + vbdev_ocf_mngt_poll(vbdev, NULL); + ocf_mngt_cache_remove_core(vbdev->ocf_core, remove_core_cmpl, vbdev); } /* Detach core base */ @@ -232,12 +238,19 @@ detach_cache(struct vbdev_ocf *vbdev) vbdev_ocf_mngt_continue(vbdev, 0); } +static void +stop_vbdev_cmpl(ocf_cache_t cache, void *priv, int error) +{ + struct vbdev_ocf *vbdev = priv; + + ocf_mngt_cache_unlock(cache); + vbdev_ocf_mngt_continue(vbdev, error); +} + /* Try to lock cache, then stop it */ static void stop_vbdev_poll(struct vbdev_ocf *vbdev) { - int rc; - if (!ocf_cache_is_running(vbdev->ocf_cache)) { vbdev_ocf_mngt_continue(vbdev, 0); return; @@ -255,14 +268,8 @@ stop_vbdev_poll(struct vbdev_ocf *vbdev) return; } - rc = ocf_mngt_cache_stop(vbdev->ocf_cache); - if (rc) { - SPDK_ERRLOG("Could not stop cache for '%s'\n", vbdev->name); - } - - ocf_mngt_cache_unlock(vbdev->ocf_cache); - - vbdev_ocf_mngt_continue(vbdev, rc); + vbdev_ocf_mngt_poll(vbdev, NULL); + ocf_mngt_cache_stop(vbdev->ocf_cache, stop_vbdev_cmpl, vbdev); } /* Stop OCF cache object @@ -768,26 +775,33 @@ finish_register(struct vbdev_ocf *vbdev) vbdev_ocf_mngt_continue(vbdev, result); } +static void +add_core_cmpl(ocf_cache_t cache, ocf_core_t core, void *priv, int error) +{ + struct vbdev_ocf *vbdev = priv; + + ocf_mngt_cache_unlock(cache); + + if (error) { + SPDK_ERRLOG("Failed to add core device to cache instance\n"); + } else { + vbdev->ocf_core = core; + vbdev->core.id = ocf_core_get_id(core); + } + + vbdev_ocf_mngt_continue(vbdev, error); +} + /* Try to lock cache, then add core */ static void add_core_poll(struct vbdev_ocf *vbdev) { - int rc; - if (ocf_mngt_cache_trylock(vbdev->ocf_cache)) { return; } - rc = ocf_mngt_cache_add_core(vbdev->ocf_cache, &vbdev->ocf_core, &vbdev->cfg.core); - if (rc) { - SPDK_ERRLOG("Failed to add core device to cache instance\n"); - } else { - vbdev->core.id = ocf_core_get_id(vbdev->ocf_core); - } - - ocf_mngt_cache_unlock(vbdev->ocf_cache); - - vbdev_ocf_mngt_continue(vbdev, rc); + vbdev_ocf_mngt_poll(vbdev, NULL); + ocf_mngt_cache_add_core(vbdev->ocf_cache, &vbdev->cfg.core, add_core_cmpl, vbdev); } /* Add core for existing OCF cache instance */ @@ -797,7 +811,16 @@ add_core(struct vbdev_ocf *vbdev) vbdev_ocf_mngt_poll(vbdev, add_core_poll); } -/* Start OCF cache, attach cache device */ +static void +start_cache_cmpl(ocf_cache_t cache, void *priv, int error) +{ + struct vbdev_ocf *vbdev = priv; + + ocf_mngt_cache_unlock(cache); + vbdev_ocf_mngt_continue(vbdev, error); +} + +/* Start OCF cache, attach caching device */ static void start_cache(struct vbdev_ocf *vbdev) { @@ -829,10 +852,7 @@ start_cache(struct vbdev_ocf *vbdev) vbdev->cache.id = ocf_cache_get_id(vbdev->ocf_cache); - rc = ocf_mngt_cache_attach(vbdev->ocf_cache, &vbdev->cfg.device); - ocf_mngt_cache_unlock(vbdev->ocf_cache); - - vbdev_ocf_mngt_continue(vbdev, rc); + ocf_mngt_cache_attach(vbdev->ocf_cache, &vbdev->cfg.device, start_cache_cmpl, vbdev); } /* Procedures called during register operation */ diff --git a/ocf b/ocf index bd19b9c12..56f4d3492 160000 --- a/ocf +++ b/ocf @@ -1 +1 @@ -Subproject commit bd19b9c12f924b3bfd5d228c3dc4a16d807595d0 +Subproject commit 56f4d34920ceeb650cdbc7362fc6a775f61a19a3