nvmet: preserve controller serial number between reboots
authorJohannes Thumshirn <jthumshirn@suse.de>
Fri, 14 Jul 2017 13:36:56 +0000 (15:36 +0200)
committerJens Axboe <axboe@kernel.dk>
Thu, 20 Jul 2017 14:41:56 +0000 (08:41 -0600)
The NVMe target has no way to preserve controller serial
IDs across reboots which breaks udev scripts doing
SYMLINK+="dev/disk/by-id/nvme-$env{ID_SERIAL}-part%n.

Export the randomly generated serial number via configfs and allow
setting of a serial via configfs to mitigate this breakage.

Signed-off-by: Johannes Thumshirn <jthumshirn@suse.de>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
drivers/nvme/target/configfs.c

index ceee57bb0c24785e2a6848647092bb58ca13a23f..0a0067e771f59d89114a07b5e12b307b820b2670 100644 (file)
@@ -686,9 +686,31 @@ static ssize_t nvmet_subsys_attr_version_store(struct config_item *item,
 }
 CONFIGFS_ATTR(nvmet_subsys_, attr_version);
 
+static ssize_t nvmet_subsys_attr_serial_show(struct config_item *item,
+                                            char *page)
+{
+       struct nvmet_subsys *subsys = to_subsys(item);
+
+       return snprintf(page, PAGE_SIZE, "%llx\n", subsys->serial);
+}
+
+static ssize_t nvmet_subsys_attr_serial_store(struct config_item *item,
+                                             const char *page, size_t count)
+{
+       struct nvmet_subsys *subsys = to_subsys(item);
+
+       down_write(&nvmet_config_sem);
+       sscanf(page, "%llx\n", &subsys->serial);
+       up_write(&nvmet_config_sem);
+
+       return count;
+}
+CONFIGFS_ATTR(nvmet_subsys_, attr_serial);
+
 static struct configfs_attribute *nvmet_subsys_attrs[] = {
        &nvmet_subsys_attr_attr_allow_any_host,
        &nvmet_subsys_attr_attr_version,
+       &nvmet_subsys_attr_attr_serial,
        NULL,
 };