]> www.infradead.org Git - nvme.git/commitdiff
nvmet: Add vendor_id and subsys_vendor_id subsystem attributes
authorDamien Le Moal <dlemoal@kernel.org>
Sat, 4 Jan 2025 04:59:35 +0000 (13:59 +0900)
committerKeith Busch <kbusch@kernel.org>
Sat, 11 Jan 2025 03:30:46 +0000 (19:30 -0800)
Define the new vendor_id and subsys_vendor_id configfs attribute for
target subsystems. These attributes are respectively reported as the
vid field and as the ssvid field of the identify controller data of
a target controllers using the subsystem for which these attributes
are set.

Signed-off-by: Damien Le Moal <dlemoal@kernel.org>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Tested-by: Rick Wertenbroek <rick.wertenbroek@gmail.com>
Tested-by: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
Signed-off-by: Keith Busch <kbusch@kernel.org>
drivers/nvme/target/admin-cmd.c
drivers/nvme/target/configfs.c
drivers/nvme/target/nvmet.h

index 2962794ce881ee6f9947e641dceeec937af002b4..b73f5fde4d9e29a180aeba729f6187b2c4a4d881 100644 (file)
@@ -522,9 +522,8 @@ static void nvmet_execute_identify_ctrl(struct nvmet_req *req)
                goto out;
        }
 
-       /* XXX: figure out how to assign real vendors IDs. */
-       id->vid = 0;
-       id->ssvid = 0;
+       id->vid = cpu_to_le16(subsys->vendor_id);
+       id->ssvid = cpu_to_le16(subsys->subsys_vendor_id);
 
        memcpy(id->sn, ctrl->subsys->serial, NVMET_SN_MAX_SIZE);
        memcpy_and_pad(id->mn, sizeof(id->mn), subsys->model_number,
index eeee9e9b854c12602d5a2939c3978ac492302949..4b2b8e7d96f566bf23247b6eba994c84a23e84d4 100644 (file)
@@ -1412,6 +1412,49 @@ out_unlock:
 }
 CONFIGFS_ATTR(nvmet_subsys_, attr_cntlid_max);
 
+static ssize_t nvmet_subsys_attr_vendor_id_show(struct config_item *item,
+               char *page)
+{
+       return snprintf(page, PAGE_SIZE, "0x%x\n", to_subsys(item)->vendor_id);
+}
+
+static ssize_t nvmet_subsys_attr_vendor_id_store(struct config_item *item,
+               const char *page, size_t count)
+{
+       u16 vid;
+
+       if (kstrtou16(page, 0, &vid))
+               return -EINVAL;
+
+       down_write(&nvmet_config_sem);
+       to_subsys(item)->vendor_id = vid;
+       up_write(&nvmet_config_sem);
+       return count;
+}
+CONFIGFS_ATTR(nvmet_subsys_, attr_vendor_id);
+
+static ssize_t nvmet_subsys_attr_subsys_vendor_id_show(struct config_item *item,
+               char *page)
+{
+       return snprintf(page, PAGE_SIZE, "0x%x\n",
+                       to_subsys(item)->subsys_vendor_id);
+}
+
+static ssize_t nvmet_subsys_attr_subsys_vendor_id_store(struct config_item *item,
+               const char *page, size_t count)
+{
+       u16 ssvid;
+
+       if (kstrtou16(page, 0, &ssvid))
+               return -EINVAL;
+
+       down_write(&nvmet_config_sem);
+       to_subsys(item)->subsys_vendor_id = ssvid;
+       up_write(&nvmet_config_sem);
+       return count;
+}
+CONFIGFS_ATTR(nvmet_subsys_, attr_subsys_vendor_id);
+
 static ssize_t nvmet_subsys_attr_model_show(struct config_item *item,
                                            char *page)
 {
@@ -1640,6 +1683,8 @@ static struct configfs_attribute *nvmet_subsys_attrs[] = {
        &nvmet_subsys_attr_attr_serial,
        &nvmet_subsys_attr_attr_cntlid_min,
        &nvmet_subsys_attr_attr_cntlid_max,
+       &nvmet_subsys_attr_attr_vendor_id,
+       &nvmet_subsys_attr_attr_subsys_vendor_id,
        &nvmet_subsys_attr_attr_model,
        &nvmet_subsys_attr_attr_qid_max,
        &nvmet_subsys_attr_attr_ieee_oui,
index 58328b35dc9682787809bc61715e054260b50a72..e4a31a37c14b6260916057f088d3f24e6db42501 100644 (file)
@@ -324,6 +324,8 @@ struct nvmet_subsys {
        struct config_group     namespaces_group;
        struct config_group     allowed_hosts_group;
 
+       u16                     vendor_id;
+       u16                     subsys_vendor_id;
        char                    *model_number;
        u32                     ieee_oui;
        char                    *firmware_rev;