]> git.ipfire.org Git - thirdparty/mdadm.git/commitdiff
Grow: accept --assume-clean with --grow --size
authorNeilBrown <neilb@suse.de>
Mon, 16 May 2011 07:28:27 +0000 (17:28 +1000)
committerNeilBrown <neilb@suse.de>
Mon, 16 May 2011 07:28:27 +0000 (17:28 +1000)
When an array is resized to have larger members, --assume-clean will
disable any resync if the kernel supports it (2.6.40 and later).

Signed-off-by: NeilBrown <neilb@suse.de>
Grow.c
mdadm.8.in
mdadm.c
mdadm.h

diff --git a/Grow.c b/Grow.c
index 1e1e9f8c3161553577a070b13aa48c7990f2ea81..62622bd28b5afb25bc1bcae5c43bbf6a26155bc3 100644 (file)
--- a/Grow.c
+++ b/Grow.c
@@ -1293,7 +1293,7 @@ int Grow_reshape(char *devname, int fd, int quiet, char *backup_file,
                 long long size,
                 int level, char *layout_str, int chunksize, int raid_disks,
                 struct mddev_dev *devlist,
-                int force)
+                int assume_clean, int force)
 {
        /* Make some changes in the shape of an array.
         * The kernel must support the change.
@@ -1491,6 +1491,14 @@ int Grow_reshape(char *devname, int fd, int quiet, char *backup_file,
                        rv = 1;
                        goto release;
                }
+               if (assume_clean) {
+                       /* This will fail on kernels newer than 2.6.40 unless
+                        * a backport has been arranged.
+                        */
+                       if (sra == NULL ||
+                           sysfs_set_str(sra, NULL, "resync_start", "none") < 0)
+                               fprintf(stderr, Name ": --assume-clean not support with --grow on this kernel\n");
+               }
                ioctl(fd, GET_ARRAY_INFO, &array);
                size = get_component_size(fd)/2;
                if (size == 0)
index 3fbfcce81fcdcc9b310cc45e1ed4c63a3b461a23..e1d5651de5e26ede080168f96a71c1b9366b1dff 100644 (file)
@@ -702,6 +702,13 @@ with zeros before creation the operator knows the array is
 actually clean. If that is the case, such as after running
 badblocks, this argument can be used to tell mdadm the
 facts the operator knows.
+.IP
+When an array is resized to a larger size with
+.B "\-\-grow \-\-size="
+the new space is normally resynced in that same way that the whole
+array is resynced at creation.  From Linux version 2.6.40,
+.B \-\-assume\-clean
+can be used with that command to avoid the automatic resync.
 
 .TP
 .BR \-\-backup\-file=
diff --git a/mdadm.c b/mdadm.c
index d55e9cfa3081b0a91d7f0d93f9e5de3679e58232..fb51051217f993b0680f8ee2ead34fc096bda6b6 100644 (file)
--- a/mdadm.c
+++ b/mdadm.c
@@ -542,6 +542,7 @@ int main(int argc, char *argv[])
 
                case O(CREATE,AssumeClean):
                case O(BUILD,AssumeClean): /* assume clean */
+               case O(GROW,AssumeClean):
                        assume_clean = 1;
                        continue;
 
@@ -1637,7 +1638,7 @@ int main(int argc, char *argv[])
                        rv = Grow_reshape(devlist->devname, mdfd, quiet, backup_file,
                                          size, level, layout_str, chunk, raiddisks,
                                          devlist->next,
-                                         force);
+                                         assume_clean, force);
                } else if (array_size < 0)
                        fprintf(stderr, Name ": no changes to --grow\n");
                break;
diff --git a/mdadm.h b/mdadm.h
index 8277594bdb82cef41c1ed6c7ae85609e9ab46178..9437d04ea2a07f84f0f19ad9ee04b434a15d3298 100644 (file)
--- a/mdadm.h
+++ b/mdadm.h
@@ -1013,7 +1013,7 @@ extern int Grow_reshape(char *devname, int fd, int quiet, char *backup_file,
                        long long size,
                        int level, char *layout_str, int chunksize, int raid_disks,
                        struct mddev_dev *devlist,
-                       int force);
+                       int assume_clean, int force);
 extern int Grow_restart(struct supertype *st, struct mdinfo *info,
                        int *fdlist, int cnt, char *backup_file, int verbose);
 extern int Grow_continue(int mdfd, struct supertype *st,