aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/md/dm-raid.c
diff options
context:
space:
mode:
authorHeinz Mauelshagen <heinzm@redhat.com>2017-03-17 20:39:12 -0400
committerMike Snitzer <snitzer@redhat.com>2017-03-27 11:45:26 -0400
commit4464e36e06470e3d68dc26a874f0dbdffa09a6e8 (patch)
tree87f6c3f8d3167467ea2e9cefdd977ee4381ae1d7 /drivers/md/dm-raid.c
parent78e470c26f524f4706c2555613b9641d85190cbe (diff)
dm raid: fix table line argument order in status
Commit 3a1c1ef2f ("dm raid: enhance status interface and fixup takeover/raid0") added new table line arguments and introduced an ordering flaw. The sequence of the raid10_copies and raid10_format raid parameters got reversed which causes lvm2 userspace to fail by falsely assuming a changed table line. Sequence those 2 parameters as before so that old lvm2 can function properly with new kernels by adjusting the table line output as documented in Documentation/device-mapper/dm-raid.txt. Also, add missing version 1.10.1 highlight to the documention. Fixes: 3a1c1ef2f ("dm raid: enhance status interface and fixup takeover/raid0") 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.c62
1 files changed, 32 insertions, 30 deletions
diff --git a/drivers/md/dm-raid.c b/drivers/md/dm-raid.c
index f8564d63982f..e07185fca638 100644
--- a/drivers/md/dm-raid.c
+++ b/drivers/md/dm-raid.c
@@ -3382,38 +3382,28 @@ static void raid_status(struct dm_target *ti, status_type_t type,
3382 hweight32(rs->ctr_flags & CTR_FLAG_OPTIONS_NO_ARGS) + 3382 hweight32(rs->ctr_flags & CTR_FLAG_OPTIONS_NO_ARGS) +
3383 hweight32(rs->ctr_flags & CTR_FLAG_OPTIONS_ONE_ARG) * 2 + 3383 hweight32(rs->ctr_flags & CTR_FLAG_OPTIONS_ONE_ARG) * 2 +
3384 (test_bit(__CTR_FLAG_JOURNAL_DEV, &rs->ctr_flags) ? 2 : 0); 3384 (test_bit(__CTR_FLAG_JOURNAL_DEV, &rs->ctr_flags) ? 2 : 0);
3385
3385 /* Emit table line */ 3386 /* Emit table line */
3387 /* This has to be in the documented order for userspace! */
3386 DMEMIT("%s %u %u", rs->raid_type->name, raid_param_cnt, mddev->new_chunk_sectors); 3388 DMEMIT("%s %u %u", rs->raid_type->name, raid_param_cnt, mddev->new_chunk_sectors);
3387 if (test_bit(__CTR_FLAG_RAID10_FORMAT, &rs->ctr_flags))
3388 DMEMIT(" %s %s", dm_raid_arg_name_by_flag(CTR_FLAG_RAID10_FORMAT),
3389 raid10_md_layout_to_format(mddev->layout));
3390 if (test_bit(__CTR_FLAG_RAID10_COPIES, &rs->ctr_flags))
3391 DMEMIT(" %s %d", dm_raid_arg_name_by_flag(CTR_FLAG_RAID10_COPIES),
3392 raid10_md_layout_to_copies(mddev->layout));
3393 if (test_bit(__CTR_FLAG_NOSYNC, &rs->ctr_flags))
3394 DMEMIT(" %s", dm_raid_arg_name_by_flag(CTR_FLAG_NOSYNC));
3395 if (test_bit(__CTR_FLAG_SYNC, &rs->ctr_flags)) 3389 if (test_bit(__CTR_FLAG_SYNC, &rs->ctr_flags))
3396 DMEMIT(" %s", dm_raid_arg_name_by_flag(CTR_FLAG_SYNC)); 3390 DMEMIT(" %s", dm_raid_arg_name_by_flag(CTR_FLAG_SYNC));
3397 if (test_bit(__CTR_FLAG_REGION_SIZE, &rs->ctr_flags)) 3391 if (test_bit(__CTR_FLAG_NOSYNC, &rs->ctr_flags))
3398 DMEMIT(" %s %llu", dm_raid_arg_name_by_flag(CTR_FLAG_REGION_SIZE), 3392 DMEMIT(" %s", dm_raid_arg_name_by_flag(CTR_FLAG_NOSYNC));
3399 (unsigned long long) to_sector(mddev->bitmap_info.chunksize));
3400 if (test_bit(__CTR_FLAG_DATA_OFFSET, &rs->ctr_flags))
3401 DMEMIT(" %s %llu", dm_raid_arg_name_by_flag(CTR_FLAG_DATA_OFFSET),
3402 (unsigned long long) rs->data_offset);
3403 if (test_bit(__CTR_FLAG_DAEMON_SLEEP, &rs->ctr_flags))
3404 DMEMIT(" %s %lu", dm_raid_arg_name_by_flag(CTR_FLAG_DAEMON_SLEEP),
3405 mddev->bitmap_info.daemon_sleep);
3406 if (test_bit(__CTR_FLAG_DELTA_DISKS, &rs->ctr_flags))
3407 DMEMIT(" %s %d", dm_raid_arg_name_by_flag(CTR_FLAG_DELTA_DISKS),
3408 max(rs->delta_disks, mddev->delta_disks));
3409 if (test_bit(__CTR_FLAG_STRIPE_CACHE, &rs->ctr_flags))
3410 DMEMIT(" %s %d", dm_raid_arg_name_by_flag(CTR_FLAG_STRIPE_CACHE),
3411 max_nr_stripes);
3412 if (rebuild_disks) 3393 if (rebuild_disks)
3413 for (i = 0; i < rs->raid_disks; i++) 3394 for (i = 0; i < rs->raid_disks; i++)
3414 if (test_bit(rs->dev[i].rdev.raid_disk, (void *) rs->rebuild_disks)) 3395 if (test_bit(rs->dev[i].rdev.raid_disk, (void *) rs->rebuild_disks))
3415 DMEMIT(" %s %u", dm_raid_arg_name_by_flag(CTR_FLAG_REBUILD), 3396 DMEMIT(" %s %u", dm_raid_arg_name_by_flag(CTR_FLAG_REBUILD),
3416 rs->dev[i].rdev.raid_disk); 3397 rs->dev[i].rdev.raid_disk);
3398 if (test_bit(__CTR_FLAG_DAEMON_SLEEP, &rs->ctr_flags))
3399 DMEMIT(" %s %lu", dm_raid_arg_name_by_flag(CTR_FLAG_DAEMON_SLEEP),
3400 mddev->bitmap_info.daemon_sleep);
3401 if (test_bit(__CTR_FLAG_MIN_RECOVERY_RATE, &rs->ctr_flags))
3402 DMEMIT(" %s %d", dm_raid_arg_name_by_flag(CTR_FLAG_MIN_RECOVERY_RATE),
3403 mddev->sync_speed_min);
3404 if (test_bit(__CTR_FLAG_MAX_RECOVERY_RATE, &rs->ctr_flags))
3405 DMEMIT(" %s %d", dm_raid_arg_name_by_flag(CTR_FLAG_MAX_RECOVERY_RATE),
3406 mddev->sync_speed_max);
3417 if (write_mostly_params) 3407 if (write_mostly_params)
3418 for (i = 0; i < rs->raid_disks; i++) 3408 for (i = 0; i < rs->raid_disks; i++)
3419 if (test_bit(WriteMostly, &rs->dev[i].rdev.flags)) 3409 if (test_bit(WriteMostly, &rs->dev[i].rdev.flags))
@@ -3422,12 +3412,24 @@ static void raid_status(struct dm_target *ti, status_type_t type,
3422 if (test_bit(__CTR_FLAG_MAX_WRITE_BEHIND, &rs->ctr_flags)) 3412 if (test_bit(__CTR_FLAG_MAX_WRITE_BEHIND, &rs->ctr_flags))
3423 DMEMIT(" %s %lu", dm_raid_arg_name_by_flag(CTR_FLAG_MAX_WRITE_BEHIND), 3413 DMEMIT(" %s %lu", dm_raid_arg_name_by_flag(CTR_FLAG_MAX_WRITE_BEHIND),
3424 mddev->bitmap_info.max_write_behind); 3414 mddev->bitmap_info.max_write_behind);
3425 if (test_bit(__CTR_FLAG_MAX_RECOVERY_RATE, &rs->ctr_flags)) 3415 if (test_bit(__CTR_FLAG_STRIPE_CACHE, &rs->ctr_flags))
3426 DMEMIT(" %s %d", dm_raid_arg_name_by_flag(CTR_FLAG_MAX_RECOVERY_RATE), 3416 DMEMIT(" %s %d", dm_raid_arg_name_by_flag(CTR_FLAG_STRIPE_CACHE),
3427 mddev->sync_speed_max); 3417 max_nr_stripes);
3428 if (test_bit(__CTR_FLAG_MIN_RECOVERY_RATE, &rs->ctr_flags)) 3418 if (test_bit(__CTR_FLAG_REGION_SIZE, &rs->ctr_flags))
3429 DMEMIT(" %s %d", dm_raid_arg_name_by_flag(CTR_FLAG_MIN_RECOVERY_RATE), 3419 DMEMIT(" %s %llu", dm_raid_arg_name_by_flag(CTR_FLAG_REGION_SIZE),
3430 mddev->sync_speed_min); 3420 (unsigned long long) to_sector(mddev->bitmap_info.chunksize));
3421 if (test_bit(__CTR_FLAG_RAID10_COPIES, &rs->ctr_flags))
3422 DMEMIT(" %s %d", dm_raid_arg_name_by_flag(CTR_FLAG_RAID10_COPIES),
3423 raid10_md_layout_to_copies(mddev->layout));
3424 if (test_bit(__CTR_FLAG_RAID10_FORMAT, &rs->ctr_flags))
3425 DMEMIT(" %s %s", dm_raid_arg_name_by_flag(CTR_FLAG_RAID10_FORMAT),
3426 raid10_md_layout_to_format(mddev->layout));
3427 if (test_bit(__CTR_FLAG_DELTA_DISKS, &rs->ctr_flags))
3428 DMEMIT(" %s %d", dm_raid_arg_name_by_flag(CTR_FLAG_DELTA_DISKS),
3429 max(rs->delta_disks, mddev->delta_disks));
3430 if (test_bit(__CTR_FLAG_DATA_OFFSET, &rs->ctr_flags))
3431 DMEMIT(" %s %llu", dm_raid_arg_name_by_flag(CTR_FLAG_DATA_OFFSET),
3432 (unsigned long long) rs->data_offset);
3431 if (test_bit(__CTR_FLAG_JOURNAL_DEV, &rs->ctr_flags)) 3433 if (test_bit(__CTR_FLAG_JOURNAL_DEV, &rs->ctr_flags))
3432 DMEMIT(" %s %s", dm_raid_arg_name_by_flag(CTR_FLAG_JOURNAL_DEV), 3434 DMEMIT(" %s %s", dm_raid_arg_name_by_flag(CTR_FLAG_JOURNAL_DEV),
3433 __get_dev_name(rs->journal_dev.dev)); 3435 __get_dev_name(rs->journal_dev.dev));
@@ -3791,7 +3793,7 @@ static void raid_resume(struct dm_target *ti)
3791 3793
3792static struct target_type raid_target = { 3794static struct target_type raid_target = {
3793 .name = "raid", 3795 .name = "raid",
3794 .version = {1, 10, 1}, 3796 .version = {1, 11, 0},
3795 .module = THIS_MODULE, 3797 .module = THIS_MODULE,
3796 .ctr = raid_ctr, 3798 .ctr = raid_ctr,
3797 .dtr = raid_dtr, 3799 .dtr = raid_dtr,