diff options
author | Jonathan Brassow <jbrassow@redhat.com> | 2011-08-02 07:32:07 -0400 |
---|---|---|
committer | Alasdair G Kergon <agk@redhat.com> | 2011-08-02 07:32:07 -0400 |
commit | 46bed2b5c16bb7c82e1088d7ae75fb958c8a8c4e (patch) | |
tree | bab932a8eec324ca470407ff54097d86a3c0e27f /drivers/md | |
parent | c1084561bb85da3630540ebe951749a8cd8fc714 (diff) |
dm raid: add write_mostly parameter
Add the write_mostly parameter to RAID1 dm-raid tables.
This allows the user to set the WriteMostly flag on a RAID1 device that
should normally be avoided for read I/O.
Signed-off-by: Jonathan Brassow <jbrassow@redhat.com>
Signed-off-by: Alasdair G Kergon <agk@redhat.com>
Diffstat (limited to 'drivers/md')
-rw-r--r-- | drivers/md/dm-raid.c | 26 |
1 files changed, 25 insertions, 1 deletions
diff --git a/drivers/md/dm-raid.c b/drivers/md/dm-raid.c index a8a1915a450d..88143a0303d2 100644 --- a/drivers/md/dm-raid.c +++ b/drivers/md/dm-raid.c | |||
@@ -308,6 +308,7 @@ static int validate_region_size(struct raid_set *rs, unsigned long region_size) | |||
308 | * [daemon_sleep <ms>] Time between bitmap daemon work to clear bits | 308 | * [daemon_sleep <ms>] Time between bitmap daemon work to clear bits |
309 | * [min_recovery_rate <kB/sec/disk>] Throttle RAID initialization | 309 | * [min_recovery_rate <kB/sec/disk>] Throttle RAID initialization |
310 | * [max_recovery_rate <kB/sec/disk>] Throttle RAID initialization | 310 | * [max_recovery_rate <kB/sec/disk>] Throttle RAID initialization |
311 | * [write_mostly <idx>] Indicate a write mostly drive via index | ||
311 | * [max_write_behind <sectors>] See '-write-behind=' (man mdadm) | 312 | * [max_write_behind <sectors>] See '-write-behind=' (man mdadm) |
312 | * [stripe_cache <sectors>] Stripe cache size for higher RAIDs | 313 | * [stripe_cache <sectors>] Stripe cache size for higher RAIDs |
313 | * [region_size <sectors>] Defines granularity of bitmap | 314 | * [region_size <sectors>] Defines granularity of bitmap |
@@ -376,7 +377,21 @@ static int parse_raid_params(struct raid_set *rs, char **argv, | |||
376 | clear_bit(In_sync, &rs->dev[value].rdev.flags); | 377 | clear_bit(In_sync, &rs->dev[value].rdev.flags); |
377 | rs->dev[value].rdev.recovery_offset = 0; | 378 | rs->dev[value].rdev.recovery_offset = 0; |
378 | rs->print_flags |= DMPF_REBUILD; | 379 | rs->print_flags |= DMPF_REBUILD; |
380 | } else if (!strcasecmp(key, "write_mostly")) { | ||
381 | if (rs->raid_type->level != 1) { | ||
382 | rs->ti->error = "write_mostly option is only valid for RAID1"; | ||
383 | return -EINVAL; | ||
384 | } | ||
385 | if (value > rs->md.raid_disks) { | ||
386 | rs->ti->error = "Invalid write_mostly drive index given"; | ||
387 | return -EINVAL; | ||
388 | } | ||
389 | set_bit(WriteMostly, &rs->dev[value].rdev.flags); | ||
379 | } else if (!strcasecmp(key, "max_write_behind")) { | 390 | } else if (!strcasecmp(key, "max_write_behind")) { |
391 | if (rs->raid_type->level != 1) { | ||
392 | rs->ti->error = "max_write_behind option is only valid for RAID1"; | ||
393 | return -EINVAL; | ||
394 | } | ||
380 | rs->print_flags |= DMPF_MAX_WRITE_BEHIND; | 395 | rs->print_flags |= DMPF_MAX_WRITE_BEHIND; |
381 | 396 | ||
382 | /* | 397 | /* |
@@ -621,11 +636,15 @@ static int raid_status(struct dm_target *ti, status_type_t type, | |||
621 | break; | 636 | break; |
622 | case STATUSTYPE_TABLE: | 637 | case STATUSTYPE_TABLE: |
623 | /* The string you would use to construct this array */ | 638 | /* The string you would use to construct this array */ |
624 | for (i = 0; i < rs->md.raid_disks; i++) | 639 | for (i = 0; i < rs->md.raid_disks; i++) { |
625 | if ((rs->print_flags & DMPF_REBUILD) && | 640 | if ((rs->print_flags & DMPF_REBUILD) && |
626 | rs->dev[i].data_dev && | 641 | rs->dev[i].data_dev && |
627 | !test_bit(In_sync, &rs->dev[i].rdev.flags)) | 642 | !test_bit(In_sync, &rs->dev[i].rdev.flags)) |
628 | raid_param_cnt += 2; /* for rebuilds */ | 643 | raid_param_cnt += 2; /* for rebuilds */ |
644 | if (rs->dev[i].data_dev && | ||
645 | test_bit(WriteMostly, &rs->dev[i].rdev.flags)) | ||
646 | raid_param_cnt += 2; | ||
647 | } | ||
629 | 648 | ||
630 | raid_param_cnt += (hweight64(rs->print_flags & ~DMPF_REBUILD) * 2); | 649 | raid_param_cnt += (hweight64(rs->print_flags & ~DMPF_REBUILD) * 2); |
631 | if (rs->print_flags & (DMPF_SYNC | DMPF_NOSYNC)) | 650 | if (rs->print_flags & (DMPF_SYNC | DMPF_NOSYNC)) |
@@ -656,6 +675,11 @@ static int raid_status(struct dm_target *ti, status_type_t type, | |||
656 | if (rs->print_flags & DMPF_MAX_RECOVERY_RATE) | 675 | if (rs->print_flags & DMPF_MAX_RECOVERY_RATE) |
657 | DMEMIT(" max_recovery_rate %d", rs->md.sync_speed_max); | 676 | DMEMIT(" max_recovery_rate %d", rs->md.sync_speed_max); |
658 | 677 | ||
678 | for (i = 0; i < rs->md.raid_disks; i++) | ||
679 | if (rs->dev[i].data_dev && | ||
680 | test_bit(WriteMostly, &rs->dev[i].rdev.flags)) | ||
681 | DMEMIT(" write_mostly %u", i); | ||
682 | |||
659 | if (rs->print_flags & DMPF_MAX_WRITE_BEHIND) | 683 | if (rs->print_flags & DMPF_MAX_WRITE_BEHIND) |
660 | DMEMIT(" max_write_behind %lu", | 684 | DMEMIT(" max_write_behind %lu", |
661 | rs->md.bitmap_info.max_write_behind); | 685 | rs->md.bitmap_info.max_write_behind); |