]> git.ipfire.org Git - thirdparty/mdadm.git/commitdiff
Fix assembling RAID volume by using incremental
authorPawel Piatkowski <pawel.piatkowski@intel.com>
Thu, 19 Oct 2023 14:35:25 +0000 (16:35 +0200)
committerJes Sorensen <jes@trained-monkey.org>
Thu, 26 Oct 2023 21:51:55 +0000 (17:51 -0400)
After change "mdadm: remove container_enough logic"
IMSM volumes are started immediately. If volume is during
reshape, then it will be blocked by block_subarray() during
first mdadm -I <devname>. Assemble_container_content() for
next disk will see the change because metadata version from
sysfs and metadata doesn't match and will execute
sysfs_set_array again. Then it fails to set same
component_size, it is prohibited by kernel.

If array is frozen then first sign from metadata version
is different ("/" vs "-"), so exclude it from comparison.
All we want is to double check that base properties are set
and we don't need to call sysfs_set_array again.

Signed-off-by: Pawel Piatkowski <pawel.piatkowski@intel.com>
Signed-off-by: Jes Sorensen <jes@trained-monkey.org>
Assemble.c

index 5be58e4066c57663156a68cbb5f19bcc015305ad..0557a007ef4cd93fb235be8d1bf6b537bb204a56 100644 (file)
@@ -1990,12 +1990,10 @@ int assemble_container_content(struct supertype *st, int mdfd,
                return 1;
        }
 
-       if (strcmp(sra->text_version, content->text_version) != 0) {
-               if (content->array.major_version == -1 &&
-                   content->array.minor_version == -2 &&
-                   c->readonly &&
-                   content->text_version[0] == '/')
-                       content->text_version[0] = '-';
+       /* Fill sysfs properties only if they are not set. Determine it by checking text_version
+        * and ignoring special character on the first place.
+        */
+       if (strcmp(sra->text_version + 1, content->text_version + 1) != 0) {
                if (sysfs_set_array(content, 9003) != 0) {
                        sysfs_free(sra);
                        return 1;