]> git.ipfire.org Git - thirdparty/mdadm.git/commitdiff
Assemble: Fix starting array with initial reshape checkpoint
authorPawel Baldysiak <pawel.baldysiak@intel.com>
Fri, 22 Feb 2019 11:56:27 +0000 (12:56 +0100)
committerJes Sorensen <jsorensen@fb.com>
Thu, 28 Feb 2019 20:48:51 +0000 (15:48 -0500)
If array was stopped during reshape initialization,
there might be a "0" checkpoint recorded in metadata.
If array with such condition (reshape with position 0)
is passed to kernel - it will refuse to start such array.

Treat such array as normal during assemble, Grow_continue() will
reinitialize and start the reshape.

Signed-off-by: Pawel Baldysiak <pawel.baldysiak@intel.com>
Signed-off-by: Jes Sorensen <jsorensen@fb.com>
Assemble.c

index 9f050c1fd53bd212f709d969b5e0f5450f0e5395..420c7b3943eabc4cca8611867f77dc67c5b5b953 100644 (file)
@@ -2061,8 +2061,22 @@ int assemble_container_content(struct supertype *st, int mdfd,
                                   spare, &c->backup_file, c->verbose) == 1)
                        return 1;
 
-               err = sysfs_set_str(content, NULL,
-                                   "array_state", "readonly");
+               if (content->reshape_progress == 0) {
+                       /* If reshape progress is 0 - we are assembling the
+                        * array that was stopped, before reshape has started.
+                        * Array needs to be started as active, Grow_continue()
+                        * will start the reshape.
+                        */
+                       sysfs_set_num(content, NULL, "reshape_position",
+                                     MaxSector);
+                       err = sysfs_set_str(content, NULL,
+                                           "array_state", "active");
+                       sysfs_set_num(content, NULL, "reshape_position", 0);
+               } else {
+                       err = sysfs_set_str(content, NULL,
+                                           "array_state", "readonly");
+               }
+
                if (err)
                        return 1;