]> git.ipfire.org Git - thirdparty/mdadm.git/commitdiff
imsm: limit support to first NVMe namespace
authorMariusz Tkaczyk <mariusz.tkaczyk@intel.com>
Wed, 4 Nov 2020 09:01:28 +0000 (10:01 +0100)
committerJes Sorensen <jsorensen@fb.com>
Wed, 25 Nov 2020 23:09:47 +0000 (18:09 -0500)
Due to metadata limitations NVMe multinamespace support has to be removed.

Signed-off-by: Mariusz Tkaczyk <mariusz.tkaczyk@intel.com>
platform-intel.c
platform-intel.h
super-intel.c

index 04bffc57accf483a64e570db705b3865f8acfd93..f1f6d4cd8fc3461946e2c895d3dd256f7f0c9485 100644 (file)
@@ -766,3 +766,34 @@ char *vmd_domain_to_controller(struct sys_dev *hba, char *buf)
        closedir(dir);
        return NULL;
 }
+/* Verify that NVMe drive is supported by IMSM
+ * Returns:
+ *     0 - not supported
+ *     1 - supported
+ */
+int imsm_is_nvme_supported(int disk_fd, int verbose)
+{
+       char nsid_path[PATH_MAX];
+       char buf[PATH_MAX];
+       struct stat stb;
+
+       if (disk_fd < 0)
+               return 0;
+
+       if (fstat(disk_fd, &stb))
+               return 0;
+
+       snprintf(nsid_path, PATH_MAX-1, "/sys/dev/block/%d:%d/nsid",
+                major(stb.st_rdev), minor(stb.st_rdev));
+
+       if (load_sys(nsid_path, buf, sizeof(buf))) {
+               pr_err("Cannot read %s, rejecting drive\n", nsid_path);
+               return 0;
+       }
+       if (strtoll(buf, NULL, 10) != 1) {
+               if (verbose)
+                       pr_err("Only first namespace is supported by IMSM, aborting\n");
+               return 0;
+       }
+       return 1;
+}
index 7cb370ef0adbdd81472424b9ebd0d76dc8662283..7371478e12fbbfece2c97d277b8587b05a4307c4 100644 (file)
@@ -251,4 +251,5 @@ const struct orom_entry *get_orom_entry_by_device_id(__u16 dev_id);
 const struct imsm_orom *get_orom_by_device_id(__u16 device_id);
 struct sys_dev *device_by_id(__u16 device_id);
 struct sys_dev *device_by_id_and_path(__u16 device_id, const char *path);
+int imsm_is_nvme_supported(int disk_fd, int verbose);
 char *vmd_domain_to_controller(struct sys_dev *hba, char *buf);
index 95f4eaf8234dec097e3ac157bec4b0839d9a45f6..715febf7bff30acd1145159c68e2b0cb53e1bb2f 100644 (file)
@@ -2364,7 +2364,9 @@ static int print_nvme_info(struct sys_dev *hba)
                                continue;
                        if (path_attached_to_hba(rp, hba->path)) {
                                fd = open_dev(ent->d_name);
-                               if (fd < 0) {
+                               if (!imsm_is_nvme_supported(fd, 0)) {
+                                       if (fd >= 0)
+                                               close(fd);
                                        free(rp);
                                        continue;
                                }
@@ -5868,6 +5870,13 @@ static int add_to_super_imsm(struct supertype *st, mdu_disk_info_t *dk,
                snprintf(controller_path, PATH_MAX-1, "%s/device", devpath);
                free(devpath);
 
+               if (!imsm_is_nvme_supported(dd->fd, 1)) {
+                       if (dd->devname)
+                               free(dd->devname);
+                       free(dd);
+                       return 1;
+               }
+
                if (devpath_to_vendor(controller_path) == 0x8086) {
                        /*
                         * If Intel's NVMe drive has serial ended with