]> git.ipfire.org Git - thirdparty/mdadm.git/blobdiff - Grow.c
Grow: pass layout as a string rather than a number.
[thirdparty/mdadm.git] / Grow.c
diff --git a/Grow.c b/Grow.c
index 15cec5f103bf874bdb4669a97086dce333089bee..65b708a71fc91f91119cf29f0963ee44b58762ee 100644 (file)
--- a/Grow.c
+++ b/Grow.c
@@ -410,7 +410,7 @@ int bsb_csum(char *buf, int len)
 
 int Grow_reshape(char *devname, int fd, int quiet, char *backup_file,
                 long long size,
-                int level, int layout, int chunksize, int raid_disks)
+                int level, char *layout_str, int chunksize, int raid_disks)
 {
        /* Make some changes in the shape of an array.
         * The kernel must support the change.
@@ -468,10 +468,15 @@ int Grow_reshape(char *devname, int fd, int quiet, char *backup_file,
                                devname);
                        return 1;
                }
-               if (layout == UnSet)
+               if (layout_str == NULL)
                        return 0; /* nothing to do.... */
 
-               array.layout = layout;
+               array.layout = parse_layout_faulty(layout_str);
+               if (array.layout < 0) {
+                       fprintf(stderr, Name ": %s: layout %s not understood for 'faulty' array\n",
+                               devname, layout_str);
+                       return 1;
+               }
                if (ioctl(fd, SET_ARRAY_INFO, &array) != 0) {
                        fprintf(stderr, Name ": Cannot set layout for %s: %s\n",
                                devname, strerror(errno));
@@ -488,7 +493,7 @@ int Grow_reshape(char *devname, int fd, int quiet, char *backup_file,
                                devname);
                        return 1;
                }
-               if (chunksize || layout != UnSet) {
+               if (chunksize || layout_str != NULL) {
                        fprintf(stderr, Name ": %s: Cannot change chunk size of layout for a RAID1 array.\n",
                                devname);
                        return 1;
@@ -529,7 +534,7 @@ int Grow_reshape(char *devname, int fd, int quiet, char *backup_file,
                 */
                if (size >= 0) {
                        /* Cannot change other details as well.. */
-                       if (layout != UnSet ||
+                       if (layout_str != NULL ||
                            chunksize != 0 ||
                            raid_disks != 0 ||
                            level != UnSet) {
@@ -586,7 +591,28 @@ int Grow_reshape(char *devname, int fd, int quiet, char *backup_file,
 
                if (level != UnSet) nlevel = level;
                if (chunksize) nchunk = chunksize;
-               if (layout != UnSet) nlayout = layout;
+               if (layout_str != NULL)
+                       switch(nlevel) {
+                       case 4: /* ignore layout */
+                               break;
+                       case 5:
+                               nlayout = map_name(r5layout, layout_str);
+                               if (nlayout == UnSet) {
+                                       fprintf(stderr, Name ": layout %s not understood for raid5.\n",
+                                               layout_str);
+                                       return 1;
+                               }
+                               break;
+
+                       case 6:
+                               nlayout = map_name(r6layout, layout_str);
+                               if (nlayout == UnSet) {
+                                       fprintf(stderr, Name ": layout %s not understood for raid6.\n",
+                                               layout_str);
+                                       return 1;
+                               }
+                               break;
+                       }
                if (raid_disks) ndisks = raid_disks;
 
                odata = odisks-1;