diff options
Diffstat (limited to 'drivers/nvme/target/core.c')
| -rw-r--r-- | drivers/nvme/target/core.c | 10 | 
1 files changed, 7 insertions, 3 deletions
diff --git a/drivers/nvme/target/core.c b/drivers/nvme/target/core.c index b4cacb6f0258..a21437a33adb 100644 --- a/drivers/nvme/target/core.c +++ b/drivers/nvme/target/core.c @@ -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);  | 
