]> git.ipfire.org Git - thirdparty/mdadm.git/blobdiff - platform-intel.c
Provide a mdstat_ent to subarray helper
[thirdparty/mdadm.git] / platform-intel.c
index 5160227be222e20682ef73d631566c98b4bc018e..61749085307b4b826ceee3528f2786448107a681 100644 (file)
@@ -44,7 +44,7 @@ void free_sys_dev(struct sys_dev **list)
 struct sys_dev *find_driver_devices(const char *bus, const char *driver)
 {
        /* search sysfs for devices driven by 'driver' */
-       char path[256];
+       char path[292];
        char link[256];
        char *c;
        DIR *driver_dir;
@@ -57,13 +57,17 @@ struct sys_dev *find_driver_devices(const char *bus, const char *driver)
        if (!driver_dir)
                return NULL;
        for (de = readdir(driver_dir); de; de = readdir(driver_dir)) {
+               int n;
+
                /* is 'de' a device? check that the 'subsystem' link exists and
                 * that its target matches 'bus'
                 */
                sprintf(path, "/sys/bus/%s/drivers/%s/%s/subsystem",
                        bus, driver, de->d_name);
-               if (readlink(path, link, sizeof(link)) < 0)
+               n = readlink(path, link, sizeof(link));
+               if (n < 0 || n >= (int)sizeof(link))
                        continue;
+               link[n] = '\0';
                c = strrchr(link, '/');
                if (!c)
                        continue;
@@ -90,7 +94,7 @@ struct sys_dev *find_driver_devices(const char *bus, const char *driver)
                list->path = canonicalize_file_name(path);
                list->next = NULL;
        }
-
+       closedir(driver_dir);
        return head;
 }
 
@@ -157,6 +161,7 @@ static int scan(const void *start, const void *end)
 const struct imsm_orom *find_imsm_orom(void)
 {
        static int populated = 0;
+       unsigned long align;
 
        /* it's static data so we only need to read it once */
        if (populated)
@@ -184,7 +189,11 @@ const struct imsm_orom *find_imsm_orom(void)
                return NULL;
 
        /* scan option-rom memory looking for an imsm signature */
-       if (probe_roms_init() != 0)
+       if (check_env("IMSM_SAFE_OROM_SCAN"))
+               align = 2048;
+       else
+               align = 512;
+       if (probe_roms_init(align) != 0)
                return NULL;
        probe_roms();
        populated = scan_adapter_roms(scan);
@@ -197,7 +206,7 @@ const struct imsm_orom *find_imsm_orom(void)
 
 char *devt_to_devpath(dev_t dev)
 {
-       char device[40];
+       char device[46];
 
        sprintf(device, "/sys/dev/block/%d:%d/device", major(dev), minor(dev));
        return canonicalize_file_name(device);