aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/md/dm-raid.c
diff options
context:
space:
mode:
authorHeinz Mauelshagen <heinzm@redhat.com>2016-06-13 19:46:03 -0400
committerMike Snitzer <snitzer@redhat.com>2016-06-14 18:52:13 -0400
commit4257e085e26edaba0bf516ea231bd5122e3f3e6f (patch)
tree1efc21fe533f65c0b62c896d179d28a1acb29878 /drivers/md/dm-raid.c
parentd41bfed091db0bdc2e0b2e847e0773a461f9e225 (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.c11
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);