[mdadm] Fix gcc-4.7 build breakage

Jes Sorensen jsorensen at fedoraproject.org
Thu Jan 5 13:20:05 UTC 2012


commit 71a7fce336942817e2253cc21ae64ca5db471fa2
Author: Jes Sorensen <Jes.Sorensen at redhat.com>
Date:   Thu Jan 5 12:21:51 2012 +0100

    Fix gcc-4.7 build breakage
    
    Signed-off-by: Jes Sorensen <Jes.Sorensen at redhat.com>

 ...k-around-gcc-4.7-s-strict-aliasing-checks.patch |  122 ++++++++++++++++++++
 1 files changed, 122 insertions(+), 0 deletions(-)
---
diff --git a/mdadm-3.2.3-Work-around-gcc-4.7-s-strict-aliasing-checks.patch b/mdadm-3.2.3-Work-around-gcc-4.7-s-strict-aliasing-checks.patch
new file mode 100644
index 0000000..52c0bbd
--- /dev/null
+++ b/mdadm-3.2.3-Work-around-gcc-4.7-s-strict-aliasing-checks.patch
@@ -0,0 +1,122 @@
+From b89b2007a01f60386fb53107b883eed85319281c Mon Sep 17 00:00:00 2001
+From: Jes Sorensen <Jes.Sorensen at redhat.com>
+Date: Thu, 5 Jan 2012 12:09:45 +0100
+Subject: [PATCH 1/1] Work around gcc-4.7's strict aliasing checks
+
+Signed-off-by: Jes Sorensen <Jes.Sorensen at redhat.com>
+---
+ sha1.c      |    8 +++++---
+ super-ddf.c |   22 ++++++++++++++--------
+ 2 files changed, 19 insertions(+), 11 deletions(-)
+
+diff --git a/sha1.c b/sha1.c
+index 556d9ca..0258515 100644
+--- a/sha1.c
++++ b/sha1.c
+@@ -101,6 +101,7 @@ sha1_finish_ctx (struct sha1_ctx *ctx, void *resbuf)
+   /* Take yet unprocessed bytes into account.  */
+   md5_uint32 bytes = ctx->buflen;
+   size_t pad;
++  md5_uint32 *ptr;
+ 
+   /* Now count remaining bytes.  */
+   ctx->total[0] += bytes;
+@@ -111,9 +112,10 @@ sha1_finish_ctx (struct sha1_ctx *ctx, void *resbuf)
+   memcpy (&ctx->buffer[bytes], fillbuf, pad);
+ 
+   /* Put the 64-bit file length in *bits* at the end of the buffer.  */
+-  *(md5_uint32 *) &ctx->buffer[bytes + pad + 4] = SWAP (ctx->total[0] << 3);
+-  *(md5_uint32 *) &ctx->buffer[bytes + pad] = SWAP ((ctx->total[1] << 3) |
+-						    (ctx->total[0] >> 29));
++  ptr = (md5_uint32 *) &ctx->buffer[bytes + pad + 4];
++  *ptr = SWAP (ctx->total[0] << 3);
++  ptr = (md5_uint32 *) &ctx->buffer[bytes + pad];
++  *ptr = SWAP ((ctx->total[1] << 3) | (ctx->total[0] >> 29));
+ 
+   /* Process last bytes.  */
+   sha1_process_block (ctx->buffer, bytes + pad + 8, ctx);
+diff --git a/super-ddf.c b/super-ddf.c
+index b5b0b42..abd6793 100644
+--- a/super-ddf.c
++++ b/super-ddf.c
+@@ -1336,6 +1336,7 @@ static void getinfo_super_ddf(struct supertype *st, struct mdinfo *info, char *m
+ {
+ 	struct ddf_super *ddf = st->sb;
+ 	int map_disks = info->array.raid_disks;
++	__u32 *cptr;
+ 
+ 	if (ddf->currentconf) {
+ 		getinfo_super_ddf_bvd(st, info, map);
+@@ -1347,8 +1348,9 @@ static void getinfo_super_ddf(struct supertype *st, struct mdinfo *info, char *m
+ 	info->array.level	  = LEVEL_CONTAINER;
+ 	info->array.layout	  = 0;
+ 	info->array.md_minor	  = -1;
+-	info->array.ctime	  = DECADE + __be32_to_cpu(*(__u32*)
+-							 (ddf->anchor.guid+16));
++	cptr = (__u32 *)(ddf->anchor.guid + 16);
++	info->array.ctime	  = DECADE + __be32_to_cpu(*cptr);
++
+ 	info->array.utime	  = 0;
+ 	info->array.chunk_size	  = 0;
+ 	info->container_enough	  = 1;
+@@ -1407,6 +1409,7 @@ static void getinfo_super_ddf_bvd(struct supertype *st, struct mdinfo *info, cha
+ 	int j;
+ 	struct dl *dl;
+ 	int map_disks = info->array.raid_disks;
++	__u32 *cptr;
+ 
+ 	memset(info, 0, sizeof(*info));
+ 	/* FIXME this returns BVD info - what if we want SVD ?? */
+@@ -1416,8 +1419,8 @@ static void getinfo_super_ddf_bvd(struct supertype *st, struct mdinfo *info, cha
+ 	info->array.layout	  = rlq_to_layout(vc->conf.rlq, vc->conf.prl,
+ 						  info->array.raid_disks);
+ 	info->array.md_minor	  = -1;
+-	info->array.ctime	  = DECADE +
+-		__be32_to_cpu(*(__u32*)(vc->conf.guid+16));
++	cptr = (__u32 *)(vc->conf.guid + 16);
++	info->array.ctime	  = DECADE + __be32_to_cpu(*cptr);
+ 	info->array.utime	  = DECADE + __be32_to_cpu(vc->conf.timestamp);
+ 	info->array.chunk_size	  = 512 << vc->conf.chunk_shift;
+ 	info->custom_array_size	  = 0;
+@@ -2192,6 +2195,7 @@ static int add_to_super_ddf(struct supertype *st,
+ 	struct phys_disk_entry *pde;
+ 	unsigned int n, i;
+ 	struct stat stb;
++	__u32 *tptr;
+ 
+ 	if (ddf->currentconf) {
+ 		add_to_super_ddf_bvd(st, dk, fd, devname);
+@@ -2220,8 +2224,9 @@ static int add_to_super_ddf(struct supertype *st,
+ 	tm = localtime(&now);
+ 	sprintf(dd->disk.guid, "%8s%04d%02d%02d",
+ 		T10, tm->tm_year+1900, tm->tm_mon+1, tm->tm_mday);
+-	*(__u32*)(dd->disk.guid + 16) = random32();
+-	*(__u32*)(dd->disk.guid + 20) = random32();
++	tptr = (__u32 *)(dd->disk.guid + 16);
++	*tptr++ = random32();
++	*tptr = random32();
+ 
+ 	do {
+ 		/* Cannot be bothered finding a CRC of some irrelevant details*/
+@@ -2967,6 +2972,7 @@ static struct mdinfo *container_content_ddf(struct supertype *st, char *subarray
+ 		unsigned int j;
+ 		struct mdinfo *this;
+ 		char *ep;
++		__u32 *cptr;
+ 
+ 		if (subarray &&
+ 		    (strtoul(subarray, &ep, 10) != vc->vcnum ||
+@@ -2986,8 +2992,8 @@ static struct mdinfo *container_content_ddf(struct supertype *st, char *subarray
+ 		this->array.md_minor      = -1;
+ 		this->array.major_version = -1;
+ 		this->array.minor_version = -2;
+-		this->array.ctime         = DECADE +
+-			__be32_to_cpu(*(__u32*)(vc->conf.guid+16));
++		cptr = (__u32 *)(vc->conf.guid + 16);
++		this->array.ctime         = DECADE + __be32_to_cpu(*cptr);
+ 		this->array.utime	  = DECADE +
+ 			__be32_to_cpu(vc->conf.timestamp);
+ 		this->array.chunk_size	  = 512 << vc->conf.chunk_shift;
+-- 
+1.7.8.2
+


More information about the scm-commits mailing list