Merge git://git.kernel.org/pub/scm/linux/kernel/git/sfrench/cifs-2.6
[pandora-kernel.git] / fs / jffs2 / summary.c
index ccb6803..be1acc3 100644 (file)
@@ -43,7 +43,7 @@ int jffs2_sum_init(struct jffs2_sb_info *c)
                return -ENOMEM;
        }
 
-       dbg_summary("returned succesfully\n");
+       dbg_summary("returned successfully\n");
 
        return 0;
 }
@@ -400,7 +400,7 @@ static int jffs2_sum_process_sum_data(struct jffs2_sb_info *c, struct jffs2_eras
                dbg_summary("processing summary index %d\n", i);
 
                /* Make sure there's a spare ref for dirty space */
-               err = jffs2_prealloc_raw_node_refs(c, 2);
+               err = jffs2_prealloc_raw_node_refs(c, jeb, 2);
                if (err)
                        return err;
 
@@ -413,7 +413,7 @@ static int jffs2_sum_process_sum_data(struct jffs2_sb_info *c, struct jffs2_eras
 
                                dbg_summary("Inode at 0x%08x-0x%08x\n",
                                            jeb->offset + je32_to_cpu(spi->offset),
-                                           jeb->offset + je32_to_cpu(spi->offset) + je32_to_cpu(spu->totlen));
+                                           jeb->offset + je32_to_cpu(spi->offset) + je32_to_cpu(spi->totlen));
 
                                ic = jffs2_scan_make_ino_cache(c, ino);
                                if (!ic) {
@@ -435,7 +435,7 @@ static int jffs2_sum_process_sum_data(struct jffs2_sb_info *c, struct jffs2_eras
                                struct jffs2_sum_dirent_flash *spd;
                                spd = sp;
 
-                               dbg_summary("Dirent at 0x%08x\n",
+                               dbg_summary("Dirent at 0x%08x-0x%08x\n",
                                            jeb->offset + je32_to_cpu(spd->offset),
                                            jeb->offset + je32_to_cpu(spd->offset) + je32_to_cpu(spd->totlen));
 
@@ -453,7 +453,7 @@ static int jffs2_sum_process_sum_data(struct jffs2_sb_info *c, struct jffs2_eras
                                        return -ENOMEM;
                                }
 
-                               fd->raw = sum_link_node_ref(c, jeb,  je32_to_cpu(spd->offset) | REF_PRISTINE,
+                               fd->raw = sum_link_node_ref(c, jeb,  je32_to_cpu(spd->offset) | REF_UNCHECKED,
                                                            PAD(je32_to_cpu(spd->totlen)), ic);
 
                                fd->next = NULL;
@@ -511,7 +511,8 @@ static int jffs2_sum_process_sum_data(struct jffs2_sb_info *c, struct jffs2_eras
                                spr = (struct jffs2_sum_xref_flash *)sp;
                                dbg_summary("xref at %#08x-%#08x\n",
                                            jeb->offset + je32_to_cpu(spr->offset),
-                                           jeb->offset + je32_to_cpu(spr->offset) + PAD(sizeof(struct jffs2_raw_xref)));
+                                           jeb->offset + je32_to_cpu(spr->offset) + 
+                                           (uint32_t)PAD(sizeof(struct jffs2_raw_xref)));
 
                                ref = jffs2_alloc_xattr_ref();
                                if (!ref) {
@@ -547,7 +548,7 @@ static int jffs2_sum_process_sum_data(struct jffs2_sb_info *c, struct jffs2_eras
                                jeb->wasted_size = jeb->used_size = jeb->dirty_size = 0;
                                jeb->free_size = c->sector_size;
 
-                               jffs2_free_all_node_refs(c, jeb);
+                               jffs2_free_jeb_node_refs(c, jeb);
                                return -ENOTRECOVERABLE;
                        }
                }
@@ -563,7 +564,6 @@ int jffs2_sum_scan_sumnode(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb
        struct jffs2_unknown_node crcnode;
        int ret, ofs;
        uint32_t crc;
-       int err;
 
        ofs = c->sector_size - sumsize;
 
@@ -605,16 +605,20 @@ int jffs2_sum_scan_sumnode(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb
 
                dbg_summary("Summary : CLEANMARKER node \n");
 
+               ret = jffs2_prealloc_raw_node_refs(c, jeb, 1);
+               if (ret)
+                       return ret;
+
                if (je32_to_cpu(summary->cln_mkr) != c->cleanmarker_size) {
                        dbg_summary("CLEANMARKER node has totlen 0x%x != normal 0x%x\n",
                                je32_to_cpu(summary->cln_mkr), c->cleanmarker_size);
-                       if ((err = jffs2_scan_dirty_space(c, jeb, PAD(je32_to_cpu(summary->cln_mkr)))))
-                               return err;
+                       if ((ret = jffs2_scan_dirty_space(c, jeb, PAD(je32_to_cpu(summary->cln_mkr)))))
+                               return ret;
                } else if (jeb->first_node) {
                        dbg_summary("CLEANMARKER node not first node in block "
                                        "(0x%08x)\n", jeb->offset);
-                       if ((err = jffs2_scan_dirty_space(c, jeb, PAD(je32_to_cpu(summary->cln_mkr)))))
-                               return err;
+                       if ((ret = jffs2_scan_dirty_space(c, jeb, PAD(je32_to_cpu(summary->cln_mkr)))))
+                               return ret;
                } else {
                        jffs2_link_node_ref(c, jeb, jeb->offset | REF_NORMAL,
                                            je32_to_cpu(summary->cln_mkr), NULL);
@@ -630,11 +634,11 @@ int jffs2_sum_scan_sumnode(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb
                return ret;             /* real error */
 
        /* for PARANOIA_CHECK */
-       ret = jffs2_prealloc_raw_node_refs(c, 1);
+       ret = jffs2_prealloc_raw_node_refs(c, jeb, 2);
        if (ret)
                return ret;
 
-       jffs2_link_node_ref(c, jeb, (jeb->offset + ofs) | REF_NORMAL, sumsize, NULL);
+       sum_link_node_ref(c, jeb, ofs | REF_NORMAL, sumsize, NULL);
 
        if (unlikely(jeb->free_size)) {
                JFFS2_WARNING("Free size 0x%x bytes in eraseblock @0x%08x with summary?\n",
@@ -787,10 +791,12 @@ static int jffs2_sum_write_data(struct jffs2_sb_info *c, struct jffs2_eraseblock
                JFFS2_WARNING("Write of %u bytes at 0x%08x failed. returned %d, retlen %zd\n",
                              infosize, sum_ofs, ret, retlen);
 
-               /* Waste remaining space */
-               spin_lock(&c->erase_completion_lock);
-               jffs2_link_node_ref(c, jeb, sum_ofs | REF_OBSOLETE, infosize, NULL);
-               spin_unlock(&c->erase_completion_lock);
+               if (retlen) {
+                       /* Waste remaining space */
+                       spin_lock(&c->erase_completion_lock);
+                       jffs2_link_node_ref(c, jeb, sum_ofs | REF_OBSOLETE, infosize, NULL);
+                       spin_unlock(&c->erase_completion_lock);
+               }
 
                c->summary->sum_size = JFFS2_SUMMARY_NOSUM_SIZE;
 
@@ -815,9 +821,9 @@ int jffs2_sum_write_sumnode(struct jffs2_sb_info *c)
        dbg_summary("called\n");
 
        spin_unlock(&c->erase_completion_lock);
-       jffs2_prealloc_raw_node_refs(c, 1);
 
        jeb = c->nextblock;
+       jffs2_prealloc_raw_node_refs(c, jeb, 1);
 
        if (!c->summary->sum_num || !c->summary->sum_list_head) {
                JFFS2_WARNING("Empty summary info!!!\n");
@@ -836,6 +842,7 @@ int jffs2_sum_write_sumnode(struct jffs2_sb_info *c)
                jffs2_sum_disable_collecting(c->summary);
 
                JFFS2_WARNING("Not enough space for summary, padsize = %d\n", padsize);
+               spin_lock(&c->erase_completion_lock);
                return 0;
        }