All of lore.kernel.org
 help / color / mirror / Atom feed
From: Neil Brown <neilb@suse.de>
To: Doug Nazar <nazard.michi@gmail.com>
Cc: linux-raid@vger.kernel.org
Subject: Re: Endian issue assembling arrays
Date: Thu, 16 Sep 2010 21:03:08 +1000	[thread overview]
Message-ID: <20100916210308.7314c6fb@notabene> (raw)
In-Reply-To: <4C5098DB.7040905@gmail.com>

On Wed, 28 Jul 2010 16:53:47 -0400
Doug Nazar <nazard.michi@gmail.com> wrote:

>   Came across this while testing some updates to GRUB's RAID support.
> 
> Assembling a RAID1 array on a PPC box results in the following warning:
> 
> mdadm: device 1 in /dev/md/0 has wrong state in superblock, but 
> /dev/sdb2 seems ok
> mdadm: /dev/md/0 has been started with 2
> 
> 
> Doug
> 

Thanks for the report and the more recent reminder.

Your patch :

--- mdadm-3.1.2/super1.c	2010-03-09 18:26:44.000000000 -0500
+++ mdadm-3.1.2.dev/super1.c	2010-07-28 16:41:41.000000000 -0400
@@ -673,10 +673,10 @@
 		int d = info->disk.number;
 		int want;
 		if (info->disk.state == 6)
-			want = __cpu_to_le32(info->disk.raid_disk);
+			want = info->disk.raid_disk;
 		else
 			want = 0xFFFF;
-		if (sb->dev_roles[d] != want) {
+		if (__le16_to_cpu(sb->dev_roles[d]) != want) {
 			sb->dev_roles[d] = want;
 			rv = 1;
 		}


isn't quite right.  The assignment needs a conversion too.

I have committed the following to
  http://neil.brown.name/git/mdadm/

Thanks a lot,
NeilBrown

commit a2ce5a1af19e5dcfd59cad117c0e9fccabce7322
Author: NeilBrown <neilb@suse.de>
Date:   Thu Sep 16 20:58:31 2010 +1000

    Fix byte-order conversion in update_super1("assemble")
    
    This code is wrong is several ways, and failed on big-endian machines.
    Put in correct endian coversions: 'want' is cpu-order, dev_roles[] is little-endian,
    16 bit.
    
    Reported-by: Doug Nazar <nazard.michi@gmail.com>
    Signed-off-by: NeilBrown <neilb@suse.de>

diff --git a/super1.c b/super1.c
index 01473d1..0eb0323 100644
--- a/super1.c
+++ b/super1.c
@@ -673,11 +673,11 @@ static int update_super1(struct supertype *st, struct mdinfo *info,
 		int d = info->disk.number;
 		int want;
 		if (info->disk.state == 6)
-			want = __cpu_to_le32(info->disk.raid_disk);
+			want = info->disk.raid_disk;
 		else
 			want = 0xFFFF;
-		if (sb->dev_roles[d] != want) {
-			sb->dev_roles[d] = want;
+		if (sb->dev_roles[d] != __cpu_to_le16(want)) {
+			sb->dev_roles[d] = __cpu_to_le16(want);
 			rv = 1;
 		}
 	}

      reply	other threads:[~2010-09-16 11:03 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-07-28 20:53 Endian issue assembling arrays Doug Nazar
2010-09-16 11:03 ` Neil Brown [this message]

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=20100916210308.7314c6fb@notabene \
    --to=neilb@suse.de \
    --cc=linux-raid@vger.kernel.org \
    --cc=nazard.michi@gmail.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 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.