Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=53043002ef6cc0369fd5c5fa0a257f290ba6a3a6
Commit:     53043002ef6cc0369fd5c5fa0a257f290ba6a3a6
Parent:     873b6a230652803d1de480f5d3b802e4ffd0bcad
Author:     Thomas Gleixner <[EMAIL PROTECTED]>
AuthorDate: Thu Apr 5 11:09:01 2007 +0200
Committer:  David Woodhouse <[EMAIL PROTECTED]>
CommitDate: Tue Apr 17 18:26:18 2007 +0100

    [JFFS2] check node crc before doing anything else
    
    Check the node CRC on scan before doing anything else with the node.
    
    Signed-off-by: Thomas Gleixner <[EMAIL PROTECTED]>
    Signed-off-by: David Woodhouse <[EMAIL PROTECTED]>
---
 fs/jffs2/scan.c |   30 +++++++++++++++---------------
 1 files changed, 15 insertions(+), 15 deletions(-)

diff --git a/fs/jffs2/scan.c b/fs/jffs2/scan.c
index 7fb45bd..a5103df 100644
--- a/fs/jffs2/scan.c
+++ b/fs/jffs2/scan.c
@@ -952,8 +952,7 @@ static int jffs2_scan_inode_node(struct jffs2_sb_info *c, 
struct jffs2_erasebloc
                                 struct jffs2_raw_inode *ri, uint32_t ofs, 
struct jffs2_summary *s)
 {
        struct jffs2_inode_cache *ic;
-       uint32_t ino = je32_to_cpu(ri->ino);
-       int err;
+       uint32_t crc, ino = je32_to_cpu(ri->ino);
 
        D1(printk(KERN_DEBUG "jffs2_scan_inode_node(): Node at 0x%08x\n", ofs));
 
@@ -966,21 +965,22 @@ static int jffs2_scan_inode_node(struct jffs2_sb_info *c, 
struct jffs2_erasebloc
           Which means that the _full_ amount of time to get to proper write 
mode with GC
           operational may actually be _longer_ than before. Sucks to be me. */
 
+       /* Check the node CRC in any case. */
+       crc = crc32(0, ri, sizeof(*ri)-8);
+       if (crc != je32_to_cpu(ri->node_crc)) {
+               printk(KERN_NOTICE "jffs2_scan_inode_node(): CRC failed on "
+                      "node at 0x%08x: Read 0x%08x, calculated 0x%08x\n",
+                      ofs, je32_to_cpu(ri->node_crc), crc);
+               /*
+                * We believe totlen because the CRC on the node
+                * _header_ was OK, just the node itself failed.
+                */
+               return jffs2_scan_dirty_space(c, jeb,
+                                             PAD(je32_to_cpu(ri->totlen)));
+       }
+
        ic = jffs2_get_ino_cache(c, ino);
        if (!ic) {
-               /* Inocache get failed. Either we read a bogus ino# or it's 
just genuinely the
-                  first node we found for this inode. Do a CRC check to 
protect against the former
-                  case */
-               uint32_t crc = crc32(0, ri, sizeof(*ri)-8);
-
-               if (crc != je32_to_cpu(ri->node_crc)) {
-                       printk(KERN_NOTICE "jffs2_scan_inode_node(): CRC failed 
on node at 0x%08x: Read 0x%08x, calculated 0x%08x\n",
-                              ofs, je32_to_cpu(ri->node_crc), crc);
-                       /* We believe totlen because the CRC on the node 
_header_ was OK, just the node itself failed. */
-                       if ((err = jffs2_scan_dirty_space(c, jeb, 
PAD(je32_to_cpu(ri->totlen)))))
-                               return err;
-                       return 0;
-               }
                ic = jffs2_scan_make_ino_cache(c, ino);
                if (!ic)
                        return -ENOMEM;
-
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to