Re: [PATCH] kill-subarray: fix, IMSM cannot kill-subarray with unsupported metadata

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Mon, 31 Oct 2011 16:52:22 +0000 "Labun, Marcin" <Marcin.Labun@xxxxxxxxx>
wrote:

> 
> 
> > -----Original Message-----
> > From: NeilBrown [mailto:neilb@xxxxxxx]
> > Sent: Monday, October 31, 2011 1:32 AM
> > To: Labun, Marcin
> > Cc: linux-raid@xxxxxxxxxxxxxxx; Williams, Dan J
> > Subject: Re: [PATCH] kill-subarray: fix, IMSM cannot kill-subarray with
> > unsupported metadata
> > 
> > On Fri, 28 Oct 2011 14:46:57 +0000 "Labun, Marcin"
> > <Marcin.Labun@xxxxxxxxx>
> > wrote:
> > 
> > > Hi Neil,
> > > Please review modified patch in response for your comments.
> > > I have introduced two flags, one for activation blocking, second for
> > > container wide reshapes
> > > Blocking:
> > > - some arrays in container are blocked, the others can be activated
> > > and reshaped,
> > > - some arrays are blocked, others can be activated but container wide
> > reshaped is blocked for all.
> > >
> > > Thanks,
> > > Marcin Labun
> > 
> > Thanks.  This looks mostly OK.
> > I have applied it -  with a number of formatting improvements and the
> > removal for a debugging printf :-)
> 
> Thanks!
> It seems that map_lock call appeared from *nowhere* in the modified patch :). Please see the context below.

Thanks for checking and noticing that.
It was a merge error on my part.  As your patch added a map_unlock call I
reasoned that the map_lock call which you patch left unchanged needed to be
added back - I obviously wasn't thinking clearly.
I have removed it and the map_unlock that your patch added.


> 
> -	/* do not assemble arrays that might have bad blocks */
> -	if (list && list->array.state & (1<<MD_SB_BBM_ERRORS)) {
> -		fprintf(stderr, Name ": BBM log found in metadata. "
> -					"Cannot activate array(s).\n");
> -		/* free container data and exit */
> -		sysfs_free(list);
> -		return 2;
> -	}
> -
> +	/* when nothing to activate - quit */
> +	if (list == NULL)
> +		return 0;
> +	if (map_lock(&map))
> +		fprintf(stderr, Name ": failed to get exclusive lock on "
> +			"mapfile\n");
> 
> > 
> > However this bit looks wrong:
> > 
> > > +/*
> > > + * 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;
> > > +	printf("subarray: %s\n", subarray);
> > > +
> > > +
> > > +	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;
> > > +}
> > 
> > Grow.c shouldn't be doing a 'strtoul' here.  The subarray string
> > belongs to the metadata handler, mdadm core code shouldn't interpret it
> > at all.
> > 
> > What exactly is the point of that bit of code?
> > 
> > Thanks,
> > NeilBrown
> Grow.c generates subarray string in super_by_fd() function.Derived from (struct mdinfo) sra->text_version.
> 
> In check_reshape function I want to know on which subarray grow operates to get subarray blocking bits.

I think I see - thanks.

I have changed the code to do what I think it should.  Please review patch
below.

Thanks,
NeilBrown


commit 446894ea8db17a2dfc740f81d58190c5ac8167d5
Author: NeilBrown <neilb@xxxxxxx>
Date:   Tue Nov 1 15:45:46 2011 +1100

    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 <neilb@xxxxxxx>

diff --git a/Grow.c b/Grow.c
index 598fd59..8df4ac4 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<<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"
diff --git a/super-intel.c b/super-intel.c
index 1caee70..34a4b34 100644
--- a/super-intel.c
+++ b/super-intel.c
@@ -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) |

Attachment: signature.asc
Description: PGP signature


[Index of Archives]     [Linux RAID Wiki]     [ATA RAID]     [Linux SCSI Target Infrastructure]     [Linux Block]     [Linux IDE]     [Linux SCSI]     [Linux Hams]     [Device Mapper]     [Device Mapper Cryptographics]     [Kernel]     [Linux Admin]     [Linux Net]     [GFS]     [RPM]     [git]     [Yosemite Forum]


  Powered by Linux