|
@@ -1138,8 +1138,11 @@ static int super_90_load(mdk_rdev_t *rdev, mdk_rdev_t *refdev, int minor_version
|
|
ret = 0;
|
|
ret = 0;
|
|
}
|
|
}
|
|
rdev->sectors = rdev->sb_start;
|
|
rdev->sectors = rdev->sb_start;
|
|
|
|
+ /* Limit to 4TB as metadata cannot record more than that */
|
|
|
|
+ if (rdev->sectors >= (2ULL << 32))
|
|
|
|
+ rdev->sectors = (2ULL << 32) - 2;
|
|
|
|
|
|
- if (rdev->sectors < sb->size * 2 && sb->level > 1)
|
|
|
|
|
|
+ if (rdev->sectors < ((sector_t)sb->size) * 2 && sb->level >= 1)
|
|
/* "this cannot possibly happen" ... */
|
|
/* "this cannot possibly happen" ... */
|
|
ret = -EINVAL;
|
|
ret = -EINVAL;
|
|
|
|
|
|
@@ -1173,7 +1176,7 @@ static int super_90_validate(mddev_t *mddev, mdk_rdev_t *rdev)
|
|
mddev->clevel[0] = 0;
|
|
mddev->clevel[0] = 0;
|
|
mddev->layout = sb->layout;
|
|
mddev->layout = sb->layout;
|
|
mddev->raid_disks = sb->raid_disks;
|
|
mddev->raid_disks = sb->raid_disks;
|
|
- mddev->dev_sectors = sb->size * 2;
|
|
|
|
|
|
+ mddev->dev_sectors = ((sector_t)sb->size) * 2;
|
|
mddev->events = ev1;
|
|
mddev->events = ev1;
|
|
mddev->bitmap_info.offset = 0;
|
|
mddev->bitmap_info.offset = 0;
|
|
mddev->bitmap_info.default_offset = MD_SB_BYTES >> 9;
|
|
mddev->bitmap_info.default_offset = MD_SB_BYTES >> 9;
|
|
@@ -1415,6 +1418,11 @@ super_90_rdev_size_change(mdk_rdev_t *rdev, sector_t num_sectors)
|
|
rdev->sb_start = calc_dev_sboffset(rdev);
|
|
rdev->sb_start = calc_dev_sboffset(rdev);
|
|
if (!num_sectors || num_sectors > rdev->sb_start)
|
|
if (!num_sectors || num_sectors > rdev->sb_start)
|
|
num_sectors = rdev->sb_start;
|
|
num_sectors = rdev->sb_start;
|
|
|
|
+ /* Limit to 4TB as metadata cannot record more than that.
|
|
|
|
+ * 4TB == 2^32 KB, or 2*2^32 sectors.
|
|
|
|
+ */
|
|
|
|
+ if (num_sectors >= (2ULL << 32))
|
|
|
|
+ num_sectors = (2ULL << 32) - 2;
|
|
md_super_write(rdev->mddev, rdev, rdev->sb_start, rdev->sb_size,
|
|
md_super_write(rdev->mddev, rdev, rdev->sb_start, rdev->sb_size,
|
|
rdev->sb_page);
|
|
rdev->sb_page);
|
|
md_super_wait(rdev->mddev);
|
|
md_super_wait(rdev->mddev);
|