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