ocf: wait for pendings reqs in unregister
Unregister OCF bdev using poller that checks if cache has pending requests. This prevents ocf_mngt_cache_stop causing deadlock on reads in WT mode. Submodule commit was updated to get new function ocf_cache_has_pending_requests(). Change-Id: Iee4cb09bc2bb859a6dcce89994c686f64924c942 Signed-off-by: Vitaliy Mysak <vitaliy.mysak@intel.com> Reviewed-on: https://review.gerrithub.io/c/spdk/spdk/+/446604 Tested-by: SPDK CI Jenkins <sys_sgci@intel.com> Reviewed-by: Darek Stojaczyk <dariusz.stojaczyk@intel.com> Reviewed-by: Shuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com> Reviewed-by: Jim Harris <james.r.harris@intel.com>
This commit is contained in:
parent
25df73f5d2
commit
e862b6434a
@ -195,11 +195,10 @@ close_spdk_dev:
|
|||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Free OCF resources, close base bdevs */
|
/* Finish unregister operation */
|
||||||
static void
|
static void
|
||||||
unregister_cb(void *opaque)
|
unregister_finish(struct vbdev_ocf *vbdev)
|
||||||
{
|
{
|
||||||
struct vbdev_ocf *vbdev = opaque;
|
|
||||||
int status;
|
int status;
|
||||||
|
|
||||||
status = stop_vbdev(vbdev);
|
status = stop_vbdev(vbdev);
|
||||||
@ -212,6 +211,46 @@ unregister_cb(void *opaque)
|
|||||||
}
|
}
|
||||||
|
|
||||||
spdk_bdev_destruct_done(&vbdev->exp_bdev, status);
|
spdk_bdev_destruct_done(&vbdev->exp_bdev, status);
|
||||||
|
vbdev_ocf_mngt_continue(vbdev, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Wait for all OCF requests to finish */
|
||||||
|
static void
|
||||||
|
wait_for_requests_poll(struct vbdev_ocf *vbdev)
|
||||||
|
{
|
||||||
|
if (ocf_cache_has_pending_requests(vbdev->ocf_cache)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
vbdev_ocf_mngt_continue(vbdev, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Start waiting for OCF requests to finish */
|
||||||
|
static void
|
||||||
|
wait_for_requests(struct vbdev_ocf *vbdev)
|
||||||
|
{
|
||||||
|
vbdev_ocf_mngt_poll(vbdev, wait_for_requests_poll);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Procedures called during unregister */
|
||||||
|
vbdev_ocf_mngt_fn unregister_path[] = {
|
||||||
|
wait_for_requests,
|
||||||
|
unregister_finish,
|
||||||
|
NULL
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Start asynchronous management operation using unregister_path */
|
||||||
|
static void
|
||||||
|
unregister_cb(void *opaque)
|
||||||
|
{
|
||||||
|
struct vbdev_ocf *vbdev = opaque;
|
||||||
|
int rc;
|
||||||
|
|
||||||
|
rc = vbdev_ocf_mngt_start(vbdev, unregister_path, NULL, NULL);
|
||||||
|
if (rc) {
|
||||||
|
SPDK_ERRLOG("Unable to unregister OCF bdev: %d\n", rc);
|
||||||
|
spdk_bdev_destruct_done(&vbdev->exp_bdev, rc);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Unregister io device with callback to unregister_cb
|
/* Unregister io device with callback to unregister_cb
|
||||||
|
Loading…
Reference in New Issue
Block a user