From d1c9e2f7797eb93a23dfbd9efb8dabf35e9b7aa2 Mon Sep 17 00:00:00 2001 From: Marcin Dziegielewski Date: Wed, 25 Sep 2019 14:52:27 +0200 Subject: [PATCH] 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: Marcin Dziegielewski Change-Id: I12099dfba75a46f95299c118f748d39af27df86a Reviewed-on: https://review.gerrithub.io/c/spdk/spdk/+/469406 Tested-by: SPDK CI Jenkins Reviewed-by: Jim Harris Reviewed-by: Ben Walker Reviewed-by: Shuhei Matsumoto --- module/bdev/ocf/vbdev_ocf.c | 8 ++++++++ module/bdev/ocf/vbdev_ocf.h | 2 ++ 2 files changed, 10 insertions(+) diff --git a/module/bdev/ocf/vbdev_ocf.c b/module/bdev/ocf/vbdev_ocf.c index 35396f102..58b67a161 100644 --- a/module/bdev/ocf/vbdev_ocf.c +++ b/module/bdev/ocf/vbdev_ocf.c @@ -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); diff --git a/module/bdev/ocf/vbdev_ocf.h b/module/bdev/ocf/vbdev_ocf.h index a5e81970b..9666186b5 100644 --- a/module/bdev/ocf/vbdev_ocf.h +++ b/module/bdev/ocf/vbdev_ocf.h @@ -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; };