All of lore.kernel.org
 help / color / mirror / Atom feed
From: NeilBrown <neilb@suse.de>
To: mwilck@arcor.de
Cc: linux-raid@vger.kernel.org
Subject: Re: [PATCH 2/2] DDF: handle fake RAIDs with changing subarray UUIDs
Date: Tue, 10 Sep 2013 09:48:55 +1000	[thread overview]
Message-ID: <20130910094855.21bab8dc@notabene.brown> (raw)
In-Reply-To: <1378752014-8366-1-git-send-email-mwilck@arcor.de>

[-- Attachment #1: Type: text/plain, Size: 3946 bytes --]

On Mon,  9 Sep 2013 20:40:14 +0200 mwilck@arcor.de wrote:

> Some fake RAID BIOSes (in particular, LSI ones) change the
> VD GUID at every boot. These GUIDs are not suitable for
> identifying an array. Luckily the header GUID appears to
> remain constant.
> 
> We construct a pseudo-UUID from the header GUID and those
> properties of the subarray that we expect to remain constant.
> This is only array name and index; all else might change e.g.
> during grow.
> 
> Don't do this for all non-MD arrays, only for those known
> to use varying volume GUIDs.
> 
> This patch obsoletes my previous patch "DDF: new algorithm
> for subarray UUID"
> 
> Signed-off-by: Martin Wilck <mwilck@arcor.de>

Thanks.  Applied.

NeilBrown


> ---
>  super-ddf.c |   55 ++++++++++++++++++++++++++++++++++++++++++++++++++-----
>  1 files changed, 50 insertions(+), 5 deletions(-)
> 
> diff --git a/super-ddf.c b/super-ddf.c
> index 72a8351..19d8494 100644
> --- a/super-ddf.c
> +++ b/super-ddf.c
> @@ -1583,6 +1583,7 @@ static void brief_examine_subarrays_ddf(struct supertype *st, int verbose)
>  			continue;
>  		memcpy(vcl.conf.guid, ve->guid, DDF_GUID_LEN);
>  		ddf->currentconf =&vcl;
> +		vcl.vcnum = i;
>  		uuid_from_super_ddf(st, info.uuid);
>  		fname_from_uuid(st, &info, nbuf1, ':');
>  		memcpy(namebuf, ve->name, sizeof(ve->name));
> @@ -1682,6 +1683,52 @@ static void detail_super_ddf(struct supertype *st, char *homehost)
>  	 */
>  }
>  
> +static const char *vendors_with_variable_volume_UUID[] = {
> +	"LSI      ",
> +};
> +
> +static int volume_id_is_reliable(const struct ddf_super *ddf)
> +{
> +	int n = sizeof(vendors_with_variable_volume_UUID) / 
> +		sizeof(vendors_with_variable_volume_UUID[0]);
> +	int i;
> +	for (i = 0; i < n; i++)
> +		if (!memcmp(ddf->controller.guid,
> +			vendors_with_variable_volume_UUID[i], 8))
> +		return 0;
> +	return 1;
> +}
> +
> +static void uuid_of_ddf_subarray(const struct ddf_super *ddf,
> +				 unsigned int vcnum, int uuid[4])
> +{
> +	char buf[DDF_GUID_LEN+18], sha[20], *p;
> +	struct sha1_ctx ctx;
> +	if (volume_id_is_reliable(ddf)) {
> +		uuid_from_ddf_guid(ddf->virt->entries[vcnum].guid, uuid);
> +		return;
> +	}
> +	/*
> +	 * Some fake RAID BIOSes (in particular, LSI ones) change the
> +	 * VD GUID at every boot. These GUIDs are not suitable for
> +	 * identifying an array. Luckily the header GUID appears to
> +	 * remain constant.
> +	 * We construct a pseudo-UUID from the header GUID and those
> +	 * properties of the subarray that we expect to remain constant.
> +	 */
> +	memset(buf, 0, sizeof(buf));
> +	p = buf;
> +	memcpy(p, ddf->anchor.guid, DDF_GUID_LEN);
> +	p += DDF_GUID_LEN;
> +	memcpy(p, ddf->virt->entries[vcnum].name, 16);
> +	p += 16;
> +	*((__u16 *) p) = vcnum;
> +	sha1_init_ctx(&ctx);
> +	sha1_process_bytes(buf, sizeof(buf), &ctx);
> +	sha1_finish_ctx(&ctx, sha);
> +	memcpy(uuid, sha, 4*4);
> +}
> +
>  static void brief_detail_super_ddf(struct supertype *st)
>  {
>  	struct mdinfo info;
> @@ -1693,7 +1740,7 @@ static void brief_detail_super_ddf(struct supertype *st)
>  	else if (vcnum == DDF_NOTFOUND)
>  		return;
>  	else
> -		uuid_from_ddf_guid(ddf->virt->entries[vcnum].guid, info.uuid);
> +		uuid_of_ddf_subarray(ddf, vcnum, info.uuid);
>  	fname_from_uuid(st, &info, nbuf,':');
>  	printf(" UUID=%s", nbuf + 5);
>  }
> @@ -1836,13 +1883,11 @@ static void uuid_from_super_ddf(struct supertype *st, int uuid[4])
>  	 */
>  	struct ddf_super *ddf = st->sb;
>  	struct vcl *vcl = ddf->currentconf;
> -	char *guid;
>  
>  	if (vcl)
> -		guid = vcl->conf.guid;
> +		uuid_of_ddf_subarray(ddf, vcl->vcnum, uuid);
>  	else
> -		guid = ddf->anchor.guid;
> -	uuid_from_ddf_guid(guid, uuid);
> +		uuid_from_ddf_guid(ddf->anchor.guid, uuid);
>  }
>  
>  static void getinfo_super_ddf_bvd(struct supertype *st, struct mdinfo *info, char *map);


[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 828 bytes --]

  reply	other threads:[~2013-09-09 23:48 UTC|newest]

Thread overview: 17+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-09-06 21:26 [PATCH 1/2] DDF: brief_examine_subarrays_ddf: print array name mwilck
2013-09-06 21:26 ` [PATCH 2/2] DDF: new algorithm for subarray UUID mwilck
2013-09-07 19:23   ` Martin Wilck
2013-09-09  1:20     ` NeilBrown
2013-09-09 18:37       ` Martin Wilck
2013-09-09 23:51         ` NeilBrown
2013-09-09  1:15 ` [PATCH 1/2] DDF: brief_examine_subarrays_ddf: print array name NeilBrown
2013-09-09 18:31   ` Martin Wilck
2013-09-09 18:40     ` [PATCH 2/2] DDF: handle fake RAIDs with changing subarray UUIDs mwilck
2013-09-09 23:48       ` NeilBrown [this message]
2013-09-10  0:01     ` [PATCH 1/2] DDF: brief_examine_subarrays_ddf: print array name NeilBrown
2013-09-11 19:50       ` Martin Wilck
2013-09-11 19:55         ` Martin Wilck
2013-09-12  5:47           ` NeilBrown
2013-09-11 19:55         ` [PATCH 1/2] DDF: factor out array name generation mwilck
2013-09-11 19:55         ` [PATCH 2/2] DDF: brief_examine_subarrays_ddf: print array name mwilck
2013-09-12  5:44           ` NeilBrown

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=20130910094855.21bab8dc@notabene.brown \
    --to=neilb@suse.de \
    --cc=linux-raid@vger.kernel.org \
    --cc=mwilck@arcor.de \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.