Commit ac9b820e authored by James Smart's avatar James Smart Committed by Christoph Hellwig

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: default avatarJames Smart <james.smart@broadcom.com>
Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
parent 95ced8a2
...@@ -3287,49 +3287,32 @@ nvme_fc_reconnect_or_delete(struct nvme_fc_ctrl *ctrl, int status) ...@@ -3287,49 +3287,32 @@ nvme_fc_reconnect_or_delete(struct nvme_fc_ctrl *ctrl, int status)
} }
static void static void
__nvme_fc_terminate_io(struct nvme_fc_ctrl *ctrl) nvme_fc_reset_ctrl_work(struct work_struct *work)
{ {
/* struct nvme_fc_ctrl *ctrl =
* For any other state, kill the association. As this routine container_of(work, struct nvme_fc_ctrl, ctrl.reset_work);
* 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); nvme_stop_ctrl(&ctrl->ctrl);
/* will block will waiting for io to terminate */ /* will block will waiting for io to terminate */
nvme_fc_delete_association(ctrl); nvme_fc_delete_association(ctrl);
if (ctrl->ctrl.state != NVME_CTRL_CONNECTING && if (!nvme_change_ctrl_state(&ctrl->ctrl, NVME_CTRL_CONNECTING))
!nvme_change_ctrl_state(&ctrl->ctrl, NVME_CTRL_CONNECTING))
dev_err(ctrl->ctrl.device, dev_err(ctrl->ctrl.device,
"NVME-FC{%d}: error_recovery: Couldn't change state " "NVME-FC{%d}: error_recovery: Couldn't change state "
"to CONNECTING\n", ctrl->cnum); "to CONNECTING\n", ctrl->cnum);
}
static void
nvme_fc_reset_ctrl_work(struct work_struct *work)
{
struct nvme_fc_ctrl *ctrl =
container_of(work, struct nvme_fc_ctrl, ctrl.reset_work);
int ret;
__nvme_fc_terminate_io(ctrl);
nvme_stop_ctrl(&ctrl->ctrl); if (ctrl->rport->remoteport.port_state == FC_OBJSTATE_ONLINE) {
if (!queue_delayed_work(nvme_wq, &ctrl->connect_work, 0)) {
if (ctrl->rport->remoteport.port_state == FC_OBJSTATE_ONLINE) dev_err(ctrl->ctrl.device,
ret = nvme_fc_create_association(ctrl); "NVME-FC{%d}: failed to schedule connect "
else "after reset\n", ctrl->cnum);
ret = -ENOTCONN; } else {
flush_delayed_work(&ctrl->connect_work);
if (ret) }
nvme_fc_reconnect_or_delete(ctrl, ret); } else {
else nvme_fc_reconnect_or_delete(ctrl, -ENOTCONN);
dev_info(ctrl->ctrl.device, }
"NVME-FC{%d}: controller reset complete\n",
ctrl->cnum);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment