]> err.no Git - linux-2.6/blobdiff - fs/jffs2/summary.c
Auto-update from upstream
[linux-2.6] / fs / jffs2 / summary.c
index 523a8f330ef56f0b915595c1b53aadc20c9d34b9..0b02fc79e4d1c183592573f3efd63aa2a12b35fa 100644 (file)
@@ -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) {
@@ -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);
@@ -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;
 
@@ -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;
        }