mirror of
https://github.com/torvalds/linux.git
synced 2024-12-11 13:41:55 +00:00
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: Tong Zhang <ztong0001@gmail.com> Signed-off-by: Keith Busch <kbusch@kernel.org> Signed-off-by: Christoph Hellwig <hch@lst.de>
This commit is contained in:
parent
4a2dd2c798
commit
59e330f8ff
@ -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,
|
|||||||
|
|
||||||
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 = {
|
|||||||
.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)
|
|||||||
|
|
||||||
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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
}
|
}
|
||||||
|
|
||||||
#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,
|
||||||
|
Loading…
Reference in New Issue
Block a user