[JFFS2] Calculate CRC check starting point correctly
authorArtem B. Bityutskiy <dedekind@infradead.org>
Wed, 17 Aug 2005 14:57:43 +0000 (15:57 +0100)
committerThomas Gleixner <tglx@mtd.linutronix.de>
Sun, 6 Nov 2005 19:29:56 +0000 (20:29 +0100)
When data starts from the beginning of NAND page, 'len' must be zero, not
c->wbuf_page.

Thanks to Zoltan Sogor for reporting this problem.

Signed-off-by: Artem B. Bityutskiy <dedekind@infradead.org>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
fs/jffs2/nodelist.c
fs/jffs2/readinode.c

index 0393d27eafc7bf01f2d9ac5d9aec9da2f3432f8b..fd21f109fbd22fedb8adf9725ebf102717478dd8 100644 (file)
@@ -7,7 +7,7 @@
  *
  * For licensing information, see the file 'LICENCE' in this directory.
  *
- * $Id: nodelist.c,v 1.110 2005/08/17 14:13:45 dedekind Exp $
+ * $Id: nodelist.c,v 1.111 2005/08/17 14:57:39 dedekind Exp $
  *
  */
 
@@ -413,7 +413,8 @@ static int check_node_data(struct jffs2_sb_info *c, struct jffs2_tmp_dnode_info
        /* Calculate how many bytes were already checked */
        ofs = ref_offset(ref) + sizeof(struct jffs2_raw_inode);
        len = ofs & (c->wbuf_pagesize - 1);
-       len = c->wbuf_pagesize - len;
+       if (likely(len))
+               len = c->wbuf_pagesize - len;
 
        if (len >= tn->csize) {
                JFFS2_DBG_READINODE("no need to check node at %#08x, data length %u, data starts at %#08x - it has already been checked.\n",
index 6d5adaba4062f1692178a129fdae16a164857bb1..6f1e4a7ecd9fd4eb2631dc9c74316c718a7b9425 100644 (file)
@@ -7,7 +7,7 @@
  *
  * For licensing information, see the file 'LICENCE' in this directory.
  *
- * $Id: readinode.c,v 1.140 2005/08/17 13:46:23 dedekind Exp $
+ * $Id: readinode.c,v 1.141 2005/08/17 14:57:39 dedekind Exp $
  *
  */
 
@@ -272,9 +272,9 @@ static inline int read_dnode(struct jffs2_sb_info *c, struct jffs2_raw_node_ref
                        buf = (unsigned char *)rd + sizeof(*rd);
                        /* len will be the read data length */
                        len = min_t(uint32_t, rdlen - sizeof(*rd), csize);
-                       
-                       if (len)
-                               tn->partial_crc = crc = crc32(0, buf, len);
+                       tn->partial_crc = crc32(0, buf, len);
+
+                       JFFS2_DBG_READINODE("Calculates CRC (%#08x) for %d bytes, csize %d\n", tn->partial_crc, len, csize);
 
                        /* If we actually calculated the whole data CRC
                         * and it is wrong, drop the node. */
@@ -327,8 +327,8 @@ static inline int read_dnode(struct jffs2_sb_info *c, struct jffs2_raw_node_ref
        else // normal case...
                tn->fn->size = je32_to_cpu(rd->dsize);
 
-       JFFS2_DBG_READINODE("dnode @%08x: ver %u, offset %#04x, dsize %#04x\n",
-                 ref_offset(ref), je32_to_cpu(rd->version), je32_to_cpu(rd->offset), je32_to_cpu(rd->dsize));
+       JFFS2_DBG_READINODE("dnode @%08x: ver %u, offset %#04x, dsize %#04x, csize %#04x\n",
+                 ref_offset(ref), je32_to_cpu(rd->version), je32_to_cpu(rd->offset), je32_to_cpu(rd->dsize), csize);
        
        jffs2_add_tn_to_tree(tn, tnp);