[JFFS2] Don't pack on-medium structures, because GCC emits crappy code

Linux-MTD Mailing List linux-mtd at lists.infradead.org
Sun May 14 19:59:01 EDT 2006


Commit:     3e68fbb59b3d4e6b47b65e9928b5929e02179759
Parent:     52239da1b06ff445bf71d35e04d8ce74e4c6fe7b
Author:     David Woodhouse <dwmw2 at infradead.org>
AuthorDate: Mon May 15 00:49:43 2006 +0100
Commit:     David Woodhouse <dwmw2 at infradead.org>
CommitDate: Mon May 15 00:49:43 2006 +0100

    [JFFS2] Don't pack on-medium structures, because GCC emits crappy code
    
    If we use __attribute__((packed)), GCC will _also_ assume that the
    structures aren't sensibly aligned, and it'll emit code to cope with
    that instead of straight word load/save. This can be _very_ suboptimal
    on architectures like ARM.
    
    Ideally, we want an attribute which just tells GCC not to do any
    padding, without the alignment side-effects. In the absense of that,
    we'll just drop the 'packed' attribute and hope that everything stays as
    it was (which to be fair is fairly much what we expect). And add some
    paranoia checks in the initialisation code, which should be optimised
    away completely in the normal case.
    
    Signed-off-by: David Woodhouse <dwmw2 at infradead.org>

 fs/jffs2/super.c      |   14 +++++++++++++-
 include/linux/jffs2.h |   14 +++++++-------
 2 files changed, 20 insertions(+), 8 deletions(-)

diff --git a/fs/jffs2/super.c b/fs/jffs2/super.c
index ffd8e84..5f73de5 100644
--- a/fs/jffs2/super.c
+++ b/fs/jffs2/super.c
@@ -320,6 +320,18 @@ static int __init init_jffs2_fs(void)
 {
 	int ret;
 
+	/* Paranoia checks for on-medium structures. If we ask GCC
+	   to pack them with __attribute__((packed)) then it _also_
+	   assumes that they're not aligned -- so it emits crappy
+	   code on some architectures. Ideally we want an attribute
+	   which means just 'no padding', without the alignment
+	   thing. But GCC doesn't have that -- we have to just
+	   hope the structs are the right sizes, instead. */
+	BUG_ON(sizeof(struct jffs2_unknown_node) != 12);
+	BUG_ON(sizeof(struct jffs2_raw_dirent) != 40);
+	BUG_ON(sizeof(struct jffs2_raw_inode) != 68);
+	BUG_ON(sizeof(struct jffs2_raw_summary) != 32);
+
 	printk(KERN_INFO "JFFS2 version 2.2."
 #ifdef CONFIG_JFFS2_FS_WRITEBUFFER
 	       " (NAND)"
@@ -327,7 +339,7 @@ #endif
 #ifdef CONFIG_JFFS2_SUMMARY
 	       " (SUMMARY) "
 #endif
-	       " (C) 2001-2003 Red Hat, Inc.\n");
+	       " (C) 2001-2006 Red Hat, Inc.\n");
 
 	jffs2_inode_cachep = kmem_cache_create("jffs2_i",
 					     sizeof(struct jffs2_inode_info),
diff --git a/include/linux/jffs2.h b/include/linux/jffs2.h
index cf792bb..228ad72 100644
--- a/include/linux/jffs2.h
+++ b/include/linux/jffs2.h
@@ -82,15 +82,15 @@ #define JFFS2_INO_FLAG_USERCOMPR  2	/* U
 
 typedef struct {
 	uint32_t v32;
-} __attribute__((packed))  jint32_t;
+} jint32_t;
 
 typedef struct {
 	uint32_t m;
-} __attribute__((packed))  jmode_t;
+} jmode_t;
 
 typedef struct {
 	uint16_t v16;
-} __attribute__((packed)) jint16_t;
+} jint16_t;
 
 struct jffs2_unknown_node
 {
@@ -99,7 +99,7 @@ struct jffs2_unknown_node
 	jint16_t nodetype;
 	jint32_t totlen; /* So we can skip over nodes we don't grok */
 	jint32_t hdr_crc;
-} __attribute__((packed));
+};
 
 struct jffs2_raw_dirent
 {
@@ -117,7 +117,7 @@ struct jffs2_raw_dirent
 	jint32_t node_crc;
 	jint32_t name_crc;
 	uint8_t name[0];
-} __attribute__((packed));
+};
 
 /* The JFFS2 raw inode structure: Used for storage on physical media.  */
 /* The uid, gid, atime, mtime and ctime members could be longer, but
@@ -149,7 +149,7 @@ struct jffs2_raw_inode
 	jint32_t data_crc;   /* CRC for the (compressed) data.  */
 	jint32_t node_crc;   /* CRC for the raw inode (excluding data)  */
 	uint8_t data[0];
-} __attribute__((packed));
+};
 
 struct jffs2_raw_summary
 {
@@ -163,7 +163,7 @@ struct jffs2_raw_summary
 	jint32_t sum_crc;	/* summary information crc */
 	jint32_t node_crc; 	/* node crc */
 	jint32_t sum[0]; 	/* inode summary info */
-} __attribute__((packed));
+};
 
 union jffs2_node_union
 {




More information about the linux-mtd-cvs mailing list