aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/md/raid10.c
diff options
context:
space:
mode:
authorNeilBrown <neilb@suse.de>2012-05-20 19:27:00 -0400
committerNeilBrown <neilb@suse.de>2012-05-20 19:27:00 -0400
commitc6563a8c38fde3c1c7fc925a10bde3ca20799301 (patch)
tree3916ae8247149a9dcf39ee1ca262f97be39071eb /drivers/md/raid10.c
parent2c810cddc44d6f95cef75df3f07fc0850ff92417 (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.c8
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 }