Re: [PATCH 2/6] Define imsm_analyze_change function

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

 



On Wed, 12 Jan 2011 17:01:06 +0100 Krzysztof Wojcik
<krzysztof.wojcik@xxxxxxxxx> wrote:

> Function intended to use for single volume migration.
> Function analyze transition and validate if it is supported.
> 
> Signed-off-by: Krzysztof Wojcik <krzysztof.wojcik@xxxxxxxxx>
> ---
>  super-intel.c |  134 +++++++++++++++++++++++++++++++++++++++++++++++++++++----
>  1 files changed, 125 insertions(+), 9 deletions(-)
> 
> diff --git a/super-intel.c b/super-intel.c
> index 8c1ed4e..81f8e81 100644
> --- a/super-intel.c
> +++ b/super-intel.c
> @@ -6549,15 +6549,127 @@ static void imsm_update_metadata_locally(struct supertype *st,
>  	}
>  }
>  
> -/**************************************************************************************
> +/***************************************************************************
> +>>>>>>> 686d792... Define imsm_analyze_change function:super-intel.c

Leaving that sort of thing in the patch is a bad idea....



>  * Function:	imsm_analyze_change
> -* Description:	Function analyze and validate change for single volume migration
> +* Description:	Function analyze change for single volume
> +* 		and validate if transition is supported
>  * Parameters:	Geometry parameters, supertype structure
>  * Returns:	Operation type code on success, -1 if fail
> -*************************************************************************************/
> -enum imsm_reshape_type imsm_analyze_change(struct supertype *st, struct geo_params *geo)
> +****************************************************************************/
> +enum imsm_reshape_type imsm_analyze_change(struct supertype *st,
> +						struct geo_params *geo)
>  {
> -	return -1;
> +	int fd = -1;
> +	struct mdinfo *sra = NULL;
> +	int change = -1;
> +	int check_devs = 0;
> +
> +	fd = open_dev(geo->dev_id);
> +	if (fd < 0) {
> +		printf("imsm: Error. Cannot open %s device\n", geo->dev_name);
> +		return -1;
> +	}
> +
> +	sra = sysfs_read(fd, 0,
> +			GET_DISKS | GET_LAYOUT | GET_CHUNK |
> +			GET_SIZE | GET_LEVEL | GET_DEVS);


loading info from the array is the wrong thing to do.  You have to superblock
in st - you should use that to determine the current state of the array.
Maybe use getinfo_super_imsm or something.

Not applied.

NeilBrown



> +	if (!sra) {
> +		dprintf("imsm: Error. Cannot get mdinfo for %s!\n", geo->dev_name);
> +		goto analyse_change_exit;
> +	}
> +
> +	if ((geo->level != sra->array.level) &&
> +		(geo->level >= 0) &&
> +		(geo->level != UnSet)) {
> +		switch (sra->array.level) {
> +		case 0:
> +			if (geo->level == 5) {
> +				change = CH_LEVEL_MIGRATION;
> +				check_devs = 1;
> +			}
> +			if (geo->level == 10) {
> +				change = CH_TAKEOVER;
> +				check_devs = 1;
> +			}
> +			break;
> +		case 5:
> +			if (geo->level != 0)
> +				change = CH_LEVEL_MIGRATION;
> +			break;
> +		case 10:
> +			if (geo->level == 0) {
> +				change = CH_TAKEOVER;
> +				check_devs = 1;
> +			}
> +			break;
> +		}
> +		if (change == -1) {
> +			dprintf("imsm: Error. Level Migration from %d to %d "\
> +				"not supported!\n", sra->array.level, geo->level);
> +			goto analyse_change_exit;
> +		}
> +	} else {
> +		geo->level = sra->array.level;
> +	}
> +
> +	if ((geo->layout != sra->array.layout)
> +		&& ((geo->layout != UnSet) && (geo->layout != -1))) {
> +		change = CH_LEVEL_MIGRATION;
> +		if ((sra->array.layout == 0) && (sra->array.level == 5)
> +			&& (geo->layout == 5)) {
> +			/* reshape 5 -> 4 */
> +		} else if ((sra->array.layout == 5)
> +				&& (sra->array.level == 5)
> +				&& (geo->layout == 0)) {
> +			/* reshape 4 -> 5 */
> +			geo->layout = 0;
> +			geo->level = 5;
> +		} else {
> +			dprintf("imsm: Error. Layout Migration from %d to %d "\
> +				"not supported!\n", sra->array.layout, geo->layout);
> +			change = -1;
> +			goto analyse_change_exit;
> +		}
> +	} else {
> +		geo->layout = sra->array.layout;
> +	}
> +
> +	if ((geo->chunksize > 0) && (geo->chunksize != UnSet)
> +		&& (geo->chunksize != sra->array.chunk_size)) {
> +		change = CH_CHUNK_MIGR;
> +	} else {
> +		geo->chunksize = sra->array.chunk_size;
> +	}
> +
> +	if (!validate_geometry_imsm(st,
> +					geo->level,
> +					geo->layout,
> +					geo->raid_disks,
> +					(geo->chunksize / 1024),
> +					geo->size,
> +					0, 0, 1))
> +		change = -1;
> +
> +	if (check_devs) {
> +		struct intel_super *super = st->sb;
> +		struct imsm_super *mpb = super->anchor;
> +
> +		if (mpb->num_raid_devs > 1) {
> +			printf("imsm: Error. Cannot perform operation on %s"\
> +				"- for this operation it MUST be single "\
> +			       "array in container\n",
> +				geo->dev_name);
> +			change = -1;
> +		}
> +	}
> +
> +analyse_change_exit:
> +	sysfs_free(sra);
> +	if (fd > -1)
> +		close(fd);
> +
> +	return change;
>  }
>  
>  static int imsm_reshape_super(struct supertype *st, long long size, int level,
> @@ -6623,13 +6735,17 @@ static int imsm_reshape_super(struct supertype *st, long long size, int level,
>  		change = imsm_analyze_change(st, &geo);
>  		switch (change) {
>  			case CH_TAKEOVER:
> -			break;
> +				ret_val = 0;
> +				break;
>  			case CH_CHUNK_MIGR:
> -			break;
> +				ret_val = 0;
> +				break;
>  			case CH_LEVEL_MIGRATION:
> -			break;
> +				ret_val = 0;
> +				break;
> +			default:
> +				ret_val = 1;
>  		}
> -		ret_val = 0;
>  	}
>  
>  exit_imsm_reshape_super:

--
To unsubscribe from this list: send the line "unsubscribe linux-raid" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[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