diff options
author | NeilBrown <neilb@suse.de> | 2009-07-14 12:13:29 +1000 |
---|---|---|
committer | NeilBrown <neilb@suse.de> | 2009-07-14 12:13:29 +1000 |
commit | 19678e536d5b7aba8b721a3065f2550b79ddd208 (patch) | |
tree | 7537fe1a28214e5fe490b8f8524fb1430c4d26c3 /Grow.c | |
parent | d823a6c87225d0c7f96443013798ed4dacf51ff6 (diff) | |
download | mdadm-19678e536d5b7aba8b721a3065f2550b79ddd208.tar.gz mdadm-19678e536d5b7aba8b721a3065f2550b79ddd208.tar.xz mdadm-19678e536d5b7aba8b721a3065f2550b79ddd208.zip |
Grow: pass layout as a string rather than a number.
This allows the layout to be parsed after the current level of the
array is know, so that the level doesn't need to be given (otherwise
pointlessly) on the command line.
Signed-off-by: NeilBrown <neilb@suse.de>
Diffstat (limited to 'Grow.c')
-rw-r--r-- | Grow.c | 38 |
1 files changed, 32 insertions, 6 deletions
@@ -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; |