]> git.ipfire.org Git - thirdparty/mdadm.git/blobdiff - super-intel.c
imsm: add new chunk size to metadata update
[thirdparty/mdadm.git] / super-intel.c
index 535b5519036df756eaca92eb79cd54857dbf229e..e401eb0153aecaba934c8c3abdd1fc0c2033ee10 100644 (file)
@@ -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;