From: NeilBrown Date: Tue, 1 Nov 2011 04:45:46 +0000 (+1100) Subject: Grow: fix check_reshape and open_code it. X-Git-Tag: mdadm-3.2.3~96 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=446894ea8db17a2dfc740f81d58190c5ac8167d5;p=thirdparty%2Fmdadm.git Grow: fix check_reshape and open_code it. 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 --- diff --git a/Grow.c b/Grow.c index 598fd595..8df4ac42 100644 --- 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<container_member == (int) idx - && (content->array.state & (1<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<array.state + & (1<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<reshape_active == CONTAINER_RESHAPE && + (content->array.state + & (1<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<