diff options
author | NeilBrown <neilb@suse.de> | 2011-05-11 01:52:21 -0400 |
---|---|---|
committer | NeilBrown <neilb@suse.de> | 2011-05-11 01:52:21 -0400 |
commit | b098636cf04c89db4036fedc778da0acc666ad1a (patch) | |
tree | 11a970bdc482b4e5cb2211eefb9a71ae34355bd3 /drivers/md | |
parent | ab9d47e990c12c11cc95ed1247a3782234a7e33a (diff) |
md: allow resync_start to be set while an array is active.
The sysfs attribute 'resync_start' (known internally as recovery_cp),
records where a resync is up to. A value of 0 means the array is
not known to be in-sync at all. A value of MaxSector means the array
is believed to be fully in-sync.
When the size of member devices of an array (RAID1,RAID4/5/6) is
increased, the array can be increased to match. This process sets
resync_start to the old end-of-device offset so that the new part of
the array gets resynced.
However with RAID1 (and RAID6) a resync is not technically necessary
and may be undesirable. So it would be good if the implied resync
after the array is resized could be avoided.
So: change 'resync_start' so the value can be changed while the array
is active, and as a precaution only allow it to be changed while
resync/recovery is 'frozen'. Changing it once resync has started is
not going to be useful anyway.
This allows the array to be resized without a resync by:
write 'frozen' to 'sync_action'
write new size to 'component_size' (this will set resync_start)
write 'none' to 'resync_start'
write 'idle' to 'sync_action'.
Also slightly improve some tests on recovery_cp when resizing
raid1/raid5. Now that an arbitrary value could be set we should be
more careful in our tests.
Signed-off-by: NeilBrown <neilb@suse.de>
Diffstat (limited to 'drivers/md')
-rw-r--r-- | drivers/md/md.c | 2 | ||||
-rw-r--r-- | drivers/md/raid1.c | 2 | ||||
-rw-r--r-- | drivers/md/raid5.c | 3 |
3 files changed, 4 insertions, 3 deletions
diff --git a/drivers/md/md.c b/drivers/md/md.c index 5469ae35ee15..aa640a85bb21 100644 --- a/drivers/md/md.c +++ b/drivers/md/md.c | |||
@@ -3324,7 +3324,7 @@ resync_start_store(mddev_t *mddev, const char *buf, size_t len) | |||
3324 | char *e; | 3324 | char *e; |
3325 | unsigned long long n = simple_strtoull(buf, &e, 10); | 3325 | unsigned long long n = simple_strtoull(buf, &e, 10); |
3326 | 3326 | ||
3327 | if (mddev->pers) | 3327 | if (mddev->pers && !test_bit(MD_RECOVERY_FROZEN, &mddev->recovery)) |
3328 | return -EBUSY; | 3328 | return -EBUSY; |
3329 | if (cmd_match(buf, "none")) | 3329 | if (cmd_match(buf, "none")) |
3330 | n = MaxSector; | 3330 | n = MaxSector; |
diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c index 779abbd2bb1d..5d096096f958 100644 --- a/drivers/md/raid1.c +++ b/drivers/md/raid1.c | |||
@@ -2061,7 +2061,7 @@ static int raid1_resize(mddev_t *mddev, sector_t sectors) | |||
2061 | set_capacity(mddev->gendisk, mddev->array_sectors); | 2061 | set_capacity(mddev->gendisk, mddev->array_sectors); |
2062 | revalidate_disk(mddev->gendisk); | 2062 | revalidate_disk(mddev->gendisk); |
2063 | if (sectors > mddev->dev_sectors && | 2063 | if (sectors > mddev->dev_sectors && |
2064 | mddev->recovery_cp == MaxSector) { | 2064 | mddev->recovery_cp > mddev->dev_sectors) { |
2065 | mddev->recovery_cp = mddev->dev_sectors; | 2065 | mddev->recovery_cp = mddev->dev_sectors; |
2066 | set_bit(MD_RECOVERY_NEEDED, &mddev->recovery); | 2066 | set_bit(MD_RECOVERY_NEEDED, &mddev->recovery); |
2067 | } | 2067 | } |
diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c index 51af7f3bfe52..34dd54539f7b 100644 --- a/drivers/md/raid5.c +++ b/drivers/md/raid5.c | |||
@@ -5389,7 +5389,8 @@ static int raid5_resize(mddev_t *mddev, sector_t sectors) | |||
5389 | return -EINVAL; | 5389 | return -EINVAL; |
5390 | set_capacity(mddev->gendisk, mddev->array_sectors); | 5390 | set_capacity(mddev->gendisk, mddev->array_sectors); |
5391 | revalidate_disk(mddev->gendisk); | 5391 | revalidate_disk(mddev->gendisk); |
5392 | if (sectors > mddev->dev_sectors && mddev->recovery_cp == MaxSector) { | 5392 | if (sectors > mddev->dev_sectors && |
5393 | mddev->recovery_cp > mddev->dev_sectors) { | ||
5393 | mddev->recovery_cp = mddev->dev_sectors; | 5394 | mddev->recovery_cp = mddev->dev_sectors; |
5394 | set_bit(MD_RECOVERY_NEEDED, &mddev->recovery); | 5395 | set_bit(MD_RECOVERY_NEEDED, &mddev->recovery); |
5395 | } | 5396 | } |