forked from Minki/linux
nvme-fc: remove nvme_fc_terminate_io()
__nvme_fc_terminate_io() is now called by only 1 place, in reset_work. Consoldate and move the functionality of terminate_io into reset_work. In reset_work, rather than calling the create_association directly, schedule the connect work element to do its thing. After scheduling, flush the connect work element to continue with semantic of not returning until connect has been attempted at least once. Signed-off-by: James Smart <james.smart@broadcom.com> Signed-off-by: Christoph Hellwig <hch@lst.de>
This commit is contained in:
parent
95ced8a2c7
commit
ac9b820e71
@ -3286,50 +3286,33 @@ nvme_fc_reconnect_or_delete(struct nvme_fc_ctrl *ctrl, int status)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
__nvme_fc_terminate_io(struct nvme_fc_ctrl *ctrl)
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
* For any other state, kill the association. As this routine
|
|
||||||
* is a common io abort routine for resetting and such, after
|
|
||||||
* the association is terminated, ensure that the state is set
|
|
||||||
* to CONNECTING.
|
|
||||||
*/
|
|
||||||
|
|
||||||
nvme_stop_keep_alive(&ctrl->ctrl);
|
|
||||||
|
|
||||||
/* will block will waiting for io to terminate */
|
|
||||||
nvme_fc_delete_association(ctrl);
|
|
||||||
|
|
||||||
if (ctrl->ctrl.state != NVME_CTRL_CONNECTING &&
|
|
||||||
!nvme_change_ctrl_state(&ctrl->ctrl, NVME_CTRL_CONNECTING))
|
|
||||||
dev_err(ctrl->ctrl.device,
|
|
||||||
"NVME-FC{%d}: error_recovery: Couldn't change state "
|
|
||||||
"to CONNECTING\n", ctrl->cnum);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
nvme_fc_reset_ctrl_work(struct work_struct *work)
|
nvme_fc_reset_ctrl_work(struct work_struct *work)
|
||||||
{
|
{
|
||||||
struct nvme_fc_ctrl *ctrl =
|
struct nvme_fc_ctrl *ctrl =
|
||||||
container_of(work, struct nvme_fc_ctrl, ctrl.reset_work);
|
container_of(work, struct nvme_fc_ctrl, ctrl.reset_work);
|
||||||
int ret;
|
|
||||||
|
|
||||||
__nvme_fc_terminate_io(ctrl);
|
|
||||||
|
|
||||||
nvme_stop_ctrl(&ctrl->ctrl);
|
nvme_stop_ctrl(&ctrl->ctrl);
|
||||||
|
|
||||||
if (ctrl->rport->remoteport.port_state == FC_OBJSTATE_ONLINE)
|
/* will block will waiting for io to terminate */
|
||||||
ret = nvme_fc_create_association(ctrl);
|
nvme_fc_delete_association(ctrl);
|
||||||
else
|
|
||||||
ret = -ENOTCONN;
|
|
||||||
|
|
||||||
if (ret)
|
if (!nvme_change_ctrl_state(&ctrl->ctrl, NVME_CTRL_CONNECTING))
|
||||||
nvme_fc_reconnect_or_delete(ctrl, ret);
|
dev_err(ctrl->ctrl.device,
|
||||||
else
|
"NVME-FC{%d}: error_recovery: Couldn't change state "
|
||||||
dev_info(ctrl->ctrl.device,
|
"to CONNECTING\n", ctrl->cnum);
|
||||||
"NVME-FC{%d}: controller reset complete\n",
|
|
||||||
ctrl->cnum);
|
if (ctrl->rport->remoteport.port_state == FC_OBJSTATE_ONLINE) {
|
||||||
|
if (!queue_delayed_work(nvme_wq, &ctrl->connect_work, 0)) {
|
||||||
|
dev_err(ctrl->ctrl.device,
|
||||||
|
"NVME-FC{%d}: failed to schedule connect "
|
||||||
|
"after reset\n", ctrl->cnum);
|
||||||
|
} else {
|
||||||
|
flush_delayed_work(&ctrl->connect_work);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
nvme_fc_reconnect_or_delete(ctrl, -ENOTCONN);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user