summaryrefslogtreecommitdiffstats
path: root/super-intel.c
diff options
context:
space:
mode:
authorAlexey Obitotskiy <aleksey.obitotskiy@intel.com>2017-01-09 13:12:22 +0100
committerJes Sorensen <Jes.Sorensen@gmail.com>2017-01-09 13:48:55 +0100
commitd3c11416584cc973d0032dd0ff85ae86af8c13da (patch)
tree077c3b1649d7433a334dcbed211fc70e1fd138a3 /super-intel.c
parentDon't assume VMD sysfs path ends with a disk entry (diff)
downloadmdadm-d3c11416584cc973d0032dd0ff85ae86af8c13da.tar.xz
mdadm-d3c11416584cc973d0032dd0ff85ae86af8c13da.zip
imsm: count arrays under VMD HBAs correctly
OROM defines maximum number of arrays supported. On array creation mdadm checks if number of arrays doesn't exceed that limit, however it is not calculated correctly for VMD now. The current code performs a lookup of HBA using the id. VMD HBAs have the same id so each lookup returns the same structure (first encountered). Take a different approach for VMD HBAs. As id is not unique and cannot be used for lookups, iterate over all VMD HBAs and compare both id and HBA path. Signed-off-by: Alexey Obitotskiy <aleksey.obitotskiy@intel.com> Signed-off-by: Jes Sorensen <Jes.Sorensen@gmail.com>
Diffstat (limited to 'super-intel.c')
-rw-r--r--super-intel.c48
1 files changed, 36 insertions, 12 deletions
diff --git a/super-intel.c b/super-intel.c
index 0817a1fe..4e86796c 100644
--- a/super-intel.c
+++ b/super-intel.c
@@ -6483,20 +6483,20 @@ count_volumes_list(struct md_list *devlist, char *homehost,
return count;
}
-static int
-count_volumes(struct intel_hba *hba, int dpa, int verbose)
+static int __count_volumes(char *hba_path, int dpa, int verbose,
+ int cmp_hba_path)
{
struct sys_dev *idev, *intel_devices = find_intel_devices();
int count = 0;
const struct orom_entry *entry;
struct devid_list *dv, *devid_list;
- if (!hba || !hba->path)
+ if (!hba_path)
return 0;
for (idev = intel_devices; idev; idev = idev->next) {
- if (strstr(idev->path, hba->path))
- break;
+ if (strstr(idev->path, hba_path))
+ break;
}
if (!idev || !idev->dev_id)
@@ -6510,22 +6510,28 @@ count_volumes(struct intel_hba *hba, int dpa, int verbose)
devid_list = entry->devid_list;
for (dv = devid_list; dv; dv = dv->next) {
struct md_list *devlist;
- struct sys_dev *device = device_by_id(dv->devid);
- char *hba_path;
+ struct sys_dev *device = NULL;
+ char *hpath;
int found = 0;
+ if (cmp_hba_path)
+ device = device_by_id_and_path(dv->devid, hba_path);
+ else
+ device = device_by_id(dv->devid);
+
if (device)
- hba_path = device->path;
+ hpath = device->path;
else
return 0;
- devlist = get_devices(hba_path);
+ devlist = get_devices(hpath);
/* if no intel devices return zero volumes */
if (devlist == NULL)
return 0;
- count += active_arrays_by_format("imsm", hba_path, &devlist, dpa, verbose);
- dprintf("path: %s active arrays: %d\n", hba_path, count);
+ count += active_arrays_by_format("imsm", hpath, &devlist, dpa,
+ verbose);
+ dprintf("path: %s active arrays: %d\n", hpath, count);
if (devlist == NULL)
return 0;
do {
@@ -6537,7 +6543,7 @@ count_volumes(struct intel_hba *hba, int dpa, int verbose)
dprintf("found %d count: %d\n", found, count);
} while (found);
- dprintf("path: %s total number of volumes: %d\n", hba_path, count);
+ dprintf("path: %s total number of volumes: %d\n", hpath, count);
while (devlist) {
struct md_list *dv = devlist;
@@ -6549,6 +6555,24 @@ count_volumes(struct intel_hba *hba, int dpa, int verbose)
return count;
}
+static int count_volumes(struct intel_hba *hba, int dpa, int verbose)
+{
+ if (!hba)
+ return 0;
+ if (hba->type == SYS_DEV_VMD) {
+ struct sys_dev *dev;
+ int count = 0;
+
+ for (dev = find_intel_devices(); dev; dev = dev->next) {
+ if (dev->type == SYS_DEV_VMD)
+ count += __count_volumes(dev->path, dpa,
+ verbose, 1);
+ }
+ return count;
+ }
+ return __count_volumes(hba->path, dpa, verbose, 0);
+}
+
static int imsm_default_chunk(const struct imsm_orom *orom)
{
/* up to 512 if the plaform supports it, otherwise the platform max.