Merge branch 'master' of /home/tglx/work/kernel/git/mtd-2.6/
[pandora-kernel.git] / fs / jffs2 / wbuf.c
index 0442a57..916c87d 100644 (file)
@@ -265,12 +265,14 @@ static void jffs2_wbuf_recover(struct jffs2_sb_info *c)
 
 
        /* ... and get an allocation of space from a shiny new block instead */
-       ret = jffs2_reserve_space_gc(c, end-start, &ofs, &len, JFFS2_SUMMARY_NOSUM_SIZE);
+       ret = jffs2_reserve_space_gc(c, end-start, &len, JFFS2_SUMMARY_NOSUM_SIZE);
        if (ret) {
                printk(KERN_WARNING "Failed to allocate space for wbuf recovery. Data loss ensues.\n");
                kfree(buf);
                return;
        }
+       ofs = write_ofs(c);
+
        if (end-start >= c->wbuf_pagesize) {
                /* Need to do another write immediately, but it's possible
                   that this is just because the wbuf itself is completely
@@ -312,9 +314,8 @@ static void jffs2_wbuf_recover(struct jffs2_sb_info *c)
                                        return;
 
                                raw2->flash_offset = ofs | REF_OBSOLETE;
-                               raw2->next_in_ino = NULL;
 
-                               jffs2_add_physical_node_ref(c, raw2, ref_totlen(c, jeb, *first_raw));
+                               jffs2_add_physical_node_ref(c, raw2, ref_totlen(c, jeb, *first_raw), NULL);
                        }
                        return;
                }
@@ -507,11 +508,10 @@ static int __jffs2_flush_wbuf(struct jffs2_sb_info *c, int pad)
                        return -ENOMEM;
                ref->flash_offset = c->wbuf_ofs + c->wbuf_len;
                ref->flash_offset |= REF_OBSOLETE;
-               ref->next_in_ino = NULL;
 
                spin_lock(&c->erase_completion_lock);
 
-               jffs2_link_node_ref(c, jeb, ref, waste);
+               jffs2_link_node_ref(c, jeb, ref, waste, NULL);
                /* FIXME: that made it count as dirty. Convert to wasted */
                jeb->dirty_size -= waste;
                c->dirty_size -= waste;
@@ -649,19 +649,6 @@ int jffs2_flash_writev(struct jffs2_sb_info *c, const struct kvec *invecs,
                memset(c->wbuf,0xff,c->wbuf_pagesize);
        }
 
-       /*
-        * Fixup the wbuf if we are moving to a new eraseblock. The
-        * checks below fail for ECC'd NOR because cleanmarker == 16,
-        * so a block starts at xxx0010.
-        */
-       if (jffs2_nor_ecc(c)) {
-               if (((c->wbuf_ofs % c->sector_size) == 0) && !c->wbuf_len) {
-                       c->wbuf_ofs = PAGE_DIV(to);
-                       c->wbuf_len = PAGE_MOD(to);
-                       memset(c->wbuf,0xff,c->wbuf_pagesize);
-               }
-       }
-
        /*
         * Sanity checks on target address.  It's permitted to write
         * at PAD(c->wbuf_len+c->wbuf_ofs), and it's permitted to
@@ -1107,7 +1094,7 @@ int jffs2_nand_flash_setup(struct jffs2_sb_info *c)
 
        /* Initialise write buffer */
        init_rwsem(&c->wbuf_sem);
-       c->wbuf_pagesize = c->mtd->oobblock;
+       c->wbuf_pagesize = c->mtd->writesize;
        c->wbuf_ofs = 0xFFFFFFFF;
 
        c->wbuf = kmalloc(c->wbuf_pagesize, GFP_KERNEL);
@@ -1178,33 +1165,14 @@ void jffs2_dataflash_cleanup(struct jffs2_sb_info *c) {
        kfree(c->wbuf);
 }
 
-int jffs2_nor_ecc_flash_setup(struct jffs2_sb_info *c) {
-       /* Cleanmarker is actually larger on the flashes */
-       c->cleanmarker_size = 16;
-
-       /* Initialize write buffer */
-       init_rwsem(&c->wbuf_sem);
-       c->wbuf_pagesize = c->mtd->eccsize;
-       c->wbuf_ofs = 0xFFFFFFFF;
-
-       c->wbuf = kmalloc(c->wbuf_pagesize, GFP_KERNEL);
-       if (!c->wbuf)
-               return -ENOMEM;
-
-       return 0;
-}
-
-void jffs2_nor_ecc_flash_cleanup(struct jffs2_sb_info *c) {
-       kfree(c->wbuf);
-}
-
 int jffs2_nor_wbuf_flash_setup(struct jffs2_sb_info *c) {
-       /* Cleanmarker currently occupies a whole programming region */
-       c->cleanmarker_size = MTD_PROGREGION_SIZE(c->mtd);
+       /* Cleanmarker currently occupies whole programming regions,
+        * either one or 2 for 8Byte STMicro flashes. */
+       c->cleanmarker_size = max(16u, c->mtd->writesize);
 
        /* Initialize write buffer */
        init_rwsem(&c->wbuf_sem);
-       c->wbuf_pagesize = MTD_PROGREGION_SIZE(c->mtd);
+       c->wbuf_pagesize = c->mtd->writesize;
        c->wbuf_ofs = 0xFFFFFFFF;
 
        c->wbuf = kmalloc(c->wbuf_pagesize, GFP_KERNEL);