]> git.ipfire.org Git - thirdparty/mdadm.git/commitdiff
Set array size after adding new disks
authorAdam Kwolek <adam.kwolek@intel.com>
Thu, 6 Jan 2011 07:29:20 +0000 (18:29 +1100)
committerNeilBrown <neilb@suse.de>
Thu, 6 Jan 2011 07:29:20 +0000 (18:29 +1100)
When new disks are added array size has to be set by mdadm as array grows.

Signed-off-by: Adam Kwolek <adam.kwolek@intel.com>
Signed-off-by: NeilBrown <neilb@suse.de>
Grow.c

diff --git a/Grow.c b/Grow.c
index 36bb7de4e9f2b27d14016baa55c690c10dd1842b..25c55ccba6938ebf65cc4122acd9142fa4f85e62 100644 (file)
--- a/Grow.c
+++ b/Grow.c
@@ -2005,14 +2005,58 @@ static int reshape_array(char *container, int fd, char *devname,
 
                if (backup_file && done)
                        unlink(backup_file);
-               if (!done)
+               if (!done) {
                        abort_reshape(sra);
-               else if (info->new_level != info->array.level) {
+                       goto out;
+               }
+               /* set new array size if required customer_array_size is used
+                * by this metadata.
+                */
+               if (reshape.before.data_disks !=
+                   reshape.after.data_disks &&
+                   info->custom_array_size) {
+                       struct mdinfo *info2;
+                       char *subarray = strchr(info->text_version+1, '/')+1;
+
+                       wait_reshape(sra);
+                       ping_monitor(container);
+
+                       info2 = st->ss->container_content(st, subarray);
+                       if (info2) {
+                               unsigned long long current_size = 0;
+                               unsigned long long new_size =
+                                       info2->custom_array_size/2;
+
+                               if (sysfs_get_ll(sra,
+                                                NULL,
+                                                "array_size",
+                                                &current_size) == 0 &&
+                                   new_size > current_size) {
+                                       if (sysfs_set_num(sra, NULL,
+                                                         "array_size", new_size)
+                                           < 0)
+                                               dprintf("Error: Cannot"
+                                                       " set array size");
+                                       else
+                                               dprintf("Array size "
+                                                       "changed");
+                                       dprintf(" from %llu to %llu.\n",
+                                               current_size, new_size);
+                               }
+                               sysfs_free(info2);
+                       }
+               }
+
+               if (info->new_level != info->array.level) {
                        /* We need to wait for the reshape to finish
-                        * (which will have happened unless odata < ndata)
-                        * and then set the level
+                        * (which will have happened unless
+                        * odata < ndata) and then set the level
                         */
 
+                       if (reshape.before.data_disks <
+                           reshape.after.data_disks)
+                               wait_reshape(sra);
+
                        c = map_num(pers, info->new_level);
                        if (c == NULL) {
                                if (forked)
@@ -2020,14 +2064,13 @@ static int reshape_array(char *container, int fd, char *devname,
                                exit(0);/* not possible */
                        }
 
-                       if (reshape.before.data_disks < 
-                           reshape.after.data_disks)
-                               wait_reshape(sra);
                        err = sysfs_set_str(sra, NULL, "level", c);
                        if (err)
-                               fprintf(stderr, Name ": %s: could not set level to %s\n",
-                                       devname, c);
+                               fprintf(stderr, Name\
+                                       ": %s: could not set level"
+                                       "to %s\n", devname, c);
                }
+       out:
                if (forked)
                        return 0;
                exit(0);