Commit e862b643 authored by Vitaliy Mysak's avatar Vitaliy Mysak Committed by Jim Harris
Browse files

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: default avatarVitaliy Mysak <vitaliy.mysak@intel.com>
Reviewed-on: https://review.gerrithub.io/c/spdk/spdk/+/446604


Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: default avatarDarek Stojaczyk <dariusz.stojaczyk@intel.com>
Reviewed-by: default avatarShuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
Reviewed-by: default avatarJim Harris <james.r.harris@intel.com>
parent 25df73f5
Loading
Loading
Loading
Loading
+42 −3
Original line number Diff line number Diff line
@@ -195,11 +195,10 @@ close_spdk_dev:
	return rc;
}

/* Free OCF resources, close base bdevs */
/* Finish unregister operation */
static void
unregister_cb(void *opaque)
unregister_finish(struct vbdev_ocf *vbdev)
{
	struct vbdev_ocf *vbdev = opaque;
	int status;

	status = stop_vbdev(vbdev);
@@ -212,6 +211,46 @@ unregister_cb(void *opaque)
	}

	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