From: NeilBrown <neilb@suse.de>
To: Krzysztof Wojcik <krzysztof.wojcik@intel.com>
Cc: linux-raid@vger.kernel.org, wojciech.neubauer@intel.com,
adam.kwolek@intel.com, dan.j.williams@intel.com,
ed.ciechanowski@intel.com
Subject: Re: [PATCH 1/6] Define imsm_analyze_change function
Date: Mon, 17 Jan 2011 13:02:51 +1100 [thread overview]
Message-ID: <20110117130251.6e714992@notabene.brown> (raw)
In-Reply-To: <20110113153227.20266.42368.stgit@gklab-128-111.igk.intel.com>
On Thu, 13 Jan 2011 16:32:27 +0100 Krzysztof Wojcik
<krzysztof.wojcik@intel.com> 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@intel.com>
Applied, thanks.
Though I reformatted it a bit.
NeilBrown
> ---
> super-intel.c | 135 ++++++++++++++++++++++++++++++++++++++++++++++++++++-----
> 1 files changed, 124 insertions(+), 11 deletions(-)
>
> diff --git a/super-intel.c b/super-intel.c
> index 4cbb070..c12ba74 100644
> --- a/super-intel.c
> +++ b/super-intel.c
> @@ -6576,16 +6576,110 @@ static void imsm_update_metadata_locally(struct supertype *st,
> }
> }
>
> -/*******************************************************************************
> +/***************************************************************************
> * 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;
> + struct mdinfo info;
> + int change = -1;
> + int check_devs = 0;
> +
> + getinfo_super_imsm_volume(st, &info, NULL);
> +
> + if ((geo->level != info.array.level) &&
> + (geo->level >= 0) &&
> + (geo->level != UnSet)) {
> + switch (info.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) {
> + fprintf(stderr, Name " Error. Level Migration from %d to %d "\
> + "not supported!\n", info.array.level, geo->level);
> + goto analyse_change_exit;
> + }
> + } else {
> + geo->level = info.array.level;
> + }
> +
> + if ((geo->layout != info.array.layout)
> + && ((geo->layout != UnSet) && (geo->layout != -1))) {
> + change = CH_LEVEL_MIGRATION;
> + if ((info.array.layout == 0) && (info.array.level == 5)
> + && (geo->layout == 5)) {
> + /* reshape 5 -> 4 */
> + } else if ((info.array.layout == 5)
> + && (info.array.level == 5)
> + && (geo->layout == 0)) {
> + /* reshape 4 -> 5 */
> + geo->layout = 0;
> + geo->level = 5;
> + } else {
> + fprintf(stderr, Name " Error. Layout Migration from %d to %d "\
> + "not supported!\n", info.array.layout, geo->layout);
> + change = -1;
> + goto analyse_change_exit;
> + }
> + } else {
> + geo->layout = info.array.layout;
> + }
> +
> + if ((geo->chunksize > 0) && (geo->chunksize != UnSet)
> + && (geo->chunksize != info.array.chunk_size)) {
> + change = CH_CHUNK_MIGR;
> + } else {
> + geo->chunksize = info.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) {
> + fprintf(stderr, Name " 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:
> +
> + return change;
> }
>
> static int imsm_reshape_super(struct supertype *st, long long size, int level,
> @@ -6649,18 +6743,37 @@ static int imsm_reshape_super(struct supertype *st, long long size, int level,
> * - chunk size migration
> * - migration: raid5 -> raid0; raid0 -> raid5
> */
> - int change;
> + struct intel_super *super = st->sb;
> + struct intel_dev *dev = super->devlist;
> + int change, devnum;
> dprintf("imsm: info: Volume operation\n");
> + /* find requested device */
> + while (dev) {
> + imsm_find_array_minor_by_subdev(dev->index, st->container_dev, &devnum);
> + if (devnum == geo.dev_id)
> + break;
> + dev = dev->next;
> + }
> + if (dev == NULL) {
> + fprintf(stderr, Name " Cannot find %s (%i) subarray\n",
> + geo.dev_name, geo.dev_id);
> + goto exit_imsm_reshape_super;
> + }
> + super->current_vol = dev->index;
> 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:
next prev parent reply other threads:[~2011-01-17 2:02 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-01-13 15:32 [PATCH 0/6] Add raid0<->raid10 takeover support for imsm metadata Krzysztof Wojcik
2011-01-13 15:32 ` [PATCH 1/6] Define imsm_analyze_change function Krzysztof Wojcik
2011-01-17 2:02 ` NeilBrown [this message]
2011-01-13 15:32 ` [PATCH 2/6] Set reshape.after.data_disks for raid0<->raid10 takeover Krzysztof Wojcik
2011-01-17 2:03 ` NeilBrown
2011-01-13 15:32 ` [PATCH 3/6] Unfreeze for non re-striping transitions Krzysztof Wojcik
2011-01-17 2:04 ` NeilBrown
2011-01-13 15:32 ` [PATCH 4/6] Add raid10 -> raid0 takeover support Krzysztof Wojcik
2011-01-17 2:06 ` NeilBrown
2011-01-13 15:33 ` [PATCH 5/6] raid0->raid10 takeover- create metadata update Krzysztof Wojcik
2011-01-13 15:33 ` [PATCH 6/6] raid0->raid10 takeover- allocate memory for added disks Krzysztof Wojcik
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20110117130251.6e714992@notabene.brown \
--to=neilb@suse.de \
--cc=adam.kwolek@intel.com \
--cc=dan.j.williams@intel.com \
--cc=ed.ciechanowski@intel.com \
--cc=krzysztof.wojcik@intel.com \
--cc=linux-raid@vger.kernel.org \
--cc=wojciech.neubauer@intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).