X-Git-Url: http://git.ipfire.org/?p=thirdparty%2Fmdadm.git;a=blobdiff_plain;f=platform-intel.c;h=61749085307b4b826ceee3528f2786448107a681;hp=03e4ba79608ba694d6e80c1733bbf1ffaba80d8b;hb=e5408a3202c09267f780d53334c369793534a7e8;hpb=45b662b611a6fbbdd018a65b6f205e91df884c37 diff --git a/platform-intel.c b/platform-intel.c index 03e4ba79..61749085 100644 --- a/platform-intel.c +++ b/platform-intel.c @@ -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,16 +161,39 @@ 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) 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; /* 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); @@ -179,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);