Commit d1c9e2f7 authored by Marcin Dziegielewski's avatar Marcin Dziegielewski Committed by Jim Harris
Browse files

lib/bdev/ocf: fix race between examine and delete in mulicore test



Fixes #962

Issue mentioned above was caused by race between examine on ocf bdev
(which is partially asynhronous) and bdev delete.

This patch adds new ocf bdev state "starting" it means that register
procedure was started, base on this state, we are not allowing to
destruct vbdev during registering path.

Deleting of vbdev will be still possible on started vbdev or when
register procedure are not started yet.

Signed-off-by: default avatarMarcin Dziegielewski <marcin.dziegielewski@intel.com>
Change-Id: I12099dfba75a46f95299c118f748d39af27df86a
Reviewed-on: https://review.gerrithub.io/c/spdk/spdk/+/469406


Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: default avatarJim Harris <james.r.harris@intel.com>
Reviewed-by: default avatarBen Walker <benjamin.walker@intel.com>
Reviewed-by: default avatarShuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
parent 1aa8e4e5
Loading
Loading
Loading
Loading
+8 −0
Original line number Diff line number Diff line
@@ -376,6 +376,13 @@ vbdev_ocf_destruct(void *opaque)
	if (vbdev->state.doing_finish) {
		return -EALREADY;
	}

	if (vbdev->state.starting && !vbdev->state.started) {
		/* Prevent before detach cache/core during register path of
		  this bdev */
		return -EBUSY;
	}

	vbdev->state.doing_finish = true;

	if (vbdev->state.started) {
@@ -1022,6 +1029,7 @@ register_vbdev(struct vbdev_ocf *vbdev, vbdev_ocf_mngt_callback cb, void *cb_arg
		return;
	}

	vbdev->state.starting = true;
	rc = vbdev_ocf_mngt_start(vbdev, register_path, cb, cb_arg);
	if (rc) {
		cb(rc, vbdev, cb_arg);
+2 −0
Original line number Diff line number Diff line
@@ -69,6 +69,8 @@ struct vbdev_ocf_state {
	bool                         doing_reset;
	/* From the moment when exp_bdev is registered */
	bool                         started;
	/* From the moment when register path started */
	bool                         starting;
	/* Status of last attempt for stopping this device */
	int                          stop_status;
};