diff options
author | NeilBrown <neilb@suse.de> | 2012-05-20 19:27:00 -0400 |
---|---|---|
committer | NeilBrown <neilb@suse.de> | 2012-05-20 19:27:00 -0400 |
commit | c6563a8c38fde3c1c7fc925a10bde3ca20799301 (patch) | |
tree | 3916ae8247149a9dcf39ee1ca262f97be39071eb /drivers/md/raid10.c | |
parent | 2c810cddc44d6f95cef75df3f07fc0850ff92417 (diff) |
md: add possibility to change data-offset for devices.
When reshaping we can avoid costly intermediate backup by
changing the 'start' address of the array on the device
(if there is enough room).
So as a first step, allow such a change to be requested
through sysfs, and recorded in v1.x metadata.
(As we didn't previous check that all 'pad' fields were zero,
we need a new FEATURE flag for this.
A (belatedly) check that all remaining 'pad' fields are
zero to avoid a repeat of this)
The new data offset must be requested separately for each device.
This allows each to have a different change in the data offset.
This is not likely to be used often but as data_offset can be
set per-device, new_data_offset should be too.
This patch also removes the 'acknowledged' arg to rdev_set_badblocks as
it is never used and never will be. At the same time we add a new
arg ('in_new') which is currently always zero but will be used more
soon.
When a reshape finishes we will need to update the data_offset
and rdev->sectors. So provide an exported function to do that.
Signed-off-by: NeilBrown <neilb@suse.de>
Diffstat (limited to 'drivers/md/raid10.c')
-rw-r--r-- | drivers/md/raid10.c | 8 |
1 files changed, 4 insertions, 4 deletions
diff --git a/drivers/md/raid10.c b/drivers/md/raid10.c index 3f91c2e1dfe7..832fb4d56657 100644 --- a/drivers/md/raid10.c +++ b/drivers/md/raid10.c | |||
@@ -2480,7 +2480,7 @@ static void handle_write_completed(struct r10conf *conf, struct r10bio *r10_bio) | |||
2480 | rdev_clear_badblocks( | 2480 | rdev_clear_badblocks( |
2481 | rdev, | 2481 | rdev, |
2482 | r10_bio->devs[m].addr, | 2482 | r10_bio->devs[m].addr, |
2483 | r10_bio->sectors); | 2483 | r10_bio->sectors, 0); |
2484 | } else { | 2484 | } else { |
2485 | if (!rdev_set_badblocks( | 2485 | if (!rdev_set_badblocks( |
2486 | rdev, | 2486 | rdev, |
@@ -2496,7 +2496,7 @@ static void handle_write_completed(struct r10conf *conf, struct r10bio *r10_bio) | |||
2496 | rdev_clear_badblocks( | 2496 | rdev_clear_badblocks( |
2497 | rdev, | 2497 | rdev, |
2498 | r10_bio->devs[m].addr, | 2498 | r10_bio->devs[m].addr, |
2499 | r10_bio->sectors); | 2499 | r10_bio->sectors, 0); |
2500 | } else { | 2500 | } else { |
2501 | if (!rdev_set_badblocks( | 2501 | if (!rdev_set_badblocks( |
2502 | rdev, | 2502 | rdev, |
@@ -2515,7 +2515,7 @@ static void handle_write_completed(struct r10conf *conf, struct r10bio *r10_bio) | |||
2515 | rdev_clear_badblocks( | 2515 | rdev_clear_badblocks( |
2516 | rdev, | 2516 | rdev, |
2517 | r10_bio->devs[m].addr, | 2517 | r10_bio->devs[m].addr, |
2518 | r10_bio->sectors); | 2518 | r10_bio->sectors, 0); |
2519 | rdev_dec_pending(rdev, conf->mddev); | 2519 | rdev_dec_pending(rdev, conf->mddev); |
2520 | } else if (bio != NULL && | 2520 | } else if (bio != NULL && |
2521 | !test_bit(BIO_UPTODATE, &bio->bi_flags)) { | 2521 | !test_bit(BIO_UPTODATE, &bio->bi_flags)) { |
@@ -2532,7 +2532,7 @@ static void handle_write_completed(struct r10conf *conf, struct r10bio *r10_bio) | |||
2532 | rdev_clear_badblocks( | 2532 | rdev_clear_badblocks( |
2533 | rdev, | 2533 | rdev, |
2534 | r10_bio->devs[m].addr, | 2534 | r10_bio->devs[m].addr, |
2535 | r10_bio->sectors); | 2535 | r10_bio->sectors, 0); |
2536 | rdev_dec_pending(rdev, conf->mddev); | 2536 | rdev_dec_pending(rdev, conf->mddev); |
2537 | } | 2537 | } |
2538 | } | 2538 | } |