Commit 8242ddac authored by Sagi Grimberg's avatar Sagi Grimberg

nvmet: Don't queue fatal error work if csts.cfs is set

In the transport, in case of an interal queue error like
error completion in rdma we trigger a fatal error. However,
multiple queues in the same controller can serr error completions
and we don't want to trigger fatal error work more than once.
Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
Signed-off-by: default avatarSagi Grimberg <sagi@grimberg.me>
parent 553cd9ef
...@@ -838,9 +838,13 @@ static void nvmet_fatal_error_handler(struct work_struct *work) ...@@ -838,9 +838,13 @@ static void nvmet_fatal_error_handler(struct work_struct *work)
void nvmet_ctrl_fatal_error(struct nvmet_ctrl *ctrl) void nvmet_ctrl_fatal_error(struct nvmet_ctrl *ctrl)
{ {
ctrl->csts |= NVME_CSTS_CFS; mutex_lock(&ctrl->lock);
INIT_WORK(&ctrl->fatal_err_work, nvmet_fatal_error_handler); if (!(ctrl->csts & NVME_CSTS_CFS)) {
schedule_work(&ctrl->fatal_err_work); ctrl->csts |= NVME_CSTS_CFS;
INIT_WORK(&ctrl->fatal_err_work, nvmet_fatal_error_handler);
schedule_work(&ctrl->fatal_err_work);
}
mutex_unlock(&ctrl->lock);
} }
EXPORT_SYMBOL_GPL(nvmet_ctrl_fatal_error); EXPORT_SYMBOL_GPL(nvmet_ctrl_fatal_error);
......
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