|
@@ -838,9 +838,13 @@ static void nvmet_fatal_error_handler(struct work_struct *work)
|
|
|
|
|
|
void nvmet_ctrl_fatal_error(struct nvmet_ctrl *ctrl)
|
|
|
{
|
|
|
- ctrl->csts |= NVME_CSTS_CFS;
|
|
|
- INIT_WORK(&ctrl->fatal_err_work, nvmet_fatal_error_handler);
|
|
|
- schedule_work(&ctrl->fatal_err_work);
|
|
|
+ mutex_lock(&ctrl->lock);
|
|
|
+ if (!(ctrl->csts & NVME_CSTS_CFS)) {
|
|
|
+ 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);
|
|
|
|