[JFFS2] Debug code simplification, update TODO
[safe/jmp/linux-2.6] / fs / jffs2 / wbuf.c
1 /*
2  * JFFS2 -- Journalling Flash File System, Version 2.
3  *
4  * Copyright (C) 2001-2003 Red Hat, Inc.
5  * Copyright (C) 2004 Thomas Gleixner <tglx@linutronix.de>
6  *
7  * Created by David Woodhouse <dwmw2@infradead.org>
8  * Modified debugged and enhanced by Thomas Gleixner <tglx@linutronix.de>
9  *
10  * For licensing information, see the file 'LICENCE' in this directory.
11  *
12  * $Id: wbuf.c,v 1.99 2005/09/21 16:11:04 dedekind Exp $
13  *
14  */
15
16 #include <linux/kernel.h>
17 #include <linux/slab.h>
18 #include <linux/mtd/mtd.h>
19 #include <linux/crc32.h>
20 #include <linux/mtd/nand.h>
21 #include <linux/jiffies.h>
22
23 #include "nodelist.h"
24
25 /* For testing write failures */
26 #undef BREAKME
27 #undef BREAKMEHEADER
28
29 #ifdef BREAKME
30 static unsigned char *brokenbuf;
31 #endif
32
33 /* max. erase failures before we mark a block bad */
34 #define MAX_ERASE_FAILURES      2
35
36 struct jffs2_inodirty {
37         uint32_t ino;
38         struct jffs2_inodirty *next;
39 };
40
41 static struct jffs2_inodirty inodirty_nomem;
42
43 static int jffs2_wbuf_pending_for_ino(struct jffs2_sb_info *c, uint32_t ino)
44 {
45         struct jffs2_inodirty *this = c->wbuf_inodes;
46
47         /* If a malloc failed, consider _everything_ dirty */
48         if (this == &inodirty_nomem)
49                 return 1;
50
51         /* If ino == 0, _any_ non-GC writes mean 'yes' */
52         if (this && !ino)
53                 return 1;
54
55         /* Look to see if the inode in question is pending in the wbuf */
56         while (this) {
57                 if (this->ino == ino)
58                         return 1;
59                 this = this->next;
60         }
61         return 0;
62 }
63
64 static void jffs2_clear_wbuf_ino_list(struct jffs2_sb_info *c)
65 {
66         struct jffs2_inodirty *this;
67
68         this = c->wbuf_inodes;
69
70         if (this != &inodirty_nomem) {
71                 while (this) {
72                         struct jffs2_inodirty *next = this->next;
73                         kfree(this);
74                         this = next;
75                 }
76         }
77         c->wbuf_inodes = NULL;
78 }
79
80 static void jffs2_wbuf_dirties_inode(struct jffs2_sb_info *c, uint32_t ino)
81 {
82         struct jffs2_inodirty *new;
83
84         /* Mark the superblock dirty so that kupdated will flush... */
85         jffs2_erase_pending_trigger(c);
86
87         if (jffs2_wbuf_pending_for_ino(c, ino))
88                 return;
89
90         new = kmalloc(sizeof(*new), GFP_KERNEL);
91         if (!new) {
92                 D1(printk(KERN_DEBUG "No memory to allocate inodirty. Fallback to all considered dirty\n"));
93                 jffs2_clear_wbuf_ino_list(c);
94                 c->wbuf_inodes = &inodirty_nomem;
95                 return;
96         }
97         new->ino = ino;
98         new->next = c->wbuf_inodes;
99         c->wbuf_inodes = new;
100         return;
101 }
102
103 static inline void jffs2_refile_wbuf_blocks(struct jffs2_sb_info *c)
104 {
105         struct list_head *this, *next;
106         static int n;
107
108         if (list_empty(&c->erasable_pending_wbuf_list))
109                 return;
110
111         list_for_each_safe(this, next, &c->erasable_pending_wbuf_list) {
112                 struct jffs2_eraseblock *jeb = list_entry(this, struct jffs2_eraseblock, list);
113
114                 D1(printk(KERN_DEBUG "Removing eraseblock at 0x%08x from erasable_pending_wbuf_list...\n", jeb->offset));
115                 list_del(this);
116                 if ((jiffies + (n++)) & 127) {
117                         /* Most of the time, we just erase it immediately. Otherwise we
118                            spend ages scanning it on mount, etc. */
119                         D1(printk(KERN_DEBUG "...and adding to erase_pending_list\n"));
120                         list_add_tail(&jeb->list, &c->erase_pending_list);
121                         c->nr_erasing_blocks++;
122                         jffs2_erase_pending_trigger(c);
123                 } else {
124                         /* Sometimes, however, we leave it elsewhere so it doesn't get
125                            immediately reused, and we spread the load a bit. */
126                         D1(printk(KERN_DEBUG "...and adding to erasable_list\n"));
127                         list_add_tail(&jeb->list, &c->erasable_list);
128                 }
129         }
130 }
131
132 #define REFILE_NOTEMPTY 0
133 #define REFILE_ANYWAY   1
134
135 static void jffs2_block_refile(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb, int allow_empty)
136 {
137         D1(printk("About to refile bad block at %08x\n", jeb->offset));
138
139         /* File the existing block on the bad_used_list.... */
140         if (c->nextblock == jeb)
141                 c->nextblock = NULL;
142         else /* Not sure this should ever happen... need more coffee */
143                 list_del(&jeb->list);
144         if (jeb->first_node) {
145                 D1(printk("Refiling block at %08x to bad_used_list\n", jeb->offset));
146                 list_add(&jeb->list, &c->bad_used_list);
147         } else {
148                 BUG_ON(allow_empty == REFILE_NOTEMPTY);
149                 /* It has to have had some nodes or we couldn't be here */
150                 D1(printk("Refiling block at %08x to erase_pending_list\n", jeb->offset));
151                 list_add(&jeb->list, &c->erase_pending_list);
152                 c->nr_erasing_blocks++;
153                 jffs2_erase_pending_trigger(c);
154         }
155
156         /* Adjust its size counts accordingly */
157         c->wasted_size += jeb->free_size;
158         c->free_size -= jeb->free_size;
159         jeb->wasted_size += jeb->free_size;
160         jeb->free_size = 0;
161
162         jffs2_dbg_dump_block_lists_nolock(c);
163         jffs2_dbg_acct_sanity_check_nolock(c,jeb);
164         jffs2_dbg_acct_paranoia_check_nolock(c, jeb);
165 }
166
167 /* Recover from failure to write wbuf. Recover the nodes up to the
168  * wbuf, not the one which we were starting to try to write. */
169
170 static void jffs2_wbuf_recover(struct jffs2_sb_info *c)
171 {
172         struct jffs2_eraseblock *jeb, *new_jeb;
173         struct jffs2_raw_node_ref **first_raw, **raw;
174         size_t retlen;
175         int ret;
176         unsigned char *buf;
177         uint32_t start, end, ofs, len;
178
179         spin_lock(&c->erase_completion_lock);
180
181         jeb = &c->blocks[c->wbuf_ofs / c->sector_size];
182
183         jffs2_block_refile(c, jeb, REFILE_NOTEMPTY);
184
185         /* Find the first node to be recovered, by skipping over every
186            node which ends before the wbuf starts, or which is obsolete. */
187         first_raw = &jeb->first_node;
188         while (*first_raw && 
189                (ref_obsolete(*first_raw) ||
190                 (ref_offset(*first_raw)+ref_totlen(c, jeb, *first_raw)) < c->wbuf_ofs)) {
191                 D1(printk(KERN_DEBUG "Skipping node at 0x%08x(%d)-0x%08x which is either before 0x%08x or obsolete\n",
192                           ref_offset(*first_raw), ref_flags(*first_raw),
193                           (ref_offset(*first_raw) + ref_totlen(c, jeb, *first_raw)),
194                           c->wbuf_ofs));
195                 first_raw = &(*first_raw)->next_phys;
196         }
197
198         if (!*first_raw) {
199                 /* All nodes were obsolete. Nothing to recover. */
200                 D1(printk(KERN_DEBUG "No non-obsolete nodes to be recovered. Just filing block bad\n"));
201                 spin_unlock(&c->erase_completion_lock);
202                 return;
203         }
204
205         start = ref_offset(*first_raw);
206         end = ref_offset(*first_raw) + ref_totlen(c, jeb, *first_raw);
207
208         /* Find the last node to be recovered */
209         raw = first_raw;
210         while ((*raw)) {
211                 if (!ref_obsolete(*raw))
212                         end = ref_offset(*raw) + ref_totlen(c, jeb, *raw);
213
214                 raw = &(*raw)->next_phys;
215         }
216         spin_unlock(&c->erase_completion_lock);
217
218         D1(printk(KERN_DEBUG "wbuf recover %08x-%08x\n", start, end));
219
220         buf = NULL;
221         if (start < c->wbuf_ofs) {
222                 /* First affected node was already partially written.
223                  * Attempt to reread the old data into our buffer. */
224
225                 buf = kmalloc(end - start, GFP_KERNEL);
226                 if (!buf) {
227                         printk(KERN_CRIT "Malloc failure in wbuf recovery. Data loss ensues.\n");
228
229                         goto read_failed;
230                 }
231
232                 /* Do the read... */
233                 if (jffs2_cleanmarker_oob(c))
234                         ret = c->mtd->read_ecc(c->mtd, start, c->wbuf_ofs - start, &retlen, buf, NULL, c->oobinfo);
235                 else
236                         ret = c->mtd->read(c->mtd, start, c->wbuf_ofs - start, &retlen, buf);
237                 
238                 if (ret == -EBADMSG && retlen == c->wbuf_ofs - start) {
239                         /* ECC recovered */
240                         ret = 0;
241                 }
242                 if (ret || retlen != c->wbuf_ofs - start) {
243                         printk(KERN_CRIT "Old data are already lost in wbuf recovery. Data loss ensues.\n");
244
245                         kfree(buf);
246                         buf = NULL;
247                 read_failed:
248                         first_raw = &(*first_raw)->next_phys;
249                         /* If this was the only node to be recovered, give up */
250                         if (!(*first_raw))
251                                 return;
252
253                         /* It wasn't. Go on and try to recover nodes complete in the wbuf */
254                         start = ref_offset(*first_raw);
255                 } else {
256                         /* Read succeeded. Copy the remaining data from the wbuf */
257                         memcpy(buf + (c->wbuf_ofs - start), c->wbuf, end - c->wbuf_ofs);
258                 }
259         }
260         /* OK... we're to rewrite (end-start) bytes of data from first_raw onwards.
261            Either 'buf' contains the data, or we find it in the wbuf */
262
263
264         /* ... and get an allocation of space from a shiny new block instead */
265         ret = jffs2_reserve_space_gc(c, end-start, &ofs, &len, JFFS2_SUMMARY_NOSUM_SIZE);
266         if (ret) {
267                 printk(KERN_WARNING "Failed to allocate space for wbuf recovery. Data loss ensues.\n");
268                 kfree(buf);
269                 return;
270         }
271         if (end-start >= c->wbuf_pagesize) {
272                 /* Need to do another write immediately, but it's possible
273                    that this is just because the wbuf itself is completely
274                    full, and there's nothing earlier read back from the 
275                    flash. Hence 'buf' isn't necessarily what we're writing 
276                    from. */
277                 unsigned char *rewrite_buf = buf?:c->wbuf;
278                 uint32_t towrite = (end-start) - ((end-start)%c->wbuf_pagesize);
279
280                 D1(printk(KERN_DEBUG "Write 0x%x bytes at 0x%08x in wbuf recover\n",
281                           towrite, ofs));
282           
283 #ifdef BREAKMEHEADER
284                 static int breakme;
285                 if (breakme++ == 20) {
286                         printk(KERN_NOTICE "Faking write error at 0x%08x\n", ofs);
287                         breakme = 0;
288                         c->mtd->write_ecc(c->mtd, ofs, towrite, &retlen,
289                                           brokenbuf, NULL, c->oobinfo);
290                         ret = -EIO;
291                 } else
292 #endif
293                 if (jffs2_cleanmarker_oob(c))
294                         ret = c->mtd->write_ecc(c->mtd, ofs, towrite, &retlen,
295                                                 rewrite_buf, NULL, c->oobinfo);
296                 else
297                         ret = c->mtd->write(c->mtd, ofs, towrite, &retlen, rewrite_buf);
298
299                 if (ret || retlen != towrite) {
300                         /* Argh. We tried. Really we did. */
301                         printk(KERN_CRIT "Recovery of wbuf failed due to a second write error\n");
302                         kfree(buf);
303
304                         if (retlen) {
305                                 struct jffs2_raw_node_ref *raw2;
306
307                                 raw2 = jffs2_alloc_raw_node_ref();
308                                 if (!raw2)
309                                         return;
310
311                                 raw2->flash_offset = ofs | REF_OBSOLETE;
312                                 raw2->__totlen = ref_totlen(c, jeb, *first_raw);
313                                 raw2->next_phys = NULL;
314                                 raw2->next_in_ino = NULL;
315
316                                 jffs2_add_physical_node_ref(c, raw2);
317                         }
318                         return;
319                 }
320                 printk(KERN_NOTICE "Recovery of wbuf succeeded to %08x\n", ofs);
321
322                 c->wbuf_len = (end - start) - towrite;
323                 c->wbuf_ofs = ofs + towrite;
324                 memmove(c->wbuf, rewrite_buf + towrite, c->wbuf_len);
325                 /* Don't muck about with c->wbuf_inodes. False positives are harmless. */
326                 if (buf)
327                         kfree(buf);
328         } else {
329                 /* OK, now we're left with the dregs in whichever buffer we're using */
330                 if (buf) {
331                         memcpy(c->wbuf, buf, end-start);
332                         kfree(buf);
333                 } else {
334                         memmove(c->wbuf, c->wbuf + (start - c->wbuf_ofs), end - start);
335                 }
336                 c->wbuf_ofs = ofs;
337                 c->wbuf_len = end - start;
338         }
339
340         /* Now sort out the jffs2_raw_node_refs, moving them from the old to the next block */
341         new_jeb = &c->blocks[ofs / c->sector_size];
342
343         spin_lock(&c->erase_completion_lock);
344         if (new_jeb->first_node) {
345                 /* Odd, but possible with ST flash later maybe */
346                 new_jeb->last_node->next_phys = *first_raw;
347         } else {
348                 new_jeb->first_node = *first_raw;
349         }
350
351         raw = first_raw;
352         while (*raw) {
353                 uint32_t rawlen = ref_totlen(c, jeb, *raw);
354
355                 D1(printk(KERN_DEBUG "Refiling block of %08x at %08x(%d) to %08x\n",
356                           rawlen, ref_offset(*raw), ref_flags(*raw), ofs));
357
358                 if (ref_obsolete(*raw)) {
359                         /* Shouldn't really happen much */
360                         new_jeb->dirty_size += rawlen;
361                         new_jeb->free_size -= rawlen;
362                         c->dirty_size += rawlen;
363                 } else {
364                         new_jeb->used_size += rawlen;
365                         new_jeb->free_size -= rawlen;
366                         jeb->dirty_size += rawlen;
367                         jeb->used_size  -= rawlen;
368                         c->dirty_size += rawlen;
369                 }
370                 c->free_size -= rawlen;
371                 (*raw)->flash_offset = ofs | ref_flags(*raw);
372                 ofs += rawlen;
373                 new_jeb->last_node = *raw;
374
375                 raw = &(*raw)->next_phys;
376         }
377
378         /* Fix up the original jeb now it's on the bad_list */
379         *first_raw = NULL;
380         if (first_raw == &jeb->first_node) {
381                 jeb->last_node = NULL;
382                 D1(printk(KERN_DEBUG "Failing block at %08x is now empty. Moving to erase_pending_list\n", jeb->offset));
383                 list_del(&jeb->list);
384                 list_add(&jeb->list, &c->erase_pending_list);
385                 c->nr_erasing_blocks++;
386                 jffs2_erase_pending_trigger(c);
387         }
388         else
389                 jeb->last_node = container_of(first_raw, struct jffs2_raw_node_ref, next_phys);
390
391         jffs2_dbg_acct_sanity_check_nolock(c, jeb);
392         jffs2_dbg_acct_paranoia_check_nolock(c, jeb);
393
394         jffs2_dbg_acct_sanity_check_nolock(c, new_jeb);
395         jffs2_dbg_acct_paranoia_check_nolock(c, new_jeb);
396
397         spin_unlock(&c->erase_completion_lock);
398
399         D1(printk(KERN_DEBUG "wbuf recovery completed OK\n"));
400 }
401
402 /* Meaning of pad argument:
403    0: Do not pad. Probably pointless - we only ever use this when we can't pad anyway.
404    1: Pad, do not adjust nextblock free_size
405    2: Pad, adjust nextblock free_size
406 */
407 #define NOPAD           0
408 #define PAD_NOACCOUNT   1
409 #define PAD_ACCOUNTING  2
410
411 static int __jffs2_flush_wbuf(struct jffs2_sb_info *c, int pad)
412 {
413         int ret;
414         size_t retlen;
415
416         /* Nothing to do if not write-buffering the flash. In particular, we shouldn't
417            del_timer() the timer we never initialised. */
418         if (!jffs2_is_writebuffered(c))
419                 return 0;
420
421         if (!down_trylock(&c->alloc_sem)) {
422                 up(&c->alloc_sem);
423                 printk(KERN_CRIT "jffs2_flush_wbuf() called with alloc_sem not locked!\n");
424                 BUG();
425         }
426
427         if (!c->wbuf_len)       /* already checked c->wbuf above */
428                 return 0;
429
430         /* claim remaining space on the page
431            this happens, if we have a change to a new block,
432            or if fsync forces us to flush the writebuffer.
433            if we have a switch to next page, we will not have
434            enough remaining space for this. 
435         */
436         if (pad && !jffs2_dataflash(c)) {
437                 c->wbuf_len = PAD(c->wbuf_len);
438
439                 /* Pad with JFFS2_DIRTY_BITMASK initially.  this helps out ECC'd NOR
440                    with 8 byte page size */
441                 memset(c->wbuf + c->wbuf_len, 0, c->wbuf_pagesize - c->wbuf_len);
442                 
443                 if ( c->wbuf_len + sizeof(struct jffs2_unknown_node) < c->wbuf_pagesize) {
444                         struct jffs2_unknown_node *padnode = (void *)(c->wbuf + c->wbuf_len);
445                         padnode->magic = cpu_to_je16(JFFS2_MAGIC_BITMASK);
446                         padnode->nodetype = cpu_to_je16(JFFS2_NODETYPE_PADDING);
447                         padnode->totlen = cpu_to_je32(c->wbuf_pagesize - c->wbuf_len);
448                         padnode->hdr_crc = cpu_to_je32(crc32(0, padnode, sizeof(*padnode)-4));
449                 }
450         }
451         /* else jffs2_flash_writev has actually filled in the rest of the
452            buffer for us, and will deal with the node refs etc. later. */
453         
454 #ifdef BREAKME
455         static int breakme;
456         if (breakme++ == 20) {
457                 printk(KERN_NOTICE "Faking write error at 0x%08x\n", c->wbuf_ofs);
458                 breakme = 0;
459                 c->mtd->write_ecc(c->mtd, c->wbuf_ofs, c->wbuf_pagesize,
460                                         &retlen, brokenbuf, NULL, c->oobinfo);
461                 ret = -EIO;
462         } else 
463 #endif
464         
465         if (jffs2_cleanmarker_oob(c))
466                 ret = c->mtd->write_ecc(c->mtd, c->wbuf_ofs, c->wbuf_pagesize, &retlen, c->wbuf, NULL, c->oobinfo);
467         else
468                 ret = c->mtd->write(c->mtd, c->wbuf_ofs, c->wbuf_pagesize, &retlen, c->wbuf);
469
470         if (ret || retlen != c->wbuf_pagesize) {
471                 if (ret)
472                         printk(KERN_WARNING "jffs2_flush_wbuf(): Write failed with %d\n",ret);
473                 else {
474                         printk(KERN_WARNING "jffs2_flush_wbuf(): Write was short: %zd instead of %d\n",
475                                 retlen, c->wbuf_pagesize);
476                         ret = -EIO;
477                 }
478
479                 jffs2_wbuf_recover(c);
480
481                 return ret;
482         }
483
484         spin_lock(&c->erase_completion_lock);
485
486         /* Adjust free size of the block if we padded. */
487         if (pad && !jffs2_dataflash(c)) {
488                 struct jffs2_eraseblock *jeb;
489
490                 jeb = &c->blocks[c->wbuf_ofs / c->sector_size];
491
492                 D1(printk(KERN_DEBUG "jffs2_flush_wbuf() adjusting free_size of %sblock at %08x\n",
493                           (jeb==c->nextblock)?"next":"", jeb->offset));
494
495                 /* wbuf_pagesize - wbuf_len is the amount of space that's to be 
496                    padded. If there is less free space in the block than that,
497                    something screwed up */
498                 if (jeb->free_size < (c->wbuf_pagesize - c->wbuf_len)) {
499                         printk(KERN_CRIT "jffs2_flush_wbuf(): Accounting error. wbuf at 0x%08x has 0x%03x bytes, 0x%03x left.\n",
500                                c->wbuf_ofs, c->wbuf_len, c->wbuf_pagesize-c->wbuf_len);
501                         printk(KERN_CRIT "jffs2_flush_wbuf(): But free_size for block at 0x%08x is only 0x%08x\n",
502                                jeb->offset, jeb->free_size);
503                         BUG();
504                 }
505                 jeb->free_size -= (c->wbuf_pagesize - c->wbuf_len);
506                 c->free_size -= (c->wbuf_pagesize - c->wbuf_len);
507                 jeb->wasted_size += (c->wbuf_pagesize - c->wbuf_len);
508                 c->wasted_size += (c->wbuf_pagesize - c->wbuf_len);
509         }
510
511         /* Stick any now-obsoleted blocks on the erase_pending_list */
512         jffs2_refile_wbuf_blocks(c);
513         jffs2_clear_wbuf_ino_list(c);
514         spin_unlock(&c->erase_completion_lock);
515
516         memset(c->wbuf,0xff,c->wbuf_pagesize);
517         /* adjust write buffer offset, else we get a non contiguous write bug */
518         c->wbuf_ofs += c->wbuf_pagesize;
519         c->wbuf_len = 0;
520         return 0;
521 }
522
523 /* Trigger garbage collection to flush the write-buffer. 
524    If ino arg is zero, do it if _any_ real (i.e. not GC) writes are
525    outstanding. If ino arg non-zero, do it only if a write for the 
526    given inode is outstanding. */
527 int jffs2_flush_wbuf_gc(struct jffs2_sb_info *c, uint32_t ino)
528 {
529         uint32_t old_wbuf_ofs;
530         uint32_t old_wbuf_len;
531         int ret = 0;
532
533         D1(printk(KERN_DEBUG "jffs2_flush_wbuf_gc() called for ino #%u...\n", ino));
534
535         if (!c->wbuf)
536                 return 0;
537
538         down(&c->alloc_sem);
539         if (!jffs2_wbuf_pending_for_ino(c, ino)) {
540                 D1(printk(KERN_DEBUG "Ino #%d not pending in wbuf. Returning\n", ino));
541                 up(&c->alloc_sem);
542                 return 0;
543         }
544
545         old_wbuf_ofs = c->wbuf_ofs;
546         old_wbuf_len = c->wbuf_len;
547
548         if (c->unchecked_size) {
549                 /* GC won't make any progress for a while */
550                 D1(printk(KERN_DEBUG "jffs2_flush_wbuf_gc() padding. Not finished checking\n"));
551                 down_write(&c->wbuf_sem);
552                 ret = __jffs2_flush_wbuf(c, PAD_ACCOUNTING);
553                 /* retry flushing wbuf in case jffs2_wbuf_recover
554                    left some data in the wbuf */
555                 if (ret)
556                         ret = __jffs2_flush_wbuf(c, PAD_ACCOUNTING);
557                 up_write(&c->wbuf_sem);
558         } else while (old_wbuf_len &&
559                       old_wbuf_ofs == c->wbuf_ofs) {
560
561                 up(&c->alloc_sem);
562
563                 D1(printk(KERN_DEBUG "jffs2_flush_wbuf_gc() calls gc pass\n"));
564
565                 ret = jffs2_garbage_collect_pass(c);
566                 if (ret) {
567                         /* GC failed. Flush it with padding instead */
568                         down(&c->alloc_sem);
569                         down_write(&c->wbuf_sem);
570                         ret = __jffs2_flush_wbuf(c, PAD_ACCOUNTING);
571                         /* retry flushing wbuf in case jffs2_wbuf_recover
572                            left some data in the wbuf */
573                         if (ret)
574                                 ret = __jffs2_flush_wbuf(c, PAD_ACCOUNTING);
575                         up_write(&c->wbuf_sem);
576                         break;
577                 }
578                 down(&c->alloc_sem);
579         }
580
581         D1(printk(KERN_DEBUG "jffs2_flush_wbuf_gc() ends...\n"));
582
583         up(&c->alloc_sem);
584         return ret;
585 }
586
587 /* Pad write-buffer to end and write it, wasting space. */
588 int jffs2_flush_wbuf_pad(struct jffs2_sb_info *c)
589 {
590         int ret;
591
592         if (!c->wbuf)
593                 return 0;
594
595         down_write(&c->wbuf_sem);
596         ret = __jffs2_flush_wbuf(c, PAD_NOACCOUNT);
597         /* retry - maybe wbuf recover left some data in wbuf. */
598         if (ret)
599                 ret = __jffs2_flush_wbuf(c, PAD_NOACCOUNT);
600         up_write(&c->wbuf_sem);
601
602         return ret;
603 }
604
605 #ifdef CONFIG_JFFS2_FS_WRITEBUFFER
606 #define PAGE_DIV(x) ( ((unsigned long)(x) / (unsigned long)(c->wbuf_pagesize)) * (unsigned long)(c->wbuf_pagesize) )
607 #define PAGE_MOD(x) ( (unsigned long)(x) % (unsigned long)(c->wbuf_pagesize) )
608 #else
609 #define PAGE_DIV(x) ( (x) & (~(c->wbuf_pagesize - 1)) )
610 #define PAGE_MOD(x) ( (x) & (c->wbuf_pagesize - 1) )
611 #endif
612
613 int jffs2_flash_writev(struct jffs2_sb_info *c, const struct kvec *invecs, unsigned long count, loff_t to, size_t *retlen, uint32_t ino)
614 {
615         struct kvec outvecs[3];
616         uint32_t totlen = 0;
617         uint32_t split_ofs = 0;
618         uint32_t old_totlen;
619         int ret, splitvec = -1;
620         int invec, outvec;
621         size_t wbuf_retlen;
622         unsigned char *wbuf_ptr;
623         size_t donelen = 0;
624         uint32_t outvec_to = to;
625
626         /* If not NAND flash, don't bother */
627         if (!jffs2_is_writebuffered(c))
628                 return jffs2_flash_direct_writev(c, invecs, count, to, retlen);
629         
630         down_write(&c->wbuf_sem);
631
632         /* If wbuf_ofs is not initialized, set it to target address */
633         if (c->wbuf_ofs == 0xFFFFFFFF) {
634                 c->wbuf_ofs = PAGE_DIV(to);
635                 c->wbuf_len = PAGE_MOD(to);                     
636                 memset(c->wbuf,0xff,c->wbuf_pagesize);
637         }
638
639         /* Fixup the wbuf if we are moving to a new eraseblock.  The checks below
640            fail for ECC'd NOR because cleanmarker == 16, so a block starts at
641            xxx0010.  */
642         if (jffs2_nor_ecc(c)) {
643                 if (((c->wbuf_ofs % c->sector_size) == 0) && !c->wbuf_len) {
644                         c->wbuf_ofs = PAGE_DIV(to);
645                         c->wbuf_len = PAGE_MOD(to);
646                         memset(c->wbuf,0xff,c->wbuf_pagesize);
647                 }
648         }
649         
650         /* Sanity checks on target address. 
651            It's permitted to write at PAD(c->wbuf_len+c->wbuf_ofs), 
652            and it's permitted to write at the beginning of a new 
653            erase block. Anything else, and you die.
654            New block starts at xxx000c (0-b = block header)
655         */
656         if (SECTOR_ADDR(to) != SECTOR_ADDR(c->wbuf_ofs)) {
657                 /* It's a write to a new block */
658                 if (c->wbuf_len) {
659                         D1(printk(KERN_DEBUG "jffs2_flash_writev() to 0x%lx causes flush of wbuf at 0x%08x\n", (unsigned long)to, c->wbuf_ofs));
660                         ret = __jffs2_flush_wbuf(c, PAD_NOACCOUNT);
661                         if (ret) {
662                                 /* the underlying layer has to check wbuf_len to do the cleanup */
663                                 D1(printk(KERN_WARNING "jffs2_flush_wbuf() called from jffs2_flash_writev() failed %d\n", ret));
664                                 *retlen = 0;
665                                 goto exit;
666                         }
667                 }
668                 /* set pointer to new block */
669                 c->wbuf_ofs = PAGE_DIV(to);
670                 c->wbuf_len = PAGE_MOD(to);                     
671         } 
672
673         if (to != PAD(c->wbuf_ofs + c->wbuf_len)) {
674                 /* We're not writing immediately after the writebuffer. Bad. */
675                 printk(KERN_CRIT "jffs2_flash_writev(): Non-contiguous write to %08lx\n", (unsigned long)to);
676                 if (c->wbuf_len)
677                         printk(KERN_CRIT "wbuf was previously %08x-%08x\n",
678                                           c->wbuf_ofs, c->wbuf_ofs+c->wbuf_len);
679                 BUG();
680         }
681
682         /* Note outvecs[3] above. We know count is never greater than 2 */
683         if (count > 2) {
684                 printk(KERN_CRIT "jffs2_flash_writev(): count is %ld\n", count);
685                 BUG();
686         }
687
688         invec = 0;
689         outvec = 0;
690
691         /* Fill writebuffer first, if already in use */ 
692         if (c->wbuf_len) {
693                 uint32_t invec_ofs = 0;
694
695                 /* adjust alignment offset */ 
696                 if (c->wbuf_len != PAGE_MOD(to)) {
697                         c->wbuf_len = PAGE_MOD(to);
698                         /* take care of alignment to next page */
699                         if (!c->wbuf_len)
700                                 c->wbuf_len = c->wbuf_pagesize;
701                 }
702                 
703                 while(c->wbuf_len < c->wbuf_pagesize) {
704                         uint32_t thislen;
705                         
706                         if (invec == count)
707                                 goto alldone;
708
709                         thislen = c->wbuf_pagesize - c->wbuf_len;
710
711                         if (thislen >= invecs[invec].iov_len)
712                                 thislen = invecs[invec].iov_len;
713         
714                         invec_ofs = thislen;
715
716                         memcpy(c->wbuf + c->wbuf_len, invecs[invec].iov_base, thislen);
717                         c->wbuf_len += thislen;
718                         donelen += thislen;
719                         /* Get next invec, if actual did not fill the buffer */
720                         if (c->wbuf_len < c->wbuf_pagesize) 
721                                 invec++;
722                 }                       
723                 
724                 /* write buffer is full, flush buffer */
725                 ret = __jffs2_flush_wbuf(c, NOPAD);
726                 if (ret) {
727                         /* the underlying layer has to check wbuf_len to do the cleanup */
728                         D1(printk(KERN_WARNING "jffs2_flush_wbuf() called from jffs2_flash_writev() failed %d\n", ret));
729                         /* Retlen zero to make sure our caller doesn't mark the space dirty.
730                            We've already done everything that's necessary */
731                         *retlen = 0;
732                         goto exit;
733                 }
734                 outvec_to += donelen;
735                 c->wbuf_ofs = outvec_to;
736
737                 /* All invecs done ? */
738                 if (invec == count)
739                         goto alldone;
740
741                 /* Set up the first outvec, containing the remainder of the
742                    invec we partially used */
743                 if (invecs[invec].iov_len > invec_ofs) {
744                         outvecs[0].iov_base = invecs[invec].iov_base+invec_ofs;
745                         totlen = outvecs[0].iov_len = invecs[invec].iov_len-invec_ofs;
746                         if (totlen > c->wbuf_pagesize) {
747                                 splitvec = outvec;
748                                 split_ofs = outvecs[0].iov_len - PAGE_MOD(totlen);
749                         }
750                         outvec++;
751                 }
752                 invec++;
753         }
754
755         /* OK, now we've flushed the wbuf and the start of the bits
756            we have been asked to write, now to write the rest.... */
757
758         /* totlen holds the amount of data still to be written */
759         old_totlen = totlen;
760         for ( ; invec < count; invec++,outvec++ ) {
761                 outvecs[outvec].iov_base = invecs[invec].iov_base;
762                 totlen += outvecs[outvec].iov_len = invecs[invec].iov_len;
763                 if (PAGE_DIV(totlen) != PAGE_DIV(old_totlen)) {
764                         splitvec = outvec;
765                         split_ofs = outvecs[outvec].iov_len - PAGE_MOD(totlen);
766                         old_totlen = totlen;
767                 }
768         }
769
770         /* Now the outvecs array holds all the remaining data to write */
771         /* Up to splitvec,split_ofs is to be written immediately. The rest
772            goes into the (now-empty) wbuf */
773
774         if (splitvec != -1) {
775                 uint32_t remainder;
776
777                 remainder = outvecs[splitvec].iov_len - split_ofs;
778                 outvecs[splitvec].iov_len = split_ofs;
779
780                 /* We did cross a page boundary, so we write some now */
781                 if (jffs2_cleanmarker_oob(c))
782                         ret = c->mtd->writev_ecc(c->mtd, outvecs, splitvec+1, outvec_to, &wbuf_retlen, NULL, c->oobinfo); 
783                 else
784                         ret = jffs2_flash_direct_writev(c, outvecs, splitvec+1, outvec_to, &wbuf_retlen);
785                 
786                 if (ret < 0 || wbuf_retlen != PAGE_DIV(totlen)) {
787                         /* At this point we have no problem,
788                            c->wbuf is empty. However refile nextblock to avoid
789                            writing again to same address.
790                         */
791                         struct jffs2_eraseblock *jeb;
792
793                         spin_lock(&c->erase_completion_lock);
794
795                         jeb = &c->blocks[outvec_to / c->sector_size];
796                         jffs2_block_refile(c, jeb, REFILE_ANYWAY);
797
798                         *retlen = 0;
799                         spin_unlock(&c->erase_completion_lock);
800                         goto exit;
801                 }
802                 
803                 donelen += wbuf_retlen;
804                 c->wbuf_ofs = PAGE_DIV(outvec_to) + PAGE_DIV(totlen);
805
806                 if (remainder) {
807                         outvecs[splitvec].iov_base += split_ofs;
808                         outvecs[splitvec].iov_len = remainder;
809                 } else {
810                         splitvec++;
811                 }
812
813         } else {
814                 splitvec = 0;
815         }
816
817         /* Now splitvec points to the start of the bits we have to copy
818            into the wbuf */
819         wbuf_ptr = c->wbuf;
820
821         for ( ; splitvec < outvec; splitvec++) {
822                 /* Don't copy the wbuf into itself */
823                 if (outvecs[splitvec].iov_base == c->wbuf)
824                         continue;
825                 memcpy(wbuf_ptr, outvecs[splitvec].iov_base, outvecs[splitvec].iov_len);
826                 wbuf_ptr += outvecs[splitvec].iov_len;
827                 donelen += outvecs[splitvec].iov_len;
828         }
829         c->wbuf_len = wbuf_ptr - c->wbuf;
830
831         /* If there's a remainder in the wbuf and it's a non-GC write,
832            remember that the wbuf affects this ino */
833 alldone:
834         *retlen = donelen;
835
836         if (jffs2_sum_active()) {
837                 int res = jffs2_sum_add_kvec(c, invecs, count, (uint32_t) to);
838                 if (res)
839                         return res;
840         }
841
842         if (c->wbuf_len && ino)
843                 jffs2_wbuf_dirties_inode(c, ino);
844
845         ret = 0;
846         
847 exit:
848         up_write(&c->wbuf_sem);
849         return ret;
850 }
851
852 /*
853  *      This is the entry for flash write.
854  *      Check, if we work on NAND FLASH, if so build an kvec and write it via vritev
855 */
856 int jffs2_flash_write(struct jffs2_sb_info *c, loff_t ofs, size_t len, size_t *retlen, const u_char *buf)
857 {
858         struct kvec vecs[1];
859
860         if (!jffs2_is_writebuffered(c))
861                 return jffs2_flash_direct_write(c, ofs, len, retlen, buf);
862
863         vecs[0].iov_base = (unsigned char *) buf;
864         vecs[0].iov_len = len;
865         return jffs2_flash_writev(c, vecs, 1, ofs, retlen, 0);
866 }
867
868 /*
869         Handle readback from writebuffer and ECC failure return
870 */
871 int jffs2_flash_read(struct jffs2_sb_info *c, loff_t ofs, size_t len, size_t *retlen, u_char *buf)
872 {
873         loff_t  orbf = 0, owbf = 0, lwbf = 0;
874         int     ret;
875
876         if (!jffs2_is_writebuffered(c))
877                 return c->mtd->read(c->mtd, ofs, len, retlen, buf);
878
879         /* Read flash */
880         down_read(&c->wbuf_sem);
881         if (jffs2_cleanmarker_oob(c))
882                 ret = c->mtd->read_ecc(c->mtd, ofs, len, retlen, buf, NULL, c->oobinfo);
883         else
884                 ret = c->mtd->read(c->mtd, ofs, len, retlen, buf);
885
886         if ( (ret == -EBADMSG) && (*retlen == len) ) {
887                 printk(KERN_WARNING "mtd->read(0x%zx bytes from 0x%llx) returned ECC error\n",
888                        len, ofs);
889                 /* 
890                  * We have the raw data without ECC correction in the buffer, maybe 
891                  * we are lucky and all data or parts are correct. We check the node.
892                  * If data are corrupted node check will sort it out.
893                  * We keep this block, it will fail on write or erase and the we
894                  * mark it bad. Or should we do that now? But we should give him a chance.
895                  * Maybe we had a system crash or power loss before the ecc write or  
896                  * a erase was completed.
897                  * So we return success. :)
898                  */
899                 ret = 0;
900         }       
901
902         /* if no writebuffer available or write buffer empty, return */
903         if (!c->wbuf_pagesize || !c->wbuf_len)
904                 goto exit;
905
906         /* if we read in a different block, return */
907         if (SECTOR_ADDR(ofs) != SECTOR_ADDR(c->wbuf_ofs))
908                 goto exit;
909
910         if (ofs >= c->wbuf_ofs) {
911                 owbf = (ofs - c->wbuf_ofs);     /* offset in write buffer */
912                 if (owbf > c->wbuf_len)         /* is read beyond write buffer ? */
913                         goto exit;
914                 lwbf = c->wbuf_len - owbf;      /* number of bytes to copy */
915                 if (lwbf > len) 
916                         lwbf = len;
917         } else {        
918                 orbf = (c->wbuf_ofs - ofs);     /* offset in read buffer */
919                 if (orbf > len)                 /* is write beyond write buffer ? */
920                         goto exit;
921                 lwbf = len - orbf;              /* number of bytes to copy */
922                 if (lwbf > c->wbuf_len) 
923                         lwbf = c->wbuf_len;
924         }       
925         if (lwbf > 0)
926                 memcpy(buf+orbf,c->wbuf+owbf,lwbf);
927
928 exit:
929         up_read(&c->wbuf_sem);
930         return ret;
931 }
932
933 /*
934  *      Check, if the out of band area is empty
935  */
936 int jffs2_check_oob_empty( struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb, int mode)
937 {
938         unsigned char *buf;
939         int     ret = 0;
940         int     i,len,page;
941         size_t  retlen;
942         int     oob_size;
943
944         /* allocate a buffer for all oob data in this sector */
945         oob_size = c->mtd->oobsize;
946         len = 4 * oob_size;
947         buf = kmalloc(len, GFP_KERNEL);
948         if (!buf) {
949                 printk(KERN_NOTICE "jffs2_check_oob_empty(): allocation of temporary data buffer for oob check failed\n");
950                 return -ENOMEM;
951         }
952         /* 
953          * if mode = 0, we scan for a total empty oob area, else we have
954          * to take care of the cleanmarker in the first page of the block
955         */
956         ret = jffs2_flash_read_oob(c, jeb->offset, len , &retlen, buf);
957         if (ret) {
958                 D1(printk(KERN_WARNING "jffs2_check_oob_empty(): Read OOB failed %d for block at %08x\n", ret, jeb->offset));
959                 goto out;
960         }
961         
962         if (retlen < len) {
963                 D1(printk(KERN_WARNING "jffs2_check_oob_empty(): Read OOB return short read "
964                           "(%zd bytes not %d) for block at %08x\n", retlen, len, jeb->offset));
965                 ret = -EIO;
966                 goto out;
967         }
968         
969         /* Special check for first page */
970         for(i = 0; i < oob_size ; i++) {
971                 /* Yeah, we know about the cleanmarker. */
972                 if (mode && i >= c->fsdata_pos && 
973                     i < c->fsdata_pos + c->fsdata_len)
974                         continue;
975
976                 if (buf[i] != 0xFF) {
977                         D2(printk(KERN_DEBUG "Found %02x at %x in OOB for %08x\n",
978                                   buf[i], i, jeb->offset));
979                         ret = 1; 
980                         goto out;
981                 }
982         }
983
984         /* we know, we are aligned :) */        
985         for (page = oob_size; page < len; page += sizeof(long)) {
986                 unsigned long dat = *(unsigned long *)(&buf[page]);
987                 if(dat != -1) {
988                         ret = 1; 
989                         goto out;
990                 }
991         }
992
993 out:
994         kfree(buf);     
995         
996         return ret;
997 }
998
999 /*
1000 *       Scan for a valid cleanmarker and for bad blocks
1001 *       For virtual blocks (concatenated physical blocks) check the cleanmarker
1002 *       only in the first page of the first physical block, but scan for bad blocks in all
1003 *       physical blocks
1004 */
1005 int jffs2_check_nand_cleanmarker (struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb)
1006 {
1007         struct jffs2_unknown_node n;
1008         unsigned char buf[2 * NAND_MAX_OOBSIZE];
1009         unsigned char *p;
1010         int ret, i, cnt, retval = 0;
1011         size_t retlen, offset;
1012         int oob_size;
1013
1014         offset = jeb->offset;
1015         oob_size = c->mtd->oobsize;
1016
1017         /* Loop through the physical blocks */
1018         for (cnt = 0; cnt < (c->sector_size / c->mtd->erasesize); cnt++) {
1019                 /* Check first if the block is bad. */
1020                 if (c->mtd->block_isbad (c->mtd, offset)) {
1021                         D1 (printk (KERN_WARNING "jffs2_check_nand_cleanmarker(): Bad block at %08x\n", jeb->offset));
1022                         return 2;
1023                 }
1024                 /*
1025                    *    We read oob data from page 0 and 1 of the block.
1026                    *    page 0 contains cleanmarker and badblock info
1027                    *    page 1 contains failure count of this block
1028                  */
1029                 ret = c->mtd->read_oob (c->mtd, offset, oob_size << 1, &retlen, buf);
1030
1031                 if (ret) {
1032                         D1 (printk (KERN_WARNING "jffs2_check_nand_cleanmarker(): Read OOB failed %d for block at %08x\n", ret, jeb->offset));
1033                         return ret;
1034                 }
1035                 if (retlen < (oob_size << 1)) {
1036                         D1 (printk (KERN_WARNING "jffs2_check_nand_cleanmarker(): Read OOB return short read (%zd bytes not %d) for block at %08x\n", retlen, oob_size << 1, jeb->offset));
1037                         return -EIO;
1038                 }
1039
1040                 /* Check cleanmarker only on the first physical block */
1041                 if (!cnt) {
1042                         n.magic = cpu_to_je16 (JFFS2_MAGIC_BITMASK);
1043                         n.nodetype = cpu_to_je16 (JFFS2_NODETYPE_CLEANMARKER);
1044                         n.totlen = cpu_to_je32 (8);
1045                         p = (unsigned char *) &n;
1046
1047                         for (i = 0; i < c->fsdata_len; i++) {
1048                                 if (buf[c->fsdata_pos + i] != p[i]) {
1049                                         retval = 1;
1050                                 }
1051                         }
1052                         D1(if (retval == 1) {
1053                                 printk(KERN_WARNING "jffs2_check_nand_cleanmarker(): Cleanmarker node not detected in block at %08x\n", jeb->offset);
1054                                 printk(KERN_WARNING "OOB at %08x was ", offset);
1055                                 for (i=0; i < oob_size; i++) {
1056                                         printk("%02x ", buf[i]);
1057                                 }
1058                                 printk("\n");
1059                         })
1060                 }
1061                 offset += c->mtd->erasesize;
1062         }
1063         return retval;
1064 }
1065
1066 int jffs2_write_nand_cleanmarker(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb)
1067 {
1068         struct  jffs2_unknown_node n;
1069         int     ret;
1070         size_t  retlen;
1071
1072         n.magic = cpu_to_je16(JFFS2_MAGIC_BITMASK);
1073         n.nodetype = cpu_to_je16(JFFS2_NODETYPE_CLEANMARKER);
1074         n.totlen = cpu_to_je32(8);
1075
1076         ret = jffs2_flash_write_oob(c, jeb->offset + c->fsdata_pos, c->fsdata_len, &retlen, (unsigned char *)&n);
1077         
1078         if (ret) {
1079                 D1(printk(KERN_WARNING "jffs2_write_nand_cleanmarker(): Write failed for block at %08x: error %d\n", jeb->offset, ret));
1080                 return ret;
1081         }
1082         if (retlen != c->fsdata_len) {
1083                 D1(printk(KERN_WARNING "jffs2_write_nand_cleanmarker(): Short write for block at %08x: %zd not %d\n", jeb->offset, retlen, c->fsdata_len));
1084                 return ret;
1085         }
1086         return 0;
1087 }
1088
1089 /* 
1090  * On NAND we try to mark this block bad. If the block was erased more
1091  * than MAX_ERASE_FAILURES we mark it finaly bad.
1092  * Don't care about failures. This block remains on the erase-pending
1093  * or badblock list as long as nobody manipulates the flash with
1094  * a bootloader or something like that.
1095  */
1096
1097 int jffs2_write_nand_badblock(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb, uint32_t bad_offset)
1098 {
1099         int     ret;
1100
1101         /* if the count is < max, we try to write the counter to the 2nd page oob area */
1102         if( ++jeb->bad_count < MAX_ERASE_FAILURES)
1103                 return 0;
1104
1105         if (!c->mtd->block_markbad)
1106                 return 1; // What else can we do?
1107
1108         D1(printk(KERN_WARNING "jffs2_write_nand_badblock(): Marking bad block at %08x\n", bad_offset));
1109         ret = c->mtd->block_markbad(c->mtd, bad_offset);
1110         
1111         if (ret) {
1112                 D1(printk(KERN_WARNING "jffs2_write_nand_badblock(): Write failed for block at %08x: error %d\n", jeb->offset, ret));
1113                 return ret;
1114         }
1115         return 1;
1116 }
1117
1118 #define NAND_JFFS2_OOB16_FSDALEN        8
1119
1120 static struct nand_oobinfo jffs2_oobinfo_docecc = {
1121         .useecc = MTD_NANDECC_PLACE,
1122         .eccbytes = 6,
1123         .eccpos = {0,1,2,3,4,5}
1124 };
1125
1126
1127 static int jffs2_nand_set_oobinfo(struct jffs2_sb_info *c)
1128 {
1129         struct nand_oobinfo *oinfo = &c->mtd->oobinfo;
1130
1131         /* Do this only, if we have an oob buffer */
1132         if (!c->mtd->oobsize)
1133                 return 0;
1134         
1135         /* Cleanmarker is out-of-band, so inline size zero */
1136         c->cleanmarker_size = 0;
1137
1138         /* Should we use autoplacement ? */
1139         if (oinfo && oinfo->useecc == MTD_NANDECC_AUTOPLACE) {
1140                 D1(printk(KERN_DEBUG "JFFS2 using autoplace on NAND\n"));
1141                 /* Get the position of the free bytes */
1142                 if (!oinfo->oobfree[0][1]) {
1143                         printk (KERN_WARNING "jffs2_nand_set_oobinfo(): Eeep. Autoplacement selected and no empty space in oob\n");
1144                         return -ENOSPC;
1145                 }
1146                 c->fsdata_pos = oinfo->oobfree[0][0];
1147                 c->fsdata_len = oinfo->oobfree[0][1];
1148                 if (c->fsdata_len > 8)
1149                         c->fsdata_len = 8;
1150         } else {
1151                 /* This is just a legacy fallback and should go away soon */
1152                 switch(c->mtd->ecctype) {
1153                 case MTD_ECC_RS_DiskOnChip:
1154                         printk(KERN_WARNING "JFFS2 using DiskOnChip hardware ECC without autoplacement. Fix it!\n");
1155                         c->oobinfo = &jffs2_oobinfo_docecc;
1156                         c->fsdata_pos = 6;
1157                         c->fsdata_len = NAND_JFFS2_OOB16_FSDALEN;
1158                         c->badblock_pos = 15;
1159                         break;
1160         
1161                 default:
1162                         D1(printk(KERN_DEBUG "JFFS2 on NAND. No autoplacment info found\n"));
1163                         return -EINVAL;
1164                 }
1165         }
1166         return 0;
1167 }
1168
1169 int jffs2_nand_flash_setup(struct jffs2_sb_info *c)
1170 {
1171         int res;
1172
1173         /* Initialise write buffer */
1174         init_rwsem(&c->wbuf_sem);
1175         c->wbuf_pagesize = c->mtd->oobblock;
1176         c->wbuf_ofs = 0xFFFFFFFF;
1177         
1178         c->wbuf = kmalloc(c->wbuf_pagesize, GFP_KERNEL);
1179         if (!c->wbuf)
1180                 return -ENOMEM;
1181
1182         res = jffs2_nand_set_oobinfo(c);
1183
1184 #ifdef BREAKME
1185         if (!brokenbuf)
1186                 brokenbuf = kmalloc(c->wbuf_pagesize, GFP_KERNEL);
1187         if (!brokenbuf) {
1188                 kfree(c->wbuf);
1189                 return -ENOMEM;
1190         }
1191         memset(brokenbuf, 0xdb, c->wbuf_pagesize);
1192 #endif
1193         return res;
1194 }
1195
1196 void jffs2_nand_flash_cleanup(struct jffs2_sb_info *c)
1197 {
1198         kfree(c->wbuf);
1199 }
1200
1201 int jffs2_dataflash_setup(struct jffs2_sb_info *c) {
1202         c->cleanmarker_size = 0;                /* No cleanmarkers needed */
1203         
1204         /* Initialize write buffer */
1205         init_rwsem(&c->wbuf_sem);
1206         c->wbuf_pagesize = c->sector_size;
1207         c->wbuf_ofs = 0xFFFFFFFF;
1208
1209         c->wbuf = kmalloc(c->wbuf_pagesize, GFP_KERNEL);
1210         if (!c->wbuf)
1211                 return -ENOMEM;
1212
1213         printk(KERN_INFO "JFFS2 write-buffering enabled (%i)\n", c->wbuf_pagesize);
1214
1215         return 0;
1216 }
1217
1218 void jffs2_dataflash_cleanup(struct jffs2_sb_info *c) {
1219         kfree(c->wbuf);
1220 }
1221
1222 int jffs2_nor_ecc_flash_setup(struct jffs2_sb_info *c) {
1223         /* Cleanmarker is actually larger on the flashes */
1224         c->cleanmarker_size = 16;
1225
1226         /* Initialize write buffer */
1227         init_rwsem(&c->wbuf_sem);
1228         c->wbuf_pagesize = c->mtd->eccsize;
1229         c->wbuf_ofs = 0xFFFFFFFF;
1230
1231         c->wbuf = kmalloc(c->wbuf_pagesize, GFP_KERNEL);
1232         if (!c->wbuf)
1233                 return -ENOMEM;
1234
1235         return 0;
1236 }
1237
1238 void jffs2_nor_ecc_flash_cleanup(struct jffs2_sb_info *c) {
1239         kfree(c->wbuf);
1240 }
1241
1242 int jffs2_nor_wbuf_flash_setup(struct jffs2_sb_info *c) {
1243         /* Cleanmarker currently occupies a whole programming region */
1244         c->cleanmarker_size = MTD_PROGREGION_SIZE(c->mtd);
1245
1246         /* Initialize write buffer */
1247         init_rwsem(&c->wbuf_sem);
1248         c->wbuf_pagesize = MTD_PROGREGION_SIZE(c->mtd);
1249         c->wbuf_ofs = 0xFFFFFFFF;
1250
1251         c->wbuf = kmalloc(c->wbuf_pagesize, GFP_KERNEL);
1252         if (!c->wbuf)
1253                 return -ENOMEM;
1254
1255         return 0;
1256 }
1257
1258 void jffs2_nor_wbuf_flash_cleanup(struct jffs2_sb_info *c) {
1259         kfree(c->wbuf);
1260 }