]> git.ipfire.org Git - thirdparty/mdadm.git/blobdiff - platform-intel.c
imsm: kill "auto=" in brief_examine_super_imsm
[thirdparty/mdadm.git] / platform-intel.c
index 6cd5830aa446802e0f996d9c93e0a62efc5c810c..5160227be222e20682ef73d631566c98b4bc018e 100644 (file)
@@ -162,6 +162,24 @@ const struct imsm_orom *find_imsm_orom(void)
        if (populated)
                return &imsm_orom;
 
+       if (check_env("IMSM_TEST_OROM")) {
+               memset(&imsm_orom, 0, sizeof(imsm_orom));
+               imsm_orom.rlc = IMSM_OROM_RLC_RAID0 | IMSM_OROM_RLC_RAID1 |
+                               IMSM_OROM_RLC_RAID10 | IMSM_OROM_RLC_RAID5;
+               imsm_orom.sss = IMSM_OROM_SSS_4kB | IMSM_OROM_SSS_8kB |
+                               IMSM_OROM_SSS_16kB | IMSM_OROM_SSS_32kB |
+                               IMSM_OROM_SSS_64kB | IMSM_OROM_SSS_128kB |
+                               IMSM_OROM_SSS_256kB | IMSM_OROM_SSS_512kB |
+                               IMSM_OROM_SSS_1MB | IMSM_OROM_SSS_2MB;
+               imsm_orom.dpa = 6;
+               imsm_orom.tds = 6;
+               imsm_orom.vpa = 2;
+               imsm_orom.vphba = 4;
+               imsm_orom.attr = imsm_orom.rlc | IMSM_OROM_ATTR_ChecksumVerify;
+               populated = 1;
+               return &imsm_orom;
+       }
+
        if (!platform_has_intel_ahci())
                return NULL;
 
@@ -176,3 +194,64 @@ const struct imsm_orom *find_imsm_orom(void)
                return &imsm_orom;
        return NULL;
 }
+
+char *devt_to_devpath(dev_t dev)
+{
+       char device[40];
+
+       sprintf(device, "/sys/dev/block/%d:%d/device", major(dev), minor(dev));
+       return canonicalize_file_name(device);
+}
+
+static char *diskfd_to_devpath(int fd)
+{
+       /* return the device path for a disk, return NULL on error or fd
+        * refers to a partition
+        */
+       struct stat st;
+
+       if (fstat(fd, &st) != 0)
+               return NULL;
+       if (!S_ISBLK(st.st_mode))
+               return NULL;
+
+       return devt_to_devpath(st.st_rdev);
+}
+
+int path_attached_to_hba(const char *disk_path, const char *hba_path)
+{
+       int rc;
+
+       if (!disk_path || !hba_path)
+               return 0;
+
+       if (strncmp(disk_path, hba_path, strlen(hba_path)) == 0)
+               rc = 1;
+       else
+               rc = 0;
+
+       return rc;
+}
+
+int devt_attached_to_hba(dev_t dev, const char *hba_path)
+{
+       char *disk_path = devt_to_devpath(dev);
+       int rc = path_attached_to_hba(disk_path, hba_path);
+
+       if (disk_path)
+               free(disk_path);
+
+       return rc;
+}
+
+int disk_attached_to_hba(int fd, const char *hba_path)
+{
+       char *disk_path = diskfd_to_devpath(fd);
+       int rc = path_attached_to_hba(disk_path, hba_path);
+
+       if (disk_path)
+               free(disk_path);
+
+       return rc;
+}
+