]> git.ipfire.org Git - thirdparty/mdadm.git/commitdiff
Grow: fix check_reshape and open_code it.
authorNeilBrown <neilb@suse.de>
Tue, 1 Nov 2011 04:45:46 +0000 (15:45 +1100)
committerNeilBrown <neilb@suse.de>
Tue, 1 Nov 2011 04:45:46 +0000 (15:45 +1100)
check_reshape should not try to parse the subarray string - only
metadata handlers are allowed to do that.

The common code and only interpret a subarray string by passing it to
"container_content" which will then return only the member for that
subarray.

So remove check_reshape and place similar logic explicitly at the two
call-sites.  They are different enough that it is probably clearer to
have explicit code.

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

diff --git a/Grow.c b/Grow.c
index 598fd595272c013c398b91709681a7045b86a22f..8df4ac42371d7eede35144cf85b2a8f0bc808b91 100644 (file)
--- a/Grow.c
+++ b/Grow.c
@@ -1358,36 +1358,6 @@ static int reshape_container(char *container, char *devname,
                             char *backup_file,
                             int quiet, int restart, int freeze_reshape);
 
-/*
- * helper routine to check metadata reshape avalability
- * 1. Do not "grow" arrays with volume activation blocked
- * 2. do not reshape containers with container reshape blocked
- *
- * IN:
- *     subarray - array name or NULL for container wide reshape
- *     content - md device info from container_content
- * OUT:
- *     0 - block reshape
- */
-static int check_reshape(char *subarray, struct mdinfo *content)
-{
-       char *ep;
-       unsigned int idx;
-
-       if (!subarray) {
-               if (content->array.state & (1<<MD_SB_BLOCK_CONTAINER_RESHAPE))
-                       return 0;
-       } else {
-               /* do not "grow" arrays with volume activation blocked */
-               idx = strtoul(subarray, &ep, 10);
-               if (*ep == '\0'
-                   && content->container_member == (int) idx
-                   && (content->array.state & (1<<MD_SB_BLOCK_VOLUME)))
-                       return 0;
-       }
-       return 1;
-}
-
 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,
@@ -1505,12 +1475,16 @@ int Grow_reshape(char *devname, int fd, int quiet, char *backup_file,
 
                        cc = st->ss->container_content(st, subarray);
                        for (content = cc; content ; content = content->next) {
-                               int allow_reshape;
+                               int allow_reshape = 1;
 
                                /* check if reshape is allowed based on metadata
                                 * indications stored in content.array.status
                                 */
-                               allow_reshape = check_reshape(subarray, content);
+                               if (content->array.state & (1<<MD_SB_BLOCK_VOLUME))
+                                       allow_reshape = 0;
+                               if (content->array.state
+                                   & (1<<MD_SB_BLOCK_CONTAINER_RESHAPE))
+                                       allow_reshape = 0;
                                if (!allow_reshape) {
                                        fprintf(stderr, Name
                                                " cannot reshape arrays in"
@@ -3788,10 +3762,10 @@ int Grow_continue_command(char *devname, int fd,
                        goto Grow_continue_command_exit;
                }
 
-               cc = st->ss->container_content(st, NULL);
+               cc = st->ss->container_content(st, subarray);
                for (content = cc; content ; content = content->next) {
                        char *array;
-                       int allow_reshape;
+                       int allow_reshape = 1;
 
                        if (content->reshape_active == 0)
                                continue;
@@ -3800,10 +3774,14 @@ int Grow_continue_command(char *devname, int fd,
                         * content->reshape_active state, therefore we
                         * need to check_reshape based on
                         * reshape_active and subarray name
-                       */
-                       allow_reshape =
-                         check_reshape((content->reshape_active == CONTAINER_RESHAPE)? NULL : subarray,
-                                       content);
+                        */
+                       if (content->array.state & (1<<MD_SB_BLOCK_VOLUME))
+                               allow_reshape = 0;
+                       if (content->reshape_active == CONTAINER_RESHAPE &&
+                           (content->array.state
+                            & (1<<MD_SB_BLOCK_CONTAINER_RESHAPE)))
+                               allow_reshape = 0;
+
                        if (!allow_reshape) {
                                fprintf(stderr, Name
                                        ": cannot continue reshape of an array"
index 1caee7040dbb04140639003d7e4c16a49534214e..34a4b34374d31721a4c7764954e882487682630b 100644 (file)
@@ -5759,8 +5759,8 @@ static struct mdinfo *container_content_imsm(struct supertype *st, char *subarra
                                                 map->num_members, /* raid disks */
                                                 &chunk,
                                                 1 /* verbose */)) {
-                       fprintf(stderr, Name ": IMSM RAID gemetry validation failed. "
-                               "Array %s activation is blocked.\n",
+                       fprintf(stderr, Name ": IMSM RAID geometry validation"
+                               " failed.  Array %s activation is blocked.\n",
                                dev->volume);
                        this->array.state |=
                          (1<<MD_SB_BLOCK_CONTAINER_RESHAPE) |