nvme: expose reconnect_delay and ctrl_loss_tmo via sysfs
This is useful information, and moreover its it's useful to be able to alter these parameters per controller after it has been established. Signed-off-by: Sagi Grimberg <sagi@grimberg.me> Signed-off-by: Christoph Hellwig <hch@lst.de>
This commit is contained in:
committed by
Christoph Hellwig
parent
240e6ee272
commit
764075fdcb
@ -3535,6 +3535,66 @@ static ssize_t nvme_sysfs_show_address(struct device *dev,
|
|||||||
}
|
}
|
||||||
static DEVICE_ATTR(address, S_IRUGO, nvme_sysfs_show_address, NULL);
|
static DEVICE_ATTR(address, S_IRUGO, nvme_sysfs_show_address, NULL);
|
||||||
|
|
||||||
|
static ssize_t nvme_ctrl_loss_tmo_show(struct device *dev,
|
||||||
|
struct device_attribute *attr, char *buf)
|
||||||
|
{
|
||||||
|
struct nvme_ctrl *ctrl = dev_get_drvdata(dev);
|
||||||
|
struct nvmf_ctrl_options *opts = ctrl->opts;
|
||||||
|
|
||||||
|
if (ctrl->opts->max_reconnects == -1)
|
||||||
|
return sprintf(buf, "off\n");
|
||||||
|
return sprintf(buf, "%d\n",
|
||||||
|
opts->max_reconnects * opts->reconnect_delay);
|
||||||
|
}
|
||||||
|
|
||||||
|
static ssize_t nvme_ctrl_loss_tmo_store(struct device *dev,
|
||||||
|
struct device_attribute *attr, const char *buf, size_t count)
|
||||||
|
{
|
||||||
|
struct nvme_ctrl *ctrl = dev_get_drvdata(dev);
|
||||||
|
struct nvmf_ctrl_options *opts = ctrl->opts;
|
||||||
|
int ctrl_loss_tmo, err;
|
||||||
|
|
||||||
|
err = kstrtoint(buf, 10, &ctrl_loss_tmo);
|
||||||
|
if (err)
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
else if (ctrl_loss_tmo < 0)
|
||||||
|
opts->max_reconnects = -1;
|
||||||
|
else
|
||||||
|
opts->max_reconnects = DIV_ROUND_UP(ctrl_loss_tmo,
|
||||||
|
opts->reconnect_delay);
|
||||||
|
return count;
|
||||||
|
}
|
||||||
|
static DEVICE_ATTR(ctrl_loss_tmo, S_IRUGO | S_IWUSR,
|
||||||
|
nvme_ctrl_loss_tmo_show, nvme_ctrl_loss_tmo_store);
|
||||||
|
|
||||||
|
static ssize_t nvme_ctrl_reconnect_delay_show(struct device *dev,
|
||||||
|
struct device_attribute *attr, char *buf)
|
||||||
|
{
|
||||||
|
struct nvme_ctrl *ctrl = dev_get_drvdata(dev);
|
||||||
|
|
||||||
|
if (ctrl->opts->reconnect_delay == -1)
|
||||||
|
return sprintf(buf, "off\n");
|
||||||
|
return sprintf(buf, "%d\n", ctrl->opts->reconnect_delay);
|
||||||
|
}
|
||||||
|
|
||||||
|
static ssize_t nvme_ctrl_reconnect_delay_store(struct device *dev,
|
||||||
|
struct device_attribute *attr, const char *buf, size_t count)
|
||||||
|
{
|
||||||
|
struct nvme_ctrl *ctrl = dev_get_drvdata(dev);
|
||||||
|
unsigned int v;
|
||||||
|
int err;
|
||||||
|
|
||||||
|
err = kstrtou32(buf, 10, &v);
|
||||||
|
if (err || v > UINT_MAX)
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
ctrl->opts->reconnect_delay = v;
|
||||||
|
return count;
|
||||||
|
}
|
||||||
|
static DEVICE_ATTR(reconnect_delay, S_IRUGO | S_IWUSR,
|
||||||
|
nvme_ctrl_reconnect_delay_show, nvme_ctrl_reconnect_delay_store);
|
||||||
|
|
||||||
static struct attribute *nvme_dev_attrs[] = {
|
static struct attribute *nvme_dev_attrs[] = {
|
||||||
&dev_attr_reset_controller.attr,
|
&dev_attr_reset_controller.attr,
|
||||||
&dev_attr_rescan_controller.attr,
|
&dev_attr_rescan_controller.attr,
|
||||||
@ -3552,6 +3612,8 @@ static struct attribute *nvme_dev_attrs[] = {
|
|||||||
&dev_attr_sqsize.attr,
|
&dev_attr_sqsize.attr,
|
||||||
&dev_attr_hostnqn.attr,
|
&dev_attr_hostnqn.attr,
|
||||||
&dev_attr_hostid.attr,
|
&dev_attr_hostid.attr,
|
||||||
|
&dev_attr_ctrl_loss_tmo.attr,
|
||||||
|
&dev_attr_reconnect_delay.attr,
|
||||||
NULL
|
NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user