Commit 59e330f8 authored by Keith Busch's avatar Keith Busch Committed by Christoph Hellwig

nvme: return errors for hwmon init

Initializing the nvme hwmon retrieves a log from the controller. If the
controller is broken, we need to return the appropriate error so that
subsequent initialization doesn't attempt to continue.
Reported-by: default avatarTong Zhang <ztong0001@gmail.com>
Signed-off-by: default avatarKeith Busch <kbusch@kernel.org>
Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
parent 4a2dd2c7
...@@ -3236,8 +3236,11 @@ int nvme_init_identify(struct nvme_ctrl *ctrl) ...@@ -3236,8 +3236,11 @@ int nvme_init_identify(struct nvme_ctrl *ctrl)
if (ret < 0) if (ret < 0)
return ret; return ret;
if (!ctrl->identified) if (!ctrl->identified) {
nvme_hwmon_init(ctrl); ret = nvme_hwmon_init(ctrl);
if (ret < 0)
return ret;
}
ctrl->identified = true; ctrl->identified = true;
......
...@@ -59,12 +59,8 @@ static int nvme_set_temp_thresh(struct nvme_ctrl *ctrl, int sensor, bool under, ...@@ -59,12 +59,8 @@ static int nvme_set_temp_thresh(struct nvme_ctrl *ctrl, int sensor, bool under,
static int nvme_hwmon_get_smart_log(struct nvme_hwmon_data *data) static int nvme_hwmon_get_smart_log(struct nvme_hwmon_data *data)
{ {
int ret; return nvme_get_log(data->ctrl, NVME_NSID_ALL, NVME_LOG_SMART, 0,
ret = nvme_get_log(data->ctrl, NVME_NSID_ALL, NVME_LOG_SMART, 0,
NVME_CSI_NVM, &data->log, sizeof(data->log), 0); NVME_CSI_NVM, &data->log, sizeof(data->log), 0);
return ret <= 0 ? ret : -EIO;
} }
static int nvme_hwmon_read(struct device *dev, enum hwmon_sensor_types type, static int nvme_hwmon_read(struct device *dev, enum hwmon_sensor_types type,
...@@ -225,7 +221,7 @@ static const struct hwmon_chip_info nvme_hwmon_chip_info = { ...@@ -225,7 +221,7 @@ static const struct hwmon_chip_info nvme_hwmon_chip_info = {
.info = nvme_hwmon_info, .info = nvme_hwmon_info,
}; };
void nvme_hwmon_init(struct nvme_ctrl *ctrl) int nvme_hwmon_init(struct nvme_ctrl *ctrl)
{ {
struct device *dev = ctrl->dev; struct device *dev = ctrl->dev;
struct nvme_hwmon_data *data; struct nvme_hwmon_data *data;
...@@ -234,7 +230,7 @@ void nvme_hwmon_init(struct nvme_ctrl *ctrl) ...@@ -234,7 +230,7 @@ void nvme_hwmon_init(struct nvme_ctrl *ctrl)
data = devm_kzalloc(dev, sizeof(*data), GFP_KERNEL); data = devm_kzalloc(dev, sizeof(*data), GFP_KERNEL);
if (!data) if (!data)
return; return 0;
data->ctrl = ctrl; data->ctrl = ctrl;
mutex_init(&data->read_lock); mutex_init(&data->read_lock);
...@@ -244,7 +240,7 @@ void nvme_hwmon_init(struct nvme_ctrl *ctrl) ...@@ -244,7 +240,7 @@ void nvme_hwmon_init(struct nvme_ctrl *ctrl)
dev_warn(ctrl->device, dev_warn(ctrl->device,
"Failed to read smart log (error %d)\n", err); "Failed to read smart log (error %d)\n", err);
devm_kfree(dev, data); devm_kfree(dev, data);
return; return err;
} }
hwmon = devm_hwmon_device_register_with_info(dev, "nvme", data, hwmon = devm_hwmon_device_register_with_info(dev, "nvme", data,
...@@ -254,4 +250,6 @@ void nvme_hwmon_init(struct nvme_ctrl *ctrl) ...@@ -254,4 +250,6 @@ void nvme_hwmon_init(struct nvme_ctrl *ctrl)
dev_warn(dev, "Failed to instantiate hwmon device\n"); dev_warn(dev, "Failed to instantiate hwmon device\n");
devm_kfree(dev, data); devm_kfree(dev, data);
} }
return 0;
} }
...@@ -827,9 +827,12 @@ static inline struct nvme_ns *nvme_get_ns_from_dev(struct device *dev) ...@@ -827,9 +827,12 @@ static inline struct nvme_ns *nvme_get_ns_from_dev(struct device *dev)
} }
#ifdef CONFIG_NVME_HWMON #ifdef CONFIG_NVME_HWMON
void nvme_hwmon_init(struct nvme_ctrl *ctrl); int nvme_hwmon_init(struct nvme_ctrl *ctrl);
#else #else
static inline void nvme_hwmon_init(struct nvme_ctrl *ctrl) { } static inline int nvme_hwmon_init(struct nvme_ctrl *ctrl)
{
return 0;
}
#endif #endif
u32 nvme_command_effects(struct nvme_ctrl *ctrl, struct nvme_ns *ns, u32 nvme_command_effects(struct nvme_ctrl *ctrl, struct nvme_ns *ns,
......
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