]> git.ipfire.org Git - thirdparty/mdadm.git/commitdiff
Grow: Block reshape when external metadata and write-intent bitmap
authorJakub Radtke <jakub.radtke@intel.com>
Fri, 15 Jan 2021 05:47:01 +0000 (00:47 -0500)
committerJes Sorensen <jsorensen@fb.com>
Tue, 9 Mar 2021 22:18:06 +0000 (17:18 -0500)
Current kernel sysfs interface for the bitmap is limited. It allows
the applying of the bitmap on non-active volumes only.
The reshape operation for a volume with a bitmap should be blocked.

Signed-off-by: Jakub Radtke <jakub.radtke@intel.com>
Signed-off-by: Jes Sorensen <jsorensen@fb.com>
Grow.c

diff --git a/Grow.c b/Grow.c
index cec83886f2c1dfa28952059f9e59afdbe6abaf40..11209299ea5d815412f4bbeb150a0e5863d836d5 100644 (file)
--- a/Grow.c
+++ b/Grow.c
@@ -1850,15 +1850,14 @@ int Grow_reshape(char *devname, int fd,
                pr_err("Cannot increase raid-disks on this array beyond %d\n", st->max_devs);
                return 1;
        }
-       if (s->level == 0 &&
-           (array.state & (1<<MD_SB_BITMAP_PRESENT)) &&
-           !(array.state & (1<<MD_SB_CLUSTERED))) {
-                array.state &= ~(1<<MD_SB_BITMAP_PRESENT);
-                if (md_set_array_info(fd, &array)!= 0) {
-                        pr_err("failed to remove internal bitmap.\n");
-                        return 1;
-                }
-        }
+       if (s->level == 0 && (array.state & (1 << MD_SB_BITMAP_PRESENT)) &&
+               !(array.state & (1 << MD_SB_CLUSTERED)) && !st->ss->external) {
+               array.state &= ~(1 << MD_SB_BITMAP_PRESENT);
+               if (md_set_array_info(fd, &array) != 0) {
+                       pr_err("failed to remove internal bitmap.\n");
+                       return 1;
+               }
+       }
 
        /* in the external case we need to check that the requested reshape is
         * supported, and perform an initial check that the container holds the
@@ -1922,6 +1921,13 @@ int Grow_reshape(char *devname, int fd,
                                        free(subarray);
                                        return 1;
                                }
+                               if (content->consistency_policy ==
+                                   CONSISTENCY_POLICY_BITMAP) {
+                                       pr_err("Operation not supported when write-intent bitmap is enabled\n");
+                                       sysfs_free(cc);
+                                       free(subarray);
+                                       return 1;
+                               }
                        }
                        sysfs_free(cc);
                }