summaryrefslogtreecommitdiff
path: root/super-intel.c
diff options
context:
space:
mode:
authorPrzemyslaw Czarnowski <przemyslaw.hawrylewicz.czarnowski@intel.com>2011-05-04 17:13:22 +0200
committerNeilBrown <neilb@suse.de>2011-05-09 11:45:53 +1000
commit4bba04392170133ea3c9ae5ea54494288767efb4 (patch)
treeeecf75250cc3321e3a7018526a29ef904f1c6641 /super-intel.c
parenta29911dac14c9a38a5c9cd3eeb17b852918cc3ab (diff)
imsm: add new chunk size to metadata update
Put information about new chunk size change in to migration metadata update allowing simultaneous level change and re-striping. Signed-off-by: Adam Kwolek <adam.kwolek@intel.com> Signed-off-by: Przemyslaw Czarnowski <przemyslaw.hawrylewicz.czarnowski@intel.com> Signed-off-by: NeilBrown <neilb@suse.de>
Diffstat (limited to 'super-intel.c')
-rw-r--r--super-intel.c20
1 files changed, 19 insertions, 1 deletions
diff --git a/super-intel.c b/super-intel.c
index 535b5519..e401eb01 100644
--- a/super-intel.c
+++ b/super-intel.c
@@ -354,6 +354,7 @@ struct imsm_update_reshape_migration {
int subdev;
int new_level;
int new_layout;
+ int new_chunksize;
int new_disks[1]; /* new_raid_disks - old_raid_disks makedev number */
};
@@ -6157,6 +6158,12 @@ static int apply_reshape_migration_update(struct imsm_update_reshape_migration *
id->dev = new_dev;
tofree = (void **)dev;
+ /* update chunk size
+ */
+ if (u->new_chunksize > 0)
+ map->blocks_per_strip =
+ __cpu_to_le16(u->new_chunksize * 2);
+
/* add disk
*/
if ((u->new_level != 5) ||
@@ -7368,14 +7375,25 @@ static int imsm_create_metadata_update_for_migration(
u->new_layout = geo->layout;
u->new_raid_disks = u->old_raid_disks = geo->raid_disks;
u->new_disks[0] = -1;
+ u->new_chunksize = -1;
dev = get_imsm_dev(super, u->subdev);
if (dev) {
struct imsm_map *map;
map = get_imsm_map(dev, 0);
- if (map)
+ if (map) {
+ int current_chunk_size =
+ __le16_to_cpu(map->blocks_per_strip) / 2;
+
+ if (geo->chunksize != current_chunk_size) {
+ u->new_chunksize = geo->chunksize / 1024;
+ dprintf("imsm: "
+ "chunk size change from %i to %i\n",
+ current_chunk_size, u->new_chunksize);
+ }
previous_level = map->raid_level;
+ }
}
if ((geo->level == 5) && (previous_level == 0)) {
struct mdinfo *spares = NULL;