summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLabun, Marcin <Marcin.Labun@intel.com>2011-03-10 11:50:54 +1100
committerNeilBrown <neilb@suse.de>2011-03-10 11:50:54 +1100
commit73408129505ddddc2559ec944ae83c6a1c8ec0f6 (patch)
tree664a84bcd21df60d90f78c7ab5b9ab4e1380136d
parentd54559f08abf40f533b6d9242f3545668cce78c1 (diff)
downloadmdadm-73408129505ddddc2559ec944ae83c6a1c8ec0f6.tar.gz
imsm: add maximum number of disk validation in RAID array
Arrays exceeding the OROM/EFI maximum number of supported disk are blocked in validate_geometry_imsm_orom function. Signed-off-by: Marcin Labun <marcin.labun@intel.com> Signed-off-by: NeilBrown <neilb@suse.de>
-rw-r--r--super-intel.c21
1 files changed, 19 insertions, 2 deletions
diff --git a/super-intel.c b/super-intel.c
index 4964942..663ce2d 100644
--- a/super-intel.c
+++ b/super-intel.c
@@ -4230,12 +4230,30 @@ static int is_raid_level_supported(const struct imsm_orom *orom, int level, int
return 0;
}
+
#define pr_vrb(fmt, arg...) (void) (verbose && fprintf(stderr, Name fmt, ##arg))
+/*
+ * validate volume parameters with OROM/EFI capabilities
+ */
static int
validate_geometry_imsm_orom(struct intel_super *super, int level, int layout,
int raiddisks, int *chunk, int verbose)
{
- if (!is_raid_level_supported(super->orom, level, raiddisks)) {
+#if DEBUG
+ verbose = 1;
+#endif
+ /* validate container capabilities */
+ if (super->orom && raiddisks > super->orom->tds) {
+ if (verbose)
+ fprintf(stderr, Name ": %d exceeds maximum number of"
+ " platform supported disks: %d\n",
+ raiddisks, super->orom->tds);
+ return 0;
+ }
+
+ /* capabilities of OROM tested - copied from validate_geometry_imsm_volume */
+ if (super->orom && (!is_raid_level_supported(super->orom, level,
+ raiddisks))) {
pr_vrb(": platform does not support raid%d with %d disk%s\n",
level, raiddisks, raiddisks > 1 ? "s" : "");
return 0;
@@ -4259,7 +4277,6 @@ validate_geometry_imsm_orom(struct intel_super *super, int level, int layout,
layout, level);
return 0;
}
-
return 1;
}