You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
64 lines
2.0 KiB
64 lines
2.0 KiB
commit f2cc4f7d829e1b849e78bdf6c38b7bd6e234c600 |
|
Author: Alexey Obitotskiy <aleksey.obitotskiy@intel.com> |
|
Date: Tue May 9 12:25:45 2017 +0200 |
|
|
|
imsm: don't allow disks with different sector size in one array |
|
|
|
As there is no support in IMSM for arrays including disks with different |
|
sector sizes, don't allow to create such configuration. Also skip the |
|
disk with unsuitable sector size when looking for spares in the same |
|
container. |
|
|
|
Signed-off-by: Alexey Obitotskiy <aleksey.obitotskiy@intel.com> |
|
Signed-off-by: Tomasz Majchrzak <tomasz.majchrzak@intel.com> |
|
Signed-off-by: Jes Sorensen <jsorensen@fb.com> |
|
|
|
diff --git a/super-intel.c b/super-intel.c |
|
index cfb10d5..e88fe82 100644 |
|
--- a/super-intel.c |
|
+++ b/super-intel.c |
|
@@ -5468,6 +5468,22 @@ static int init_super_imsm(struct supertype *st, mdu_array_info_t *info, |
|
return 1; |
|
} |
|
|
|
+static int drive_validate_sector_size(struct intel_super *super, struct dl *dl) |
|
+{ |
|
+ unsigned int member_sector_size; |
|
+ |
|
+ if (dl->fd < 0) { |
|
+ pr_err("Invalid file descriptor for %s\n", dl->devname); |
|
+ return 0; |
|
+ } |
|
+ |
|
+ if (!get_dev_sector_size(dl->fd, dl->devname, &member_sector_size)) |
|
+ return 0; |
|
+ if (member_sector_size != super->sector_size) |
|
+ return 0; |
|
+ return 1; |
|
+} |
|
+ |
|
static int add_to_super_imsm_volume(struct supertype *st, mdu_disk_info_t *dk, |
|
int fd, char *devname) |
|
{ |
|
@@ -5507,6 +5523,11 @@ static int add_to_super_imsm_volume(struct supertype *st, mdu_disk_info_t *dk, |
|
return 1; |
|
} |
|
|
|
+ if (!drive_validate_sector_size(super, dl)) { |
|
+ pr_err("Combining drives of different sector size in one volume is not allowed\n"); |
|
+ return 1; |
|
+ } |
|
+ |
|
/* add a pristine spare to the metadata */ |
|
if (dl->index < 0) { |
|
dl->index = super->anchor->num_disks; |
|
@@ -8440,6 +8461,9 @@ static struct dl *imsm_add_spare(struct intel_super *super, int slot, |
|
if (dl->index == -1 && !activate_new) |
|
continue; |
|
|
|
+ if (!drive_validate_sector_size(super, dl)) |
|
+ continue; |
|
+ |
|
/* Does this unused device have the requisite free space? |
|
* It needs to be able to cover all member volumes |
|
*/
|
|
|