Commit e724e9d9 authored by Darek Stojaczyk's avatar Darek Stojaczyk
Browse files

vhost/blk: propagate bdev hotremove event to all sessions



This lets us remove the assumption of having only
a single session per device and brings us closer
towards supporting more.

Change-Id: Ibbb7b1ed789ff0690e62c00fb5ed39ce64245028
Signed-off-by: default avatarDarek Stojaczyk <dariusz.stojaczyk@intel.com>
Reviewed-on: https://review.gerrithub.io/c/438680


Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: default avatarPawel Wodkowski <pawelx.wodkowski@intel.com>
Reviewed-by: default avatarJim Harris <james.r.harris@intel.com>
Reviewed-by: default avatarShuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
parent 1ccd66db
Loading
Loading
Loading
Loading
+29 −9
Original line number Diff line number Diff line
@@ -534,24 +534,44 @@ spdk_vhost_blk_get_dev(struct spdk_vhost_dev *vdev)
}

static int
_bdev_remove_cb(struct spdk_vhost_dev *vdev, void *arg)
_spdk_vhost_session_bdev_remove_cb(struct spdk_vhost_dev *vdev, struct spdk_vhost_session *vsession,
				   void *ctx)
{
	struct spdk_vhost_blk_dev *bvdev = arg;
	struct spdk_vhost_blk_session *bvsession = to_blk_session(bvdev->vdev.session);
	struct spdk_vhost_blk_session *bvsession;

	SPDK_WARNLOG("Controller %s: Hot-removing bdev - all further requests will fail.\n",
		     bvdev->vdev.name);
	if (bvsession != NULL && bvsession->requestq_poller) {
		spdk_poller_unregister(&bvsession->requestq_poller);
		bvsession->requestq_poller = spdk_poller_register(no_bdev_vdev_worker, bvsession, 0);
	if (vdev == NULL) {
		/* Nothing to do */
		return 0;
	}

	if (vsession == NULL) {
		/* All sessions have been notified, time to close the bdev */
		struct spdk_vhost_blk_dev *bvdev = to_blk_dev(vdev);

		spdk_bdev_close(bvdev->bdev_desc);
		bvdev->bdev_desc = NULL;
		bvdev->bdev = NULL;
		return 0;
	}

	bvsession = (struct spdk_vhost_blk_session *)vsession;
	if (bvsession->requestq_poller) {
		spdk_poller_unregister(&bvsession->requestq_poller);
		bvsession->requestq_poller = spdk_poller_register(no_bdev_vdev_worker, bvsession, 0);
	}

	return 0;
}

static int
_bdev_remove_cb(struct spdk_vhost_dev *vdev, void *arg)
{
	SPDK_WARNLOG("Controller %s: Hot-removing bdev - all further requests will fail.\n",
		     vdev->name);
	spdk_vhost_dev_foreach_session(vdev, _spdk_vhost_session_bdev_remove_cb, NULL);
	return 0;
}

static void
bdev_remove_cb(void *remove_ctx)
{