nvme: expose cntlid in sysfs
authorMing Lin <ming.l@ssi.samsung.com>
Fri, 26 Feb 2016 21:24:19 +0000 (13:24 -0800)
committerJens Axboe <axboe@fb.com>
Mon, 29 Feb 2016 19:31:27 +0000 (12:31 -0700)
For NVMe over Fabrics, the cntlid will be used by systemd/udev to
create link to the device, for example,

/dev/disk/by-path/<fabrics-info>-<cntlid>-<namespace> -> /dev/nvme0n1

Signed-off-by: Ming Lin <ming.l@ssi.samsung.com>
Reviewed-by: Keith Busch <keith.busch@intel.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Sagi Grimberg <sagig@mellanox.com>
Signed-off-by: Jens Axboe <axboe@fb.com>
drivers/nvme/host/core.c
drivers/nvme/host/nvme.h

index 66fd3d9..f08dcce 100644 (file)
@@ -912,6 +912,7 @@ int nvme_init_identify(struct nvme_ctrl *ctrl)
        ctrl->oncs = le16_to_cpup(&id->oncs);
        atomic_set(&ctrl->abort_limit, id->acl + 1);
        ctrl->vwc = id->vwc;
+       ctrl->cntlid = le16_to_cpup(&id->cntlid);
        memcpy(ctrl->serial, id->sn, sizeof(id->sn));
        memcpy(ctrl->model, id->mn, sizeof(id->mn));
        memcpy(ctrl->firmware_rev, id->fr, sizeof(id->fr));
@@ -1099,7 +1100,7 @@ static const struct attribute_group nvme_ns_attr_group = {
        .is_visible     = nvme_attrs_are_visible,
 };
 
-#define nvme_show_function(field)                                              \
+#define nvme_show_str_function(field)                                          \
 static ssize_t  field##_show(struct device *dev,                               \
                            struct device_attribute *attr, char *buf)           \
 {                                                                              \
@@ -1108,15 +1109,26 @@ static ssize_t  field##_show(struct device *dev,                                \
 }                                                                              \
 static DEVICE_ATTR(field, S_IRUGO, field##_show, NULL);
 
-nvme_show_function(model);
-nvme_show_function(serial);
-nvme_show_function(firmware_rev);
+#define nvme_show_int_function(field)                                          \
+static ssize_t  field##_show(struct device *dev,                               \
+                           struct device_attribute *attr, char *buf)           \
+{                                                                              \
+        struct nvme_ctrl *ctrl = dev_get_drvdata(dev);                         \
+        return sprintf(buf, "%d\n", ctrl->field);      \
+}                                                                              \
+static DEVICE_ATTR(field, S_IRUGO, field##_show, NULL);
+
+nvme_show_str_function(model);
+nvme_show_str_function(serial);
+nvme_show_str_function(firmware_rev);
+nvme_show_int_function(cntlid);
 
 static struct attribute *nvme_dev_attrs[] = {
        &dev_attr_reset_controller.attr,
        &dev_attr_model.attr,
        &dev_attr_serial.attr,
        &dev_attr_firmware_rev.attr,
+       &dev_attr_cntlid.attr,
        NULL
 };
 
index 2ac7539..9b71fa8 100644 (file)
@@ -77,6 +77,7 @@ struct nvme_ctrl {
        char serial[20];
        char model[40];
        char firmware_rev[8];
+       int cntlid;
 
        u32 ctrl_config;