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 <dariusz.stojaczyk@intel.com>
Reviewed-on: https://review.gerrithub.io/c/438680
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: Pawel Wodkowski <pawelx.wodkowski@intel.com>
Reviewed-by: Jim Harris <james.r.harris@intel.com>
Reviewed-by: Shuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
This commit is contained in:
Darek Stojaczyk 2018-12-17 13:45:36 +01:00
parent 1ccd66db41
commit e724e9d97e

View File

@ -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;
}