[PATCH] NVMe: User initiated rescan

Brandon Schulz brandon.schulz at hgst.com
Wed May 11 12:00:33 PDT 2016


I would like to see some version of this patch go in.  It’s useful for our pre-NVMe 1.2 devices at a minimum.

Brandon Schulz
Technologist - Systems & Software Architecture 
SSD Device Development
Western Digital Corporation
e: brandon.schulz at hgst.com
o: (507) 322-2257










On 5/10/16, 5:23 PM, "Linux-nvme on behalf of Keith Busch" <linux-nvme-bounces at lists.infradead.org on behalf of keith.busch at intel.com> wrote:

>This provides user ioctl and sysfs methods that can be used to request
>the driver rescan a controller and its namespaces. This is less harsh
>than doing a controller reset, which temporarily halts all IO just to
>surface a newly attached namespace.
>
>This is mainly useful for controllers that implement namespace management,
>but do not support the namespace notify change asynchronous event
>notification.
>
>Signed-off-by: Keith Busch <keith.busch at intel.com>
>---
> drivers/nvme/host/core.c        | 22 ++++++++++++++++++++--
> drivers/nvme/host/nvme.h        |  2 +-
> include/uapi/linux/nvme_ioctl.h |  1 +
> 3 files changed, 22 insertions(+), 3 deletions(-)
>
>diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c
>index 2df0351d..b85c4b1 100644
>--- a/drivers/nvme/host/core.c
>+++ b/drivers/nvme/host/core.c
>@@ -1216,6 +1216,8 @@ static long nvme_dev_ioctl(struct file *file, unsigned int cmd,
> 		return ctrl->ops->reset_ctrl(ctrl);
> 	case NVME_IOCTL_SUBSYS_RESET:
> 		return nvme_reset_subsystem(ctrl);
>+	case NVME_IOCTL_RESCAN:
>+		return nvme_queue_scan(ctrl);
> 	default:
> 		return -ENOTTY;
> 	}
>@@ -1243,6 +1245,20 @@ static ssize_t nvme_sysfs_reset(struct device *dev,
> }
> static DEVICE_ATTR(reset_controller, S_IWUSR, NULL, nvme_sysfs_reset);
> 
>+static ssize_t nvme_sysfs_rescan(struct device *dev,
>+				struct device_attribute *attr, const char *buf,
>+				size_t count)
>+{
>+	struct nvme_ctrl *ctrl = dev_get_drvdata(dev);
>+	int ret;
>+
>+	ret = nvme_queue_scan(ctrl);
>+	if (ret < 0)
>+		return ret;
>+	return count;
>+}
>+static DEVICE_ATTR(rescan_controller, S_IWUSR, NULL, nvme_sysfs_rescan);
>+
> static ssize_t wwid_show(struct device *dev, struct device_attribute *attr,
> 								char *buf)
> {
>@@ -1346,6 +1362,7 @@ nvme_show_int_function(cntlid);
> 
> static struct attribute *nvme_dev_attrs[] = {
> 	&dev_attr_reset_controller.attr,
>+	&dev_attr_rescan_controller.attr,
> 	&dev_attr_model.attr,
> 	&dev_attr_serial.attr,
> 	&dev_attr_firmware_rev.attr,
>@@ -1569,14 +1586,15 @@ static void nvme_scan_work(struct work_struct *work)
> 		ctrl->ops->post_scan(ctrl);
> }
> 
>-void nvme_queue_scan(struct nvme_ctrl *ctrl)
>+int nvme_queue_scan(struct nvme_ctrl *ctrl)
> {
> 	/*
> 	 * Do not queue new scan work when a controller is reset during
> 	 * removal.
> 	 */
> 	if (ctrl->state == NVME_CTRL_LIVE)
>-		schedule_work(&ctrl->scan_work);
>+		return schedule_work(&ctrl->scan_work);
>+	return -EBUSY;
> }
> EXPORT_SYMBOL_GPL(nvme_queue_scan);
> 
>diff --git a/drivers/nvme/host/nvme.h b/drivers/nvme/host/nvme.h
>index 114b928..997b9ec 100644
>--- a/drivers/nvme/host/nvme.h
>+++ b/drivers/nvme/host/nvme.h
>@@ -217,7 +217,7 @@ void nvme_uninit_ctrl(struct nvme_ctrl *ctrl);
> void nvme_put_ctrl(struct nvme_ctrl *ctrl);
> int nvme_init_identify(struct nvme_ctrl *ctrl);
> 
>-void nvme_queue_scan(struct nvme_ctrl *ctrl);
>+int nvme_queue_scan(struct nvme_ctrl *ctrl);
> void nvme_remove_namespaces(struct nvme_ctrl *ctrl);
> 
> #define NVME_NR_AERS	1
>diff --git a/include/uapi/linux/nvme_ioctl.h b/include/uapi/linux/nvme_ioctl.h
>index c4b2a3f..50ff21f 100644
>--- a/include/uapi/linux/nvme_ioctl.h
>+++ b/include/uapi/linux/nvme_ioctl.h
>@@ -61,5 +61,6 @@ struct nvme_passthru_cmd {
> #define NVME_IOCTL_IO_CMD	_IOWR('N', 0x43, struct nvme_passthru_cmd)
> #define NVME_IOCTL_RESET	_IO('N', 0x44)
> #define NVME_IOCTL_SUBSYS_RESET	_IO('N', 0x45)
>+#define NVME_IOCTL_RESCAN	_IO('N', 0x46)
> 
> #endif /* _UAPI_LINUX_NVME_IOCTL_H */
>-- 
>2.7.2
>
>
>_______________________________________________
>Linux-nvme mailing list
>Linux-nvme at lists.infradead.org
>http://lists.infradead.org/mailman/listinfo/linux-nvme


More information about the Linux-nvme mailing list