[PATCH] compile cleanly with -Wstrict-aliasing=1

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

 



Signed-off-by: Michal Soltys <soltys@xxxxxxxx>
---
 Grow.c        |   14 ++++++------
 Makefile      |    2 +-
 bitmap.h      |    2 +-
 managemon.c   |   13 ++++++-----
 md5.h         |    1 +
 mdadm.h       |   13 +++++++++-
 part.h        |    4 +-
 restripe.c    |   11 ++++++---
 sha1.c        |    8 ++----
 super-ddf.c   |   64 +++++++++++++++++++++++++-------------------------------
 super-gpt.c   |    2 +-
 super-intel.c |   37 +++++++++++++++++----------------
 super-mbr.c   |    4 +-
 super0.c      |   14 +++++++-----
 super1.c      |   17 +++++++++------
 util.c        |    7 +++--
 16 files changed, 113 insertions(+), 100 deletions(-)

diff --git a/Grow.c b/Grow.c
index b2c1360..e10e020 100644
--- a/Grow.c
+++ b/Grow.c
@@ -766,11 +766,11 @@ int remove_disks_for_takeover(struct supertype *st,
 	sra->devs = NULL;
 	/* for each 'copy', select one device and remove from the list. */
 	for (slot = 0; slot < sra->array.raid_disks; slot += nr_of_copies) {
-		struct mdinfo **diskp;
+		mdinfo_pa *diskp;
 		int found = 0;
 
 		/* Find a working device to keep */
-		for (diskp =  &remaining; *diskp ; diskp = &(*diskp)->next) {
+		for (diskp = &remaining; *diskp ; diskp = (mdinfo_pa *)&(*diskp)->next) {
 			struct mdinfo *disk = *diskp;
 
 			if (disk->disk.raid_disk < slot)
@@ -797,10 +797,10 @@ int remove_disks_for_takeover(struct supertype *st,
 
 	if (slot < sra->array.raid_disks) {
 		/* didn't find all slots */
-		struct mdinfo **e;
+		mdinfo_pa *e;
 		e = &remaining;
 		while (*e)
-			e = &(*e)->next;
+			e = (mdinfo_pa *)&(*e)->next;
 		*e = sra->devs;
 		sra->devs = remaining;
 		return 1;
@@ -3177,8 +3177,8 @@ static void validate(int afd, int bfd, unsigned long long offset)
 			free(abuf);
 			free(bbuf);
 			abuflen = len;
-			if (posix_memalign((void**)&abuf, 4096, abuflen) ||
-			    posix_memalign((void**)&bbuf, 4096, abuflen)) {
+			if (posix_memalign((void_pa *)&abuf, 4096, abuflen) ||
+			    posix_memalign((void_pa *)&bbuf, 4096, abuflen)) {
 				abuflen = 0;
 				/* just stop validating on mem-alloc failure */
 				return;
@@ -3291,7 +3291,7 @@ int child_monitor(int afd, struct mdinfo *sra, struct reshape *reshape,
 	stripes = blocks / (sra->array.chunk_size/512) /
 		reshape->before.data_disks;
 
-	if (posix_memalign((void**)&buf, 4096, disks * chunk))
+	if (posix_memalign((void_pa *)&buf, 4096, disks * chunk))
 		/* Don't start the 'reshape' */
 		return 0;
 	if (reshape->before.data_disks == reshape->after.data_disks) {
diff --git a/Makefile b/Makefile
index b8d363f..0cdf9d3 100644
--- a/Makefile
+++ b/Makefile
@@ -42,7 +42,7 @@ KLIBC_GCC = gcc -nostdinc -iwithprefix include -I$(KLIBC)/klibc/include -I$(KLIB
 
 CC = $(CROSS_COMPILE)gcc
 CXFLAGS = -ggdb
-CWFLAGS = -Wall -Werror -Wstrict-prototypes -Wextra -Wno-unused-parameter
+CWFLAGS = -Wall -Werror -Wstrict-prototypes -Wextra -Wno-unused-parameter -Wstrict-aliasing=1
 ifdef WARN_UNUSED
 CWFLAGS += -Wp,-D_FORTIFY_SOURCE=2 -O
 endif
diff --git a/bitmap.h b/bitmap.h
index c8725a3..bfc4067 100644
--- a/bitmap.h
+++ b/bitmap.h
@@ -143,7 +143,7 @@ enum bitmap_state {
 };
 
 /* the superblock at the front of the bitmap file -- little endian */
-typedef struct bitmap_super_s {
+typedef struct __attribute__((may_alias)) bitmap_super_s {
 	__u32 magic;        /*  0  BITMAP_MAGIC */
 	__u32 version;      /*  4  the bitmap major for now, could change... */
 	__u8  uuid[16];     /*  8  128 bit uuid - must match md device uuid */
diff --git a/managemon.c b/managemon.c
index cde0d8b..10dad68 100644
--- a/managemon.c
+++ b/managemon.c
@@ -148,16 +148,16 @@ static void free_aa(struct active_array *aa)
 static struct active_array *duplicate_aa(struct active_array *aa)
 {
 	struct active_array *newa = malloc(sizeof(*newa));
-	struct mdinfo **dp1, **dp2;
+	mdinfo_pa *dp1, *dp2;
 
 	*newa = *aa;
 	newa->next = NULL;
 	newa->replaces = NULL;
 	newa->info.next = NULL;
 
-	dp2 = &newa->info.devs;
+	dp2 = (mdinfo_pa *)&newa->info.devs;
 
-	for (dp1 = &aa->info.devs; *dp1; dp1 = &(*dp1)->next) {
+	for (dp1 = (mdinfo_pa *)&aa->info.devs; *dp1; dp1 = (mdinfo_pa *)&(*dp1)->next) {
 		struct mdinfo *d;
 		if ((*dp1)->state_fd < 0)
 			continue;
@@ -165,7 +165,7 @@ static struct active_array *duplicate_aa(struct active_array *aa)
 		d = malloc(sizeof(*d));
 		*d = **dp1;
 		*dp2 = d;
-		dp2 = & d->next;
+		dp2 = (mdinfo_pa *)&d->next;
 	}
 	*dp2 = NULL;
 
@@ -351,7 +351,8 @@ static void manage_container(struct mdstat_ent *mdstat,
 	 * about spare assignment.... probably not.
 	 */
 	if (mdstat->devcnt != container->devcnt) {
-		struct mdinfo **cdp, *cd, *di, *mdi;
+		struct mdinfo *cd, *di, *mdi;
+		mdinfo_pa *cdp;
 		int found;
 
 		/* read /sys/block/NAME/md/dev-??/block/dev to find out
@@ -381,7 +382,7 @@ static void manage_container(struct mdstat_ent *mdstat,
 				remove_disk_from_container(container, cd);
 				free(cd);
 			} else
-				cdp = &(*cdp)->next;
+				cdp = (mdinfo_pa *)&(*cdp)->next;
 		}
 
 		/* check for additions */
diff --git a/md5.h b/md5.h
index 145970d..dde7a4d 100644
--- a/md5.h
+++ b/md5.h
@@ -65,6 +65,7 @@
 #endif
 
 typedef uint32_t md5_uint32;
+typedef uint32_t md5_uint32_a __attribute__((may_alias));
 
 /* Structure to save state of computation between the single steps.  */
 struct md5_ctx
diff --git a/mdadm.h b/mdadm.h
index 381ef86..c5f286a 100644
--- a/mdadm.h
+++ b/mdadm.h
@@ -105,7 +105,6 @@ extern __off64_t lseek64 __P ((int __fd, __off64_t __offset, int __whence));
 #include	"md_u.h"
 #include	"md_p.h"
 #include	"bitmap.h"
-#include	"msg.h"
 
 #include <endian.h>
 /* Redhat don't like to #include <asm/byteorder.h>, and
@@ -163,6 +162,13 @@ extern __off64_t lseek64 __P ((int __fd, __off64_t __offset, int __whence));
 #endif /* __KLIBC__ */
 
 
+/* strict-alias typedefs */
+typedef void *void_pa __attribute__((may_alias));
+typedef __u64 __u64_a __attribute__((may_alias));
+typedef __u32 __u32_a __attribute__((may_alias));
+typedef __u16 __u16_a __attribute__((may_alias));
+typedef __u8 *__u8_pa __attribute__((may_alias));
+
 /*
  * min()/max()/clamp() macros that also do
  * strict type-checking.. See the
@@ -181,7 +187,7 @@ extern __off64_t lseek64 __P ((int __fd, __off64_t __offset, int __whence));
 	_max1 > _max2 ? _max1 : _max2; })
 
 /* general information that might be extracted from a superblock */
-struct mdinfo {
+struct __attribute__((may_alias)) mdinfo {
 	mdu_array_info_t	array;
 	mdu_disk_info_t		disk;
 	__u64			events;
@@ -242,6 +248,9 @@ struct mdinfo {
 	int prev_state, curr_state, next_state;
 
 };
+typedef struct mdinfo *mdinfo_pa __attribute__((may_alias));
+
+#include	"msg.h"
 
 struct createinfo {
 	int	uid;
diff --git a/part.h b/part.h
index 0afea33..bf1131a 100644
--- a/part.h
+++ b/part.h
@@ -47,7 +47,7 @@ struct MBR {
 	__u8 pad[446];
 	struct MBR_part_record parts[MBR_PARTITIONS];
 	__u16 magic;
-} __attribute__((packed));
+} __attribute__((packed, may_alias));
 
 
 
@@ -79,4 +79,4 @@ struct GPT {
 	__u32 part_size;
 	__u32 part_crc;
 	__u8 pad2[420];
-} __attribute__((packed));
+} __attribute__((packed, may_alias));
diff --git a/restripe.c b/restripe.c
index 00e7a82..3880b18 100644
--- a/restripe.c
+++ b/restripe.c
@@ -223,7 +223,7 @@ static void xor_blocks(char *target, char **sources, int disks, int size)
 	}
 }
 
-void qsyndrome(uint8_t *p, uint8_t *q, uint8_t **sources, int disks, int size)
+void qsyndrome(uint8_t *p, uint8_t *q, __u8_pa *sources, int disks, int size)
 {
 	int d, z;
 	uint8_t wq0, wp0, wd0, w10, w20;
@@ -691,7 +691,7 @@ int restore_stripes(int *dest, unsigned long long *offsets,
 
 	int data_disks = raid_disks - (level == 0 ? 0 : level <= 5 ? 1 : 2);
 
-	if (posix_memalign((void**)&stripe_buf, 4096, raid_disks * chunk_size))
+	if (posix_memalign((void_pa *)&stripe_buf, 4096, raid_disks * chunk_size))
 		stripe_buf = NULL;
 
 	if (zero == NULL || chunk_size > zero_size) {
@@ -780,7 +780,7 @@ int restore_stripes(int *dest, unsigned long long *offsets,
 			}
 			qsyndrome((uint8_t*)stripes[disk],
 				  (uint8_t*)stripes[qdisk], 
-				  (uint8_t**)blocks,
+				  (__u8_pa *)blocks,
 				  syndrome_disks, chunk_size);
 			break;
 		}
@@ -847,7 +847,10 @@ int test_stripes(int *source, unsigned long long *offsets,
 		}
 		switch(level) {
 		case 6:
-			qsyndrome(p, q, (uint8_t**)blocks, data_disks, chunk_size);
+			qsyndrome((uint8_t*)p,
+				  (uint8_t*)q,
+				  (__u8_pa *)blocks,
+				  data_disks, chunk_size);
 			diskP = geo_map(-1, start/chunk_size, raid_disks,
 				       level, layout);
 			if (memcmp(p, stripes[diskP], chunk_size) != 0) {
diff --git a/sha1.c b/sha1.c
index 0258515..fab3c23 100644
--- a/sha1.c
+++ b/sha1.c
@@ -101,7 +101,6 @@ 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;
@@ -112,10 +111,9 @@ 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.  */
-  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));
+  *(md5_uint32_a *) &ctx->buffer[bytes + pad + 4] = SWAP (ctx->total[0] << 3);
+  *(md5_uint32_a *) &ctx->buffer[bytes + pad] = 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 abd6793..4cef507 100644
--- a/super-ddf.c
+++ b/super-ddf.c
@@ -399,12 +399,12 @@ struct ddf_super {
 	unsigned int max_part, mppe, conf_rec_len;
 	int currentdev;
 	int updates_pending;
-	struct vcl {
+	struct __attribute__((may_alias)) vcl {
 		union {
 			char space[512];
 			struct {
 				struct vcl	*next;
-				__u64		*lba_offset; /* location in 'conf' of
+				__u64_a		*lba_offset; /* location in 'conf' of
 							      * the lba table */
 				unsigned int	vcnum; /* index into ->virt */
 				__u64		*block_sizes; /* NULL if all the same */
@@ -649,7 +649,7 @@ static int load_ddf_local(int fd, struct ddf_super *super,
 	unsigned long long dsize;
 
 	/* First the local disk info */
-	if (posix_memalign((void**)&dl, 512,
+	if (posix_memalign((void_pa *)&dl, 512,
 		       sizeof(*dl) +
 		       (super->max_part) * sizeof(dl->vlist[0])) != 0) {
 		fprintf(stderr, Name ": %s could not allocate disk info buffer\n",
@@ -704,7 +704,7 @@ static int load_ddf_local(int fd, struct ddf_super *super,
 		if (vd->magic == DDF_SPARE_ASSIGN_MAGIC) {
 			if (dl->spare)
 				continue;
-			if (posix_memalign((void**)&dl->spare, 512,
+			if (posix_memalign((void_pa *)&dl->spare, 512,
 				       super->conf_rec_len*512) != 0) {
 				fprintf(stderr, Name
 					": %s could not allocate spare info buf\n",
@@ -729,7 +729,7 @@ static int load_ddf_local(int fd, struct ddf_super *super,
 			    __be32_to_cpu(vcl->conf.seqnum))
 				continue;
 		} else {
-			if (posix_memalign((void**)&vcl, 512,
+			if (posix_memalign((void_pa *)&vcl, 512,
 				       (super->conf_rec_len*512 +
 					offsetof(struct vcl, conf))) != 0) {
 				fprintf(stderr, Name
@@ -743,7 +743,7 @@ static int load_ddf_local(int fd, struct ddf_super *super,
 			dl->vlist[vnum++] = vcl;
 		}
 		memcpy(&vcl->conf, vd, super->conf_rec_len*512);
-		vcl->lba_offset = (__u64*)
+		vcl->lba_offset = (__u64_a *)
 			&vcl->conf.phys_refnum[super->mppe];
 
 		for (i=0; i < max_virt_disks ; i++)
@@ -760,7 +760,7 @@ static int load_ddf_local(int fd, struct ddf_super *super,
 
 #ifndef MDASSEMBLE
 static int load_super_ddf_all(struct supertype *st, int fd,
-			      void **sbp, char *devname);
+			      void_pa *sbp, char *devname);
 #endif
 
 static void free_super_ddf(struct supertype *st);
@@ -799,7 +799,7 @@ static int load_super_ddf(struct supertype *st, int fd,
 
 	free_super_ddf(st);
 
-	if (posix_memalign((void**)&super, 512, sizeof(*super))!= 0) {
+	if (posix_memalign((void_pa *)&super, 512, sizeof(*super))!= 0) {
 		fprintf(stderr, Name ": malloc of %zu failed.\n",
 			sizeof(*super));
 		return 1;
@@ -1336,7 +1336,6 @@ 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);
@@ -1348,9 +1347,8 @@ 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;
-	cptr = (__u32 *)(ddf->anchor.guid + 16);
-	info->array.ctime	  = DECADE + __be32_to_cpu(*cptr);
-
+	info->array.ctime	  = DECADE + __be32_to_cpu(*(__u32_a *)
+							 (ddf->anchor.guid+16));
 	info->array.utime	  = 0;
 	info->array.chunk_size	  = 0;
 	info->container_enough	  = 1;
@@ -1409,7 +1407,6 @@ 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 ?? */
@@ -1419,8 +1416,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;
-	cptr = (__u32 *)(vc->conf.guid + 16);
-	info->array.ctime	  = DECADE + __be32_to_cpu(*cptr);
+	info->array.ctime	  = DECADE +
+		__be32_to_cpu(*(__u32_a *)(vc->conf.guid+16));
 	info->array.utime	  = DECADE + __be32_to_cpu(vc->conf.timestamp);
 	info->array.chunk_size	  = 512 << vc->conf.chunk_shift;
 	info->custom_array_size	  = 0;
@@ -1628,7 +1625,7 @@ static int init_super_ddf(struct supertype *st,
 	if (st->sb)
 		return init_super_ddf_bvd(st, info, size, name, homehost, uuid);
 
-	if (posix_memalign((void**)&ddf, 512, sizeof(*ddf)) != 0) {
+	if (posix_memalign((void_pa *)&ddf, 512, sizeof(*ddf)) != 0) {
 		fprintf(stderr, Name ": %s could not allocate superblock\n", __func__);
 		return 0;
 	}
@@ -1766,7 +1763,7 @@ static int init_super_ddf(struct supertype *st,
 	if (homehost && strlen(homehost) < 440)
 		strcpy((char*)ddf->controller.vendor_data, homehost);
 
-	if (posix_memalign((void**)&pd, 512, pdsize) != 0) {
+	if (posix_memalign((void_pa *)&pd, 512, pdsize) != 0) {
 		fprintf(stderr, Name ": %s could not allocate pd\n", __func__);
 		return 0;
 	}
@@ -1780,7 +1777,7 @@ static int init_super_ddf(struct supertype *st,
 	pd->max_pdes = __cpu_to_be16(max_phys_disks);
 	memset(pd->pad, 0xff, 52);
 
-	if (posix_memalign((void**)&vd, 512, vdsize) != 0) {
+	if (posix_memalign((void_pa *)&vd, 512, vdsize) != 0) {
 		fprintf(stderr, Name ": %s could not allocate vd\n", __func__);
 		return 0;
 	}
@@ -2021,12 +2018,12 @@ static int init_super_ddf_bvd(struct supertype *st,
 		__cpu_to_be16(__be16_to_cpu(ddf->virt->populated_vdes)+1);
 
 	/* Now create a new vd_config */
-	if (posix_memalign((void**)&vcl, 512,
+	if (posix_memalign((void_pa *)&vcl, 512,
 		           (offsetof(struct vcl, conf) + ddf->conf_rec_len * 512)) != 0) {
 		fprintf(stderr, Name ": %s could not allocate vd_config\n", __func__);
 		return 0;
 	}
-	vcl->lba_offset = (__u64*) &vcl->conf.phys_refnum[ddf->mppe];
+	vcl->lba_offset = (__u64_a *) &vcl->conf.phys_refnum[ddf->mppe];
 	vcl->vcnum = venum;
 	vcl->block_sizes = NULL; /* FIXME not for CONCAT */
 
@@ -2095,7 +2092,7 @@ static void add_to_super_ddf_bvd(struct supertype *st,
 	struct dl *dl;
 	struct ddf_super *ddf = st->sb;
 	struct vd_config *vc;
-	__u64 *lba_offset;
+	__u64_a *lba_offset;
 	unsigned int working;
 	unsigned int i;
 	unsigned long long blocks, pos, esize;
@@ -2195,7 +2192,6 @@ 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);
@@ -2206,7 +2202,7 @@ static int add_to_super_ddf(struct supertype *st,
 	 * a phys_disk entry and a more detailed disk_data entry.
 	 */
 	fstat(fd, &stb);
-	if (posix_memalign((void**)&dd, 512,
+	if (posix_memalign((void_pa *)&dd, 512,
 		           sizeof(*dd) + sizeof(dd->vlist[0]) * ddf->max_part) != 0) {
 		fprintf(stderr, Name
 			": %s could allocate buffer for new disk, aborting\n",
@@ -2224,9 +2220,8 @@ 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);
-	tptr = (__u32 *)(dd->disk.guid + 16);
-	*tptr++ = random32();
-	*tptr = random32();
+	*(__u32_a *)(dd->disk.guid + 16) = random32();
+	*(__u32_a *)(dd->disk.guid + 20) = random32();
 
 	do {
 		/* Cannot be bothered finding a CRC of some irrelevant details*/
@@ -2721,7 +2716,7 @@ static int validate_geometry_ddf(struct supertype *st,
 		 * and try to create a bvd
 		 */
 		struct ddf_super *ddf;
-		if (load_super_ddf_all(st, cfd, (void **)&ddf, NULL) == 0) {
+		if (load_super_ddf_all(st, cfd, (void_pa *)&ddf, NULL) == 0) {
 			st->sb = ddf;
 			st->container_dev = fd2devnum(cfd);
 			close(cfd);
@@ -2868,7 +2863,7 @@ static int validate_geometry_ddf_bvd(struct supertype *st,
 }
 
 static int load_super_ddf_all(struct supertype *st, int fd,
-			      void **sbp, char *devname)
+			      void_pa *sbp, char *devname)
 {
 	struct mdinfo *sra;
 	struct ddf_super *super;
@@ -2886,7 +2881,7 @@ static int load_super_ddf_all(struct supertype *st, int fd,
 	    strcmp(sra->text_version, "ddf") != 0)
 		return 1;
 
-	if (posix_memalign((void**)&super, 512, sizeof(*super)) != 0)
+	if (posix_memalign((void_pa *)&super, 512, sizeof(*super)) != 0)
 		return 1;
 	memset(super, 0, sizeof(*super));
 
@@ -2972,7 +2967,6 @@ 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 ||
@@ -2992,8 +2986,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;
-		cptr = (__u32 *)(vc->conf.guid + 16);
-		this->array.ctime         = DECADE + __be32_to_cpu(*cptr);
+		this->array.ctime         = DECADE +
+			__be32_to_cpu(*(__u32_a *)(vc->conf.guid+16));
 		this->array.utime	  = DECADE +
 			__be32_to_cpu(vc->conf.timestamp);
 		this->array.chunk_size	  = 512 << vc->conf.chunk_shift;
@@ -3480,7 +3474,7 @@ static void ddf_process_update(struct supertype *st,
 			update->space = NULL;
 			vcl->next = ddf->conflist;
 			memcpy(&vcl->conf, vc, update->len);
-			vcl->lba_offset = (__u64*)
+			vcl->lba_offset = (__u64_a *)
 				&vcl->conf.phys_refnum[mppe];
 			for (ent = 0;
 			     ent < __be16_to_cpu(ddf->virt->populated_vdes);
@@ -3632,7 +3626,7 @@ static struct mdinfo *ddf_activate_spare(struct active_array *a,
 	struct dl *dl;
 	int i;
 	struct vd_config *vc;
-	__u64 *lba;
+	__u64_a *lba;
 
 	for (d = a->info.devs ; d ; d = d->next) {
 		if ((d->curr_state & DS_FAULTY) &&
@@ -3810,7 +3804,7 @@ static struct mdinfo *ddf_activate_spare(struct active_array *a,
 	memcpy(mu->buf, vc, ddf->conf_rec_len * 512);
 
 	vc = (struct vd_config*)mu->buf;
-	lba = (__u64*)&vc->phys_refnum[ddf->mppe];
+	lba = (__u64_a *)&vc->phys_refnum[ddf->mppe];
 	for (di = rv ; di ; di = di->next) {
 		vc->phys_refnum[di->disk.raid_disk] =
 			ddf->phys->entries[dl->pdnum].refnum;
diff --git a/super-gpt.c b/super-gpt.c
index 75269bf..3558219 100644
--- a/super-gpt.c
+++ b/super-gpt.c
@@ -76,7 +76,7 @@ static int load_gpt(struct supertype *st, int fd, char *devname)
 
 	free_gpt(st);
 
-	if (posix_memalign((void**)&super, 4096, 32*512) != 0) {
+	if (posix_memalign((void_pa *)&super, 4096, 32*512) != 0) {
 		fprintf(stderr, Name ": %s could not allocate superblock\n",
 			__func__);
 		return 1;
diff --git a/super-intel.c b/super-intel.c
index 0e9269f..20c0145 100644
--- a/super-intel.c
+++ b/super-intel.c
@@ -187,7 +187,7 @@ struct imsm_dev {
 #define IMSM_DEV_FILLERS 10
 	__u32 filler[IMSM_DEV_FILLERS];
 	struct imsm_vol vol;
-} __attribute__ ((packed));
+} __attribute__ ((packed, may_alias));
 
 struct imsm_super {
 	__u8 sig[MAX_SIGNATURE_LENGTH];	/* 0x00 - 0x1F */
@@ -345,7 +345,7 @@ struct intel_super {
 	__u32 create_offset; /* common start for 'current_vol' */
 	__u32 random; /* random data for seeding new family numbers */
 	struct intel_dev *devlist;
-	struct dl {
+	struct __attribute__((may_alias)) dl {
 		struct dl *next;
 		int index;
 		__u8 serial[MAX_RAID_SERIAL_LEN];
@@ -366,6 +366,7 @@ struct intel_super {
 	const struct imsm_orom *orom; /* platform firmware support */
 	struct intel_super *next; /* (temp) list for disambiguating family_num */
 };
+typedef struct dl *dl_pa __attribute__((may_alias));
 
 struct intel_disk {
 	struct imsm_disk disk;
@@ -654,7 +655,7 @@ static struct imsm_disk *get_imsm_disk(struct intel_super *super, __u8 index)
 static __u32 __gen_imsm_checksum(struct imsm_super *mpb)
 {
 	__u32 end = mpb->mpb_size / sizeof(end);
-	__u32 *p = (__u32 *) mpb;
+	__u32_a *p = (__u32_a *) mpb;
 	__u32 sum = 0;
 
         while (end--) {
@@ -3390,7 +3391,7 @@ static int load_imsm_mpb(int fd, struct intel_super *super, char *devname)
 		return 1;
 	}
 
-	if (posix_memalign((void**)&anchor, 512, 512) != 0) {
+	if (posix_memalign((void_pa *)&anchor, 512, 512) != 0) {
 		if (devname)
 			fprintf(stderr,
 				Name ": Failed to allocate imsm anchor buffer"
@@ -4009,7 +4010,7 @@ imsm_thunderdome(struct intel_super **super_list, int len)
 	return champion;
 }
 
-static int load_super_imsm_all(struct supertype *st, int fd, void **sbp,
+static int load_super_imsm_all(struct supertype *st, int fd, void_pa *sbp,
 			       char *devname)
 {
 	struct mdinfo *sra;
@@ -5622,7 +5623,7 @@ static int validate_geometry_imsm(struct supertype *st, int level, int layout,
 		 */
 		struct intel_super *super;
 
-		if (load_super_imsm_all(st, cfd, (void **) &super, NULL) == 0) {
+		if (load_super_imsm_all(st, cfd, (void_pa *) &super, NULL) == 0) {
 			st->sb = super;
 			st->container_dev = fd2devnum(cfd);
 			close(cfd);
@@ -7179,7 +7180,7 @@ static int apply_reshape_migration_update(struct imsm_update_reshape_migration *
 						void ***space_list)
 {
 	struct intel_dev *id;
-	void **tofree = NULL;
+	void_pa *tofree = NULL;
 	int ret_val = 0;
 
 	dprintf("apply_reshape_migration_update()\n");
@@ -7239,7 +7240,7 @@ static int apply_reshape_migration_update(struct imsm_update_reshape_migration *
 						     ord);
 			}
 			id->dev = new_dev;
-			tofree = (void **)dev;
+			tofree = (void_pa *)dev;
 
 			/* update chunk size
 			 */
@@ -7389,19 +7390,19 @@ static int apply_update_activate_spare(struct imsm_update_activate_spare *u,
 		 * utilized anywhere
 		 */
 		if (!found) {
-			struct dl **dlp;
+			dl_pa *dlp;
 
 			/* We know that 'manager' isn't touching anything,
 			 * so it is safe to delete
 			 */
-			for (dlp = &super->disks; *dlp; dlp = &(*dlp)->next)
+			for (dlp = (dl_pa *)&super->disks; *dlp; dlp = (dl_pa *)&(*dlp)->next)
 				if ((*dlp)->index == victim)
 					break;
 
 			/* victim may be on the missing list */
 			if (!*dlp)
 				for (dlp = &super->missing; *dlp;
-				     dlp = &(*dlp)->next)
+				     dlp = (dl_pa *)&(*dlp)->next)
 					if ((*dlp)->index == victim)
 						break;
 			imsm_delete(super, dlp, victim);
@@ -7455,7 +7456,7 @@ static int apply_reshape_container_disks_update(struct imsm_update_reshape *u,
 	/* manage changes in volume
 	 */
 	for (dev_id = 0; dev_id < mpb->num_raid_devs; dev_id++) {
-		void **sp = *space_list;
+		void_pa *sp = *space_list;
 		struct imsm_dev *newdev;
 		struct imsm_map *newmap, *oldmap;
 
@@ -7498,7 +7499,7 @@ static int apply_reshape_container_disks_update(struct imsm_update_reshape *u,
 			imsm_set_array_size(newdev);
 		}
 
-		sp = (void **)id->dev;
+		sp = (void_pa *)id->dev;
 		id->dev = newdev;
 		*sp = tofree;
 		tofree = sp;
@@ -7933,7 +7934,7 @@ static void imsm_prepare_update(struct supertype *st,
 	case update_takeover: {
 		struct imsm_update_takeover *u = (void *)update->buf;
 		if (u->direction == R0_TO_R10) {
-			void **tail = (void **)&update->space_list;
+			void_pa *tail = (void_pa *)&update->space_list;
 			struct imsm_dev *dev = get_imsm_dev(super, u->subarray);
 			struct imsm_map *map = get_imsm_map(dev, MAP_0);
 			int num_members = map->num_members;
@@ -7988,7 +7989,7 @@ static void imsm_prepare_update(struct supertype *st,
 		 */
 		struct imsm_update_reshape *u = (void *)update->buf;
 		struct intel_dev *dl;
-		void **space_tail = (void**)&update->space_list;
+		void_pa *space_tail = (void_pa *)&update->space_list;
 
 		dprintf("imsm: imsm_prepare_update() for update_reshape\n");
 
@@ -8019,7 +8020,7 @@ static void imsm_prepare_update(struct supertype *st,
 		 */
 		struct imsm_update_reshape_migration *u = (void *)update->buf;
 		struct intel_dev *id;
-		void **space_tail = (void **)&update->space_list;
+		void_pa *space_tail = (void_pa *)&update->space_list;
 		int size;
 		void *s;
 		int current_level = -1;
@@ -8618,7 +8619,7 @@ int recover_backup_imsm(struct supertype *st, struct mdinfo *info)
 			__le32_to_cpu(map_dest->pba_of_lba0)) * 512;
 
 	unit_len = __le32_to_cpu(migr_rec->dest_depth_per_unit) * 512;
-	if (posix_memalign((void **)&buf, 512, unit_len) != 0)
+	if (posix_memalign((void_pa *)&buf, 512, unit_len) != 0)
 		goto abort;
 	targets = malloc(new_disks * sizeof(int));
 	if (!targets)
@@ -9538,7 +9539,7 @@ static int imsm_manage_reshape(
 	buf_size += __le32_to_cpu(migr_rec->dest_depth_per_unit) * 512;
 	/* add space for stripe aligment */
 	buf_size += old_data_stripe_length;
-	if (posix_memalign((void **)&buf, 4096, buf_size)) {
+	if (posix_memalign((void_pa *)&buf, 4096, buf_size)) {
 		dprintf("imsm: Cannot allocate checpoint buffer\n");
 		goto abort;
 	}
diff --git a/super-mbr.c b/super-mbr.c
index 6499963..bb087c7 100644
--- a/super-mbr.c
+++ b/super-mbr.c
@@ -80,7 +80,7 @@ static int load_super_mbr(struct supertype *st, int fd, char *devname)
 
 	free_mbr(st);
 
-	if (posix_memalign((void**)&super, 512, 512) != 0) {
+	if (posix_memalign((void_pa *)&super, 512, 512) != 0) {
 		fprintf(stderr, Name ": %s could not allocate superblock\n",
 			__func__);
 		return 1;
@@ -120,7 +120,7 @@ static int store_mbr(struct supertype *st, int fd)
 {
 	struct MBR *old, *super;
 
-	if (posix_memalign((void**)&old, 512, 512) != 0) {
+	if (posix_memalign((void_pa *)&old, 512, 512) != 0) {
 		fprintf(stderr, Name ": %s could not allocate superblock\n",
 			__func__);
 		return 1;
diff --git a/super0.c b/super0.c
index dab85db..49bbde0 100644
--- a/super0.c
+++ b/super0.c
@@ -436,7 +436,7 @@ static int update_super0(struct supertype *st, struct mdinfo *info,
 		 * So we copy the tail of the superblock
 		 * up 4 bytes before continuing
 		 */
-		__u32 *sb32 = (__u32*)sb;
+		__u32_a *sb32 = (__u32_a *)sb;
 		memcpy(sb32+MD_SB_GENERIC_CONSTANT_WORDS+7,
 		       sb32+MD_SB_GENERIC_CONSTANT_WORDS+7+1,
 		       (MD_SB_WORDS - (MD_SB_GENERIC_CONSTANT_WORDS+7+1))*4);
@@ -602,7 +602,7 @@ static int init_super0(struct supertype *st, mdu_array_info_t *info,
 	mdp_super_t *sb;
 	int spares;
 
-	if (posix_memalign((void**)&sb, 4096,
+	if (posix_memalign((void_pa *)&sb, 4096,
 			   MD_SB_BYTES + ROUND_UP(sizeof(bitmap_super_t), 4096)) != 0) {
 		fprintf(stderr, Name ": %s could not allocate superblock\n", __func__);
 		return 0;
@@ -682,6 +682,7 @@ struct devinfo {
 	mdu_disk_info_t disk;
 	struct devinfo *next;
 };
+typedef struct devinfo *devinfo_pa __attribute__((may_alias));
 
 #ifndef MDASSEMBLE
 /* Add a device to the superblock being created */
@@ -690,7 +691,8 @@ static int add_to_super0(struct supertype *st, mdu_disk_info_t *dinfo,
 {
 	mdp_super_t *sb = st->sb;
 	mdp_disk_t *dk = &sb->disks[dinfo->number];
-	struct devinfo *di, **dip;
+	struct devinfo *di;
+	devinfo_pa *dip;
 
 	dk->number = dinfo->number;
 	dk->major = dinfo->major;
@@ -703,7 +705,7 @@ static int add_to_super0(struct supertype *st, mdu_disk_info_t *dinfo,
 	sb->this_disk = sb->disks[dinfo->number];
 	sb->sb_csum = calc_sb0_csum(sb);
 
-	dip = (struct devinfo **)&st->info;
+	dip = (devinfo_pa *)&st->info;
 	while (*dip)
 		dip = &(*dip)->next;
 	di = malloc(sizeof(struct devinfo));
@@ -801,7 +803,7 @@ static int compare_super0(struct supertype *st, struct supertype *tst)
 	if (second->md_magic != MD_SB_MAGIC)
 		return 1;
 	if (!first) {
-		if (posix_memalign((void**)&first, 4096,
+		if (posix_memalign((void_pa *)&first, 4096,
 			     MD_SB_BYTES + 
 			     ROUND_UP(sizeof(struct bitmap_super_s), 4096)) != 0) {
 			fprintf(stderr, Name
@@ -873,7 +875,7 @@ static int load_super0(struct supertype *st, int fd, char *devname)
 		return 1;
 	}
 
-	if (posix_memalign((void**)&super, 4096,
+	if (posix_memalign((void_pa *)&super, 4096,
 			   MD_SB_BYTES +
 			   ROUND_UP(sizeof(bitmap_super_t), 4096)) != 0) {
 		fprintf(stderr, Name
diff --git a/super1.c b/super1.c
index 867aa58..5773b5d 100644
--- a/super1.c
+++ b/super1.c
@@ -110,7 +110,7 @@ static unsigned int calc_sb_1_csum(struct mdp_superblock_1 * sb)
 	unsigned int disk_csum, csum;
 	unsigned long long newcsum;
 	int size = sizeof(*sb) + __le32_to_cpu(sb->max_dev)*2;
-	unsigned int *isuper = (unsigned int*)sb;
+	__u32_a *isuper = (__u32_a *)sb;
 
 /* make sure I can count... */
 	if (offsetof(struct mdp_superblock_1,data_offset) != 128 ||
@@ -128,7 +128,7 @@ static unsigned int calc_sb_1_csum(struct mdp_superblock_1 * sb)
 	}
 
 	if (size == 2)
-		newcsum += __le16_to_cpu(*(unsigned short*) isuper);
+		newcsum += __le16_to_cpu(*(__u16_a *) isuper);
 
 	csum = (newcsum & 0xffffffff) + (newcsum >> 32);
 	sb->sb_csum = disk_csum;
@@ -828,7 +828,7 @@ static int init_super1(struct supertype *st, mdu_array_info_t *info,
 	int rfd;
 	char defname[10];
 
-	if (posix_memalign((void**)&sb, 512, (1024 + 512 + 
+	if (posix_memalign((void_pa *)&sb, 512, (1024 + 512 +
 			   sizeof(struct misc_dev_info))) != 0) {
 		fprintf(stderr, Name
 			": %s could not allocate superblock\n", __func__);
@@ -912,6 +912,8 @@ struct devinfo {
 	mdu_disk_info_t disk;
 	struct devinfo *next;
 };
+typedef struct devinfo *devinfo_pa __attribute__((may_alias));
+
 #ifndef MDASSEMBLE
 /* Add a device to the superblock being created */
 static int add_to_super1(struct supertype *st, mdu_disk_info_t *dk,
@@ -919,7 +921,8 @@ static int add_to_super1(struct supertype *st, mdu_disk_info_t *dk,
 {
 	struct mdp_superblock_1 *sb = st->sb;
 	__u16 *rp = sb->dev_roles + dk->number;
-	struct devinfo *di, **dip;
+	struct devinfo *di;
+	devinfo_pa *dip;
 
 	if ((dk->state & 6) == 6) /* active, sync */
 		*rp = __cpu_to_le16(dk->raid_disk);
@@ -936,7 +939,7 @@ static int add_to_super1(struct supertype *st, mdu_disk_info_t *dk,
 	sb->devflags = 0; /* don't copy another disks flags */
 	sb->sb_csum = calc_sb_1_csum(sb);
 
-	dip = (struct devinfo **)&st->info;
+	dip = (devinfo_pa *)&st->info;
 	while (*dip)
 		dip = &(*dip)->next;
 	di = malloc(sizeof(struct devinfo));
@@ -1207,7 +1210,7 @@ static int compare_super1(struct supertype *st, struct supertype *tst)
 		return 1;
 
 	if (!first) {
-		if (posix_memalign((void**)&first, 512,
+		if (posix_memalign((void_pa *)&first, 512,
 			       1024 + 512 +
 			       sizeof(struct misc_dev_info)) != 0) {
 			fprintf(stderr, Name
@@ -1322,7 +1325,7 @@ static int load_super1(struct supertype *st, int fd, char *devname)
 		return 1;
 	}
 
-	if (posix_memalign((void**)&super, 512,
+	if (posix_memalign((void_pa *)&super, 512,
 		       1024 + 512 +
 		       sizeof(struct misc_dev_info)) != 0) {
 		fprintf(stderr, Name ": %s could not allocate superblock\n",
diff --git a/util.c b/util.c
index 6985a70..796fc05 100644
--- a/util.c
+++ b/util.c
@@ -1730,7 +1730,8 @@ struct mdinfo *container_choose_spares(struct supertype *st,
 				       char *spare_group,
 				       const char *metadata, int get_one)
 {
-	struct mdinfo *d, **dp, *disks = NULL;
+	struct mdinfo *d, *disks = NULL;
+	mdinfo_pa *dp;
 
 	/* get list of all disks in container */
 	if (st->ss->getinfo_super_disks)
@@ -1739,7 +1740,7 @@ struct mdinfo *container_choose_spares(struct supertype *st,
 	if (!disks)
 		return disks;
 	/* find spare devices on the list */
-	dp = &disks->devs;
+	dp = (mdinfo_pa *)&disks->devs;
 	disks->array.spare_disks = 0;
 	while (*dp) {
 		int found = 0;
@@ -1765,7 +1766,7 @@ struct mdinfo *container_choose_spares(struct supertype *st,
 			}
 		}
 		if (found) {
-			dp = &d->next;
+			dp = (mdinfo_pa *)&d->next;
 			disks->array.spare_disks++;
 			if (get_one) {
 				sysfs_free(*dp);
-- 
1.7.7.1

--
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