diff options
author | David Woodhouse <dwmw2@infradead.org> | 2006-05-14 19:49:43 -0400 |
---|---|---|
committer | David Woodhouse <dwmw2@infradead.org> | 2006-05-14 19:49:43 -0400 |
commit | 3e68fbb59b3d4e6b47b65e9928b5929e02179759 (patch) | |
tree | 6ff2574161328a89f81f637ac42ce639e8ba31d3 /fs/jffs2/super.c | |
parent | 52239da1b06ff445bf71d35e04d8ce74e4c6fe7b (diff) |
[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@infradead.org>
Diffstat (limited to 'fs/jffs2/super.c')
-rw-r--r-- | fs/jffs2/super.c | 14 |
1 files changed, 13 insertions, 1 deletions
diff --git a/fs/jffs2/super.c b/fs/jffs2/super.c index ffd8e84b22cc..5f73de586928 100644 --- a/fs/jffs2/super.c +++ b/fs/jffs2/super.c | |||
@@ -320,6 +320,18 @@ static int __init init_jffs2_fs(void) | |||
320 | { | 320 | { |
321 | int ret; | 321 | int ret; |
322 | 322 | ||
323 | /* Paranoia checks for on-medium structures. If we ask GCC | ||
324 | to pack them with __attribute__((packed)) then it _also_ | ||
325 | assumes that they're not aligned -- so it emits crappy | ||
326 | code on some architectures. Ideally we want an attribute | ||
327 | which means just 'no padding', without the alignment | ||
328 | thing. But GCC doesn't have that -- we have to just | ||
329 | hope the structs are the right sizes, instead. */ | ||
330 | BUG_ON(sizeof(struct jffs2_unknown_node) != 12); | ||
331 | BUG_ON(sizeof(struct jffs2_raw_dirent) != 40); | ||
332 | BUG_ON(sizeof(struct jffs2_raw_inode) != 68); | ||
333 | BUG_ON(sizeof(struct jffs2_raw_summary) != 32); | ||
334 | |||
323 | printk(KERN_INFO "JFFS2 version 2.2." | 335 | printk(KERN_INFO "JFFS2 version 2.2." |
324 | #ifdef CONFIG_JFFS2_FS_WRITEBUFFER | 336 | #ifdef CONFIG_JFFS2_FS_WRITEBUFFER |
325 | " (NAND)" | 337 | " (NAND)" |
@@ -327,7 +339,7 @@ static int __init init_jffs2_fs(void) | |||
327 | #ifdef CONFIG_JFFS2_SUMMARY | 339 | #ifdef CONFIG_JFFS2_SUMMARY |
328 | " (SUMMARY) " | 340 | " (SUMMARY) " |
329 | #endif | 341 | #endif |
330 | " (C) 2001-2003 Red Hat, Inc.\n"); | 342 | " (C) 2001-2006 Red Hat, Inc.\n"); |
331 | 343 | ||
332 | jffs2_inode_cachep = kmem_cache_create("jffs2_i", | 344 | jffs2_inode_cachep = kmem_cache_create("jffs2_i", |
333 | sizeof(struct jffs2_inode_info), | 345 | sizeof(struct jffs2_inode_info), |