diff options
author | Przemyslaw Czarnowski <przemyslaw.hawrylewicz.czarnowski@intel.com> | 2011-05-04 17:13:22 +0200 |
---|---|---|
committer | NeilBrown <neilb@suse.de> | 2011-05-09 11:45:53 +1000 |
commit | 4bba04392170133ea3c9ae5ea54494288767efb4 (patch) | |
tree | eecf75250cc3321e3a7018526a29ef904f1c6641 /super-intel.c | |
parent | a29911dac14c9a38a5c9cd3eeb17b852918cc3ab (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.c | 20 |
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; |