|
@@ -1197,7 +1197,10 @@ static int super_90_validate(struct mddev *mddev, struct md_rdev *rdev)
|
|
mddev->dev_sectors = ((sector_t)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.space = 0;
|
|
|
|
+ /* bitmap can use 60 K after the 4K superblocks */
|
|
mddev->bitmap_info.default_offset = MD_SB_BYTES >> 9;
|
|
mddev->bitmap_info.default_offset = MD_SB_BYTES >> 9;
|
|
|
|
+ mddev->bitmap_info.default_space = 64*2 - (MD_SB_BYTES >> 9);
|
|
mddev->reshape_backwards = 0;
|
|
mddev->reshape_backwards = 0;
|
|
|
|
|
|
if (mddev->minor_version >= 91) {
|
|
if (mddev->minor_version >= 91) {
|
|
@@ -1234,9 +1237,12 @@ static int super_90_validate(struct mddev *mddev, struct md_rdev *rdev)
|
|
mddev->max_disks = MD_SB_DISKS;
|
|
mddev->max_disks = MD_SB_DISKS;
|
|
|
|
|
|
if (sb->state & (1<<MD_SB_BITMAP_PRESENT) &&
|
|
if (sb->state & (1<<MD_SB_BITMAP_PRESENT) &&
|
|
- mddev->bitmap_info.file == NULL)
|
|
|
|
|
|
+ mddev->bitmap_info.file == NULL) {
|
|
mddev->bitmap_info.offset =
|
|
mddev->bitmap_info.offset =
|
|
mddev->bitmap_info.default_offset;
|
|
mddev->bitmap_info.default_offset;
|
|
|
|
+ mddev->bitmap_info.space =
|
|
|
|
+ mddev->bitmap_info.space;
|
|
|
|
+ }
|
|
|
|
|
|
} else if (mddev->pers == NULL) {
|
|
} else if (mddev->pers == NULL) {
|
|
/* Insist on good event counter while assembling, except
|
|
/* Insist on good event counter while assembling, except
|
|
@@ -1677,7 +1683,12 @@ static int super_1_validate(struct mddev *mddev, struct md_rdev *rdev)
|
|
mddev->dev_sectors = le64_to_cpu(sb->size);
|
|
mddev->dev_sectors = le64_to_cpu(sb->size);
|
|
mddev->events = ev1;
|
|
mddev->events = ev1;
|
|
mddev->bitmap_info.offset = 0;
|
|
mddev->bitmap_info.offset = 0;
|
|
|
|
+ mddev->bitmap_info.space = 0;
|
|
|
|
+ /* Default location for bitmap is 1K after superblock
|
|
|
|
+ * using 3K - total of 4K
|
|
|
|
+ */
|
|
mddev->bitmap_info.default_offset = 1024 >> 9;
|
|
mddev->bitmap_info.default_offset = 1024 >> 9;
|
|
|
|
+ mddev->bitmap_info.default_space = (4096-1024) >> 9;
|
|
mddev->reshape_backwards = 0;
|
|
mddev->reshape_backwards = 0;
|
|
|
|
|
|
mddev->recovery_cp = le64_to_cpu(sb->resync_offset);
|
|
mddev->recovery_cp = le64_to_cpu(sb->resync_offset);
|
|
@@ -1686,9 +1697,23 @@ static int super_1_validate(struct mddev *mddev, struct md_rdev *rdev)
|
|
mddev->max_disks = (4096-256)/2;
|
|
mddev->max_disks = (4096-256)/2;
|
|
|
|
|
|
if ((le32_to_cpu(sb->feature_map) & MD_FEATURE_BITMAP_OFFSET) &&
|
|
if ((le32_to_cpu(sb->feature_map) & MD_FEATURE_BITMAP_OFFSET) &&
|
|
- mddev->bitmap_info.file == NULL )
|
|
|
|
|
|
+ mddev->bitmap_info.file == NULL) {
|
|
mddev->bitmap_info.offset =
|
|
mddev->bitmap_info.offset =
|
|
(__s32)le32_to_cpu(sb->bitmap_offset);
|
|
(__s32)le32_to_cpu(sb->bitmap_offset);
|
|
|
|
+ /* Metadata doesn't record how much space is available.
|
|
|
|
+ * For 1.0, we assume we can use up to the superblock
|
|
|
|
+ * if before, else to 4K beyond superblock.
|
|
|
|
+ * For others, assume no change is possible.
|
|
|
|
+ */
|
|
|
|
+ if (mddev->minor_version > 0)
|
|
|
|
+ mddev->bitmap_info.space = 0;
|
|
|
|
+ else if (mddev->bitmap_info.offset > 0)
|
|
|
|
+ mddev->bitmap_info.space =
|
|
|
|
+ 8 - mddev->bitmap_info.offset;
|
|
|
|
+ else
|
|
|
|
+ mddev->bitmap_info.space =
|
|
|
|
+ -mddev->bitmap_info.offset;
|
|
|
|
+ }
|
|
|
|
|
|
if ((le32_to_cpu(sb->feature_map) & MD_FEATURE_RESHAPE_ACTIVE)) {
|
|
if ((le32_to_cpu(sb->feature_map) & MD_FEATURE_RESHAPE_ACTIVE)) {
|
|
mddev->reshape_position = le64_to_cpu(sb->reshape_position);
|
|
mddev->reshape_position = le64_to_cpu(sb->reshape_position);
|
|
@@ -5280,6 +5305,7 @@ static void md_clean(struct mddev *mddev)
|
|
mddev->merge_check_needed = 0;
|
|
mddev->merge_check_needed = 0;
|
|
mddev->bitmap_info.offset = 0;
|
|
mddev->bitmap_info.offset = 0;
|
|
mddev->bitmap_info.default_offset = 0;
|
|
mddev->bitmap_info.default_offset = 0;
|
|
|
|
+ mddev->bitmap_info.default_space = 0;
|
|
mddev->bitmap_info.chunksize = 0;
|
|
mddev->bitmap_info.chunksize = 0;
|
|
mddev->bitmap_info.daemon_sleep = 0;
|
|
mddev->bitmap_info.daemon_sleep = 0;
|
|
mddev->bitmap_info.max_write_behind = 0;
|
|
mddev->bitmap_info.max_write_behind = 0;
|
|
@@ -6076,6 +6102,7 @@ static int set_array_info(struct mddev * mddev, mdu_array_info_t *info)
|
|
set_bit(MD_CHANGE_DEVS, &mddev->flags);
|
|
set_bit(MD_CHANGE_DEVS, &mddev->flags);
|
|
|
|
|
|
mddev->bitmap_info.default_offset = MD_SB_BYTES >> 9;
|
|
mddev->bitmap_info.default_offset = MD_SB_BYTES >> 9;
|
|
|
|
+ mddev->bitmap_info.default_space = 64*2 - (MD_SB_BYTES >> 9);
|
|
mddev->bitmap_info.offset = 0;
|
|
mddev->bitmap_info.offset = 0;
|
|
|
|
|
|
mddev->reshape_position = MaxSector;
|
|
mddev->reshape_position = MaxSector;
|
|
@@ -6258,6 +6285,8 @@ static int update_array_info(struct mddev *mddev, mdu_array_info_t *info)
|
|
return -EINVAL;
|
|
return -EINVAL;
|
|
mddev->bitmap_info.offset =
|
|
mddev->bitmap_info.offset =
|
|
mddev->bitmap_info.default_offset;
|
|
mddev->bitmap_info.default_offset;
|
|
|
|
+ mddev->bitmap_info.space =
|
|
|
|
+ mddev->bitmap_info.default_space;
|
|
mddev->pers->quiesce(mddev, 1);
|
|
mddev->pers->quiesce(mddev, 1);
|
|
rv = bitmap_create(mddev);
|
|
rv = bitmap_create(mddev);
|
|
if (!rv)
|
|
if (!rv)
|