From e724e9d97e70cfb9ddd81d897c7b9409b39a918c Mon Sep 17 00:00:00 2001 From: Darek Stojaczyk Date: Mon, 17 Dec 2018 13:45:36 +0100 Subject: [PATCH] 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: Darek Stojaczyk Reviewed-on: https://review.gerrithub.io/c/438680 Tested-by: SPDK CI Jenkins Reviewed-by: Pawel Wodkowski Reviewed-by: Jim Harris Reviewed-by: Shuhei Matsumoto --- lib/vhost/vhost_blk.c | 38 +++++++++++++++++++++++++++++--------- 1 file changed, 29 insertions(+), 9 deletions(-) diff --git a/lib/vhost/vhost_blk.c b/lib/vhost/vhost_blk.c index bfc39e07c..9f8363e90 100644 --- a/lib/vhost/vhost_blk.c +++ b/lib/vhost/vhost_blk.c @@ -534,21 +534,41 @@ 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) { + 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); } - spdk_bdev_close(bvdev->bdev_desc); - bvdev->bdev_desc = NULL; - bvdev->bdev = NULL; + 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; }