diff options
author | Heinz Mauelshagen <heinzm@redhat.com> | 2016-06-13 19:46:03 -0400 |
---|---|---|
committer | Mike Snitzer <snitzer@redhat.com> | 2016-06-14 18:52:13 -0400 |
commit | 4257e085e26edaba0bf516ea231bd5122e3f3e6f (patch) | |
tree | 1efc21fe533f65c0b62c896d179d28a1acb29878 /drivers/md/dm-raid.c | |
parent | d41bfed091db0bdc2e0b2e847e0773a461f9e225 (diff) |
dm raid: support to change bitmap region size
Signed-off-by: Heinz Mauelshagen <heinzm@redhat.com>
Signed-off-by: Mike Snitzer <snitzer@redhat.com>
Diffstat (limited to 'drivers/md/dm-raid.c')
-rw-r--r-- | drivers/md/dm-raid.c | 11 |
1 files changed, 11 insertions, 0 deletions
diff --git a/drivers/md/dm-raid.c b/drivers/md/dm-raid.c index e4c41232107f..7df450877423 100644 --- a/drivers/md/dm-raid.c +++ b/drivers/md/dm-raid.c | |||
@@ -217,6 +217,7 @@ struct raid_set { | |||
217 | int delta_disks; | 217 | int delta_disks; |
218 | int data_offset; | 218 | int data_offset; |
219 | int raid10_copies; | 219 | int raid10_copies; |
220 | int requested_bitmap_chunk_sectors; | ||
220 | 221 | ||
221 | struct mddev md; | 222 | struct mddev md; |
222 | struct raid_type *raid_type; | 223 | struct raid_type *raid_type; |
@@ -1277,6 +1278,7 @@ static int parse_raid_params(struct raid_set *rs, struct dm_arg_set *as, | |||
1277 | } | 1278 | } |
1278 | 1279 | ||
1279 | region_size = value; | 1280 | region_size = value; |
1281 | rs->requested_bitmap_chunk_sectors = value; | ||
1280 | } else if (!strcasecmp(key, dm_raid_arg_name_by_flag(CTR_FLAG_RAID10_COPIES))) { | 1282 | } else if (!strcasecmp(key, dm_raid_arg_name_by_flag(CTR_FLAG_RAID10_COPIES))) { |
1281 | if (test_and_set_bit(__CTR_FLAG_RAID10_COPIES, &rs->ctr_flags)) { | 1283 | if (test_and_set_bit(__CTR_FLAG_RAID10_COPIES, &rs->ctr_flags)) { |
1282 | rs->ti->error = "Only one raid10_copies argument pair allowed"; | 1284 | rs->ti->error = "Only one raid10_copies argument pair allowed"; |
@@ -3401,6 +3403,15 @@ static int raid_preresume(struct dm_target *ti) | |||
3401 | if (r) | 3403 | if (r) |
3402 | return r; | 3404 | return r; |
3403 | 3405 | ||
3406 | /* Resize bitmap to adjust to changed region size (aka MD bitmap chunksize) */ | ||
3407 | if (test_bit(RT_FLAG_RS_BITMAP_LOADED, &rs->runtime_flags) && | ||
3408 | mddev->bitmap_info.chunksize != to_bytes(rs->requested_bitmap_chunk_sectors)) { | ||
3409 | r = bitmap_resize(mddev->bitmap, mddev->dev_sectors, | ||
3410 | to_bytes(rs->requested_bitmap_chunk_sectors), 0); | ||
3411 | if (r) | ||
3412 | DMERR("Failed to resize bitmap"); | ||
3413 | } | ||
3414 | |||
3404 | /* Check for any resize/reshape on @rs and adjust/initiate */ | 3415 | /* Check for any resize/reshape on @rs and adjust/initiate */ |
3405 | /* Be prepared for mddev_resume() in raid_resume() */ | 3416 | /* Be prepared for mddev_resume() in raid_resume() */ |
3406 | set_bit(MD_RECOVERY_FROZEN, &mddev->recovery); | 3417 | set_bit(MD_RECOVERY_FROZEN, &mddev->recovery); |