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