]> git.ipfire.org Git - thirdparty/mdadm.git/commitdiff
Grow: restore ability to configure 'faulty' arrays via mdadm.
authorNeilBrown <neilb@suse.de>
Tue, 10 May 2011 02:09:02 +0000 (12:09 +1000)
committerNeilBrown <neilb@suse.de>
Tue, 10 May 2011 02:09:02 +0000 (12:09 +1000)
The big 'grow' refactor lost us the ability to configure 'faulty'
arrays through --grow.
So put that back as a special case.

Signed-off-by: NeilBrown <neilb@suse.de>
Grow.c

diff --git a/Grow.c b/Grow.c
index 41dc9c91c89fb48a32855cb30f89fe7feba9f64e..0a084482dcb53ac0eeb87545895567d5c7ed2b85 100644 (file)
--- a/Grow.c
+++ b/Grow.c
@@ -1617,7 +1617,33 @@ int Grow_reshape(char *devname, int fd, int quiet, char *backup_file,
                }
        }
 
-       if (array.level == LEVEL_CONTAINER) {
+       if (array.level == LEVEL_FAULTY) {
+               if (level != UnSet && level != array.level) {
+                       fprintf(stderr, Name ": cannot change level of Faulty device\n");
+                       rv =1 ;
+               }
+               if (chunksize) {
+                       fprintf(stderr, Name ": cannot set chunksize of Faulty device\n");
+                       rv =1 ;
+               }
+               if (raid_disks && raid_disks != 1) {
+                       fprintf(stderr, Name ": cannot set raid_disks of Faulty device\n");
+                       rv =1 ;
+               }
+               if (layout_str) {
+                       if (ioctl(fd, GET_ARRAY_INFO, &array) != 0) {
+                               dprintf("Cannot get array information.\n");
+                               goto release;
+                       }
+                       array.layout = info.new_layout;
+                       if (ioctl(fd, SET_ARRAY_INFO, &array) != 0) {
+                               fprintf(stderr, Name ": failed to set new layout\n");
+                               rv = 1;
+                       } else if (!quiet)
+                               printf("layout for %s set to %d\n",
+                                      devname, array.layout);
+               }
+       } else if (array.level == LEVEL_CONTAINER) {
                /* This change is to be applied to every array in the
                 * container.  This is only needed when the metadata imposes
                 * restraints of the various arrays in the container.