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/md.h | |
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/md.h')
-rw-r--r-- | drivers/md/md.h | 7 |
1 files changed, 5 insertions, 2 deletions
diff --git a/drivers/md/md.h b/drivers/md/md.h index d51c0ca37777..98913e8dac1a 100644 --- a/drivers/md/md.h +++ b/drivers/md/md.h | |||
@@ -55,6 +55,7 @@ struct md_rdev { | |||
55 | int sb_loaded; | 55 | int sb_loaded; |
56 | __u64 sb_events; | 56 | __u64 sb_events; |
57 | sector_t data_offset; /* start of data in array */ | 57 | sector_t data_offset; /* start of data in array */ |
58 | sector_t new_data_offset;/* only relevant while reshaping */ | ||
58 | sector_t sb_start; /* offset of the super block (in 512byte sectors) */ | 59 | sector_t sb_start; /* offset of the super block (in 512byte sectors) */ |
59 | int sb_size; /* bytes in the superblock */ | 60 | int sb_size; /* bytes in the superblock */ |
60 | int preferred_minor; /* autorun support */ | 61 | int preferred_minor; /* autorun support */ |
@@ -193,8 +194,9 @@ static inline int is_badblock(struct md_rdev *rdev, sector_t s, int sectors, | |||
193 | return 0; | 194 | return 0; |
194 | } | 195 | } |
195 | extern int rdev_set_badblocks(struct md_rdev *rdev, sector_t s, int sectors, | 196 | extern int rdev_set_badblocks(struct md_rdev *rdev, sector_t s, int sectors, |
196 | int acknowledged); | 197 | int is_new); |
197 | extern int rdev_clear_badblocks(struct md_rdev *rdev, sector_t s, int sectors); | 198 | extern int rdev_clear_badblocks(struct md_rdev *rdev, sector_t s, int sectors, |
199 | int is_new); | ||
198 | extern void md_ack_all_badblocks(struct badblocks *bb); | 200 | extern void md_ack_all_badblocks(struct badblocks *bb); |
199 | 201 | ||
200 | struct mddev { | 202 | struct mddev { |
@@ -592,6 +594,7 @@ extern void md_write_start(struct mddev *mddev, struct bio *bi); | |||
592 | extern void md_write_end(struct mddev *mddev); | 594 | extern void md_write_end(struct mddev *mddev); |
593 | extern void md_done_sync(struct mddev *mddev, int blocks, int ok); | 595 | extern void md_done_sync(struct mddev *mddev, int blocks, int ok); |
594 | extern void md_error(struct mddev *mddev, struct md_rdev *rdev); | 596 | extern void md_error(struct mddev *mddev, struct md_rdev *rdev); |
597 | extern void md_finish_reshape(struct mddev *mddev); | ||
595 | 598 | ||
596 | extern int mddev_congested(struct mddev *mddev, int bits); | 599 | extern int mddev_congested(struct mddev *mddev, int bits); |
597 | extern void md_flush_request(struct mddev *mddev, struct bio *bio); | 600 | extern void md_flush_request(struct mddev *mddev, struct bio *bio); |