[PATCH] DVB: Documentation and Kconfig updazes
[linux-2.6/history.git] / fs / jffs2 / scan.c
blob6e59cad2da9c17697fa6ad2a4f5811520598079a
1 /*
2 * JFFS2 -- Journalling Flash File System, Version 2.
4 * Copyright (C) 2001-2003 Red Hat, Inc.
6 * Created by David Woodhouse <dwmw2@redhat.com>
8 * For licensing information, see the file 'LICENCE' in this directory.
10 * $Id: scan.c,v 1.104 2003/10/11 14:52:48 dwmw2 Exp $
13 #include <linux/kernel.h>
14 #include <linux/sched.h>
15 #include <linux/slab.h>
16 #include <linux/mtd/mtd.h>
17 #include <linux/pagemap.h>
18 #include <linux/crc32.h>
19 #include <linux/compiler.h>
20 #include "nodelist.h"
22 #define EMPTY_SCAN_SIZE 1024
24 #define DIRTY_SPACE(x) do { typeof(x) _x = (x); \
25 c->free_size -= _x; c->dirty_size += _x; \
26 jeb->free_size -= _x ; jeb->dirty_size += _x; \
27 }while(0)
28 #define USED_SPACE(x) do { typeof(x) _x = (x); \
29 c->free_size -= _x; c->used_size += _x; \
30 jeb->free_size -= _x ; jeb->used_size += _x; \
31 }while(0)
32 #define UNCHECKED_SPACE(x) do { typeof(x) _x = (x); \
33 c->free_size -= _x; c->unchecked_size += _x; \
34 jeb->free_size -= _x ; jeb->unchecked_size += _x; \
35 }while(0)
37 #define noisy_printk(noise, args...) do { \
38 if (*(noise)) { \
39 printk(KERN_NOTICE args); \
40 (*(noise))--; \
41 if (!(*(noise))) { \
42 printk(KERN_NOTICE "Further such events for this erase block will not be printed\n"); \
43 } \
44 } \
45 } while(0)
47 static uint32_t pseudo_random;
49 static int jffs2_scan_eraseblock (struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb,
50 unsigned char *buf, uint32_t buf_size);
52 /* These helper functions _must_ increase ofs and also do the dirty/used space accounting.
53 * Returning an error will abort the mount - bad checksums etc. should just mark the space
54 * as dirty.
56 static int jffs2_scan_inode_node(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb,
57 struct jffs2_raw_inode *ri, uint32_t ofs);
58 static int jffs2_scan_dirent_node(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb,
59 struct jffs2_raw_dirent *rd, uint32_t ofs);
61 #define BLK_STATE_ALLFF 0
62 #define BLK_STATE_CLEAN 1
63 #define BLK_STATE_PARTDIRTY 2
64 #define BLK_STATE_CLEANMARKER 3
65 #define BLK_STATE_ALLDIRTY 4
66 #define BLK_STATE_BADBLOCK 5
68 static inline int min_free(struct jffs2_sb_info *c)
70 uint32_t min = 2 * sizeof(struct jffs2_raw_inode);
71 #ifdef CONFIG_JFFS2_FS_NAND
72 if (!jffs2_can_mark_obsolete(c) && min < c->wbuf_pagesize)
73 return c->wbuf_pagesize;
74 #endif
75 return min;
78 int jffs2_scan_medium(struct jffs2_sb_info *c)
80 int i, ret;
81 uint32_t empty_blocks = 0, bad_blocks = 0;
82 unsigned char *flashbuf = NULL;
83 uint32_t buf_size = 0;
84 #ifndef __ECOS
85 size_t pointlen;
87 if (c->mtd->point) {
88 ret = c->mtd->point (c->mtd, 0, c->mtd->size, &pointlen, &flashbuf);
89 if (!ret && pointlen < c->mtd->size) {
90 /* Don't muck about if it won't let us point to the whole flash */
91 D1(printk(KERN_DEBUG "MTD point returned len too short: 0x%zx\n", pointlen));
92 c->mtd->unpoint(c->mtd, flashbuf, 0, c->mtd->size);
93 flashbuf = NULL;
95 if (ret)
96 D1(printk(KERN_DEBUG "MTD point failed %d\n", ret));
98 #endif
99 if (!flashbuf) {
100 /* For NAND it's quicker to read a whole eraseblock at a time,
101 apparently */
102 if (jffs2_cleanmarker_oob(c))
103 buf_size = c->sector_size;
104 else
105 buf_size = PAGE_SIZE;
107 D1(printk(KERN_DEBUG "Allocating readbuf of %d bytes\n", buf_size));
108 flashbuf = kmalloc(buf_size, GFP_KERNEL);
109 if (!flashbuf)
110 return -ENOMEM;
113 for (i=0; i<c->nr_blocks; i++) {
114 struct jffs2_eraseblock *jeb = &c->blocks[i];
116 ret = jffs2_scan_eraseblock(c, jeb, buf_size?flashbuf:(flashbuf+jeb->offset), buf_size);
118 if (ret < 0)
119 goto out;
121 ACCT_PARANOIA_CHECK(jeb);
123 /* Now decide which list to put it on */
124 switch(ret) {
125 case BLK_STATE_ALLFF:
127 * Empty block. Since we can't be sure it
128 * was entirely erased, we just queue it for erase
129 * again. It will be marked as such when the erase
130 * is complete. Meanwhile we still count it as empty
131 * for later checks.
133 empty_blocks++;
134 list_add(&jeb->list, &c->erase_pending_list);
135 c->nr_erasing_blocks++;
136 break;
138 case BLK_STATE_CLEANMARKER:
139 /* Only a CLEANMARKER node is valid */
140 if (!jeb->dirty_size) {
141 /* It's actually free */
142 list_add(&jeb->list, &c->free_list);
143 c->nr_free_blocks++;
144 } else {
145 /* Dirt */
146 D1(printk(KERN_DEBUG "Adding all-dirty block at 0x%08x to erase_pending_list\n", jeb->offset));
147 list_add(&jeb->list, &c->erase_pending_list);
148 c->nr_erasing_blocks++;
150 break;
152 case BLK_STATE_CLEAN:
153 /* Full (or almost full) of clean data. Clean list */
154 list_add(&jeb->list, &c->clean_list);
155 break;
157 case BLK_STATE_PARTDIRTY:
158 /* Some data, but not full. Dirty list. */
159 /* Except that we want to remember the block with most free space,
160 and stick it in the 'nextblock' position to start writing to it.
161 Later when we do snapshots, this must be the most recent block,
162 not the one with most free space.
164 if (jeb->free_size > min_free(c) &&
165 (!c->nextblock || c->nextblock->free_size < jeb->free_size)) {
166 /* Better candidate for the next writes to go to */
167 if (c->nextblock) {
168 c->nextblock->dirty_size += c->nextblock->free_size + c->nextblock->wasted_size;
169 c->dirty_size += c->nextblock->free_size + c->nextblock->wasted_size;
170 c->free_size -= c->nextblock->free_size;
171 c->wasted_size -= c->nextblock->wasted_size;
172 c->nextblock->free_size = c->nextblock->wasted_size = 0;
173 if (VERYDIRTY(c, c->nextblock->dirty_size)) {
174 list_add(&c->nextblock->list, &c->very_dirty_list);
175 } else {
176 list_add(&c->nextblock->list, &c->dirty_list);
179 c->nextblock = jeb;
180 } else {
181 jeb->dirty_size += jeb->free_size + jeb->wasted_size;
182 c->dirty_size += jeb->free_size + jeb->wasted_size;
183 c->free_size -= jeb->free_size;
184 c->wasted_size -= jeb->wasted_size;
185 jeb->free_size = jeb->wasted_size = 0;
186 if (VERYDIRTY(c, jeb->dirty_size)) {
187 list_add(&jeb->list, &c->very_dirty_list);
188 } else {
189 list_add(&jeb->list, &c->dirty_list);
192 break;
194 case BLK_STATE_ALLDIRTY:
195 /* Nothing valid - not even a clean marker. Needs erasing. */
196 /* For now we just put it on the erasing list. We'll start the erases later */
197 D1(printk(KERN_NOTICE "JFFS2: Erase block at 0x%08x is not formatted. It will be erased\n", jeb->offset));
198 list_add(&jeb->list, &c->erase_pending_list);
199 c->nr_erasing_blocks++;
200 break;
202 case BLK_STATE_BADBLOCK:
203 D1(printk(KERN_NOTICE "JFFS2: Block at 0x%08x is bad\n", jeb->offset));
204 list_add(&jeb->list, &c->bad_list);
205 c->bad_size += c->sector_size;
206 c->free_size -= c->sector_size;
207 bad_blocks++;
208 break;
209 default:
210 printk(KERN_WARNING "jffs2_scan_medium(): unknown block state\n");
211 BUG();
215 /* Nextblock dirty is always seen as wasted, because we cannot recycle it now */
216 if (c->nextblock && (c->nextblock->dirty_size)) {
217 c->nextblock->wasted_size += c->nextblock->dirty_size;
218 c->wasted_size += c->nextblock->dirty_size;
219 c->dirty_size -= c->nextblock->dirty_size;
220 c->nextblock->dirty_size = 0;
222 #ifdef CONFIG_JFFS2_FS_NAND
223 if (!jffs2_can_mark_obsolete(c) && c->nextblock && (c->nextblock->free_size & (c->wbuf_pagesize-1))) {
224 /* If we're going to start writing into a block which already
225 contains data, and the end of the data isn't page-aligned,
226 skip a little and align it. */
228 uint32_t skip = c->nextblock->free_size & (c->wbuf_pagesize-1);
230 D1(printk(KERN_DEBUG "jffs2_scan_medium(): Skipping %d bytes in nextblock to ensure page alignment\n",
231 skip));
232 c->nextblock->wasted_size += skip;
233 c->wasted_size += skip;
235 c->nextblock->free_size -= skip;
236 c->free_size -= skip;
238 #endif
239 if (c->nr_erasing_blocks) {
240 if ( !c->used_size && ((empty_blocks+bad_blocks)!= c->nr_blocks || bad_blocks == c->nr_blocks) ) {
241 printk(KERN_NOTICE "Cowardly refusing to erase blocks on filesystem with no valid JFFS2 nodes\n");
242 printk(KERN_NOTICE "empty_blocks %d, bad_blocks %d, c->nr_blocks %d\n",empty_blocks,bad_blocks,c->nr_blocks);
243 ret = -EIO;
244 goto out;
246 jffs2_erase_pending_trigger(c);
248 ret = 0;
249 out:
250 if (buf_size)
251 kfree(flashbuf);
252 #ifndef __ECOS
253 else
254 c->mtd->unpoint(c->mtd, flashbuf, 0, c->mtd->size);
255 #endif
256 return ret;
259 static int jffs2_fill_scan_buf (struct jffs2_sb_info *c, unsigned char *buf,
260 uint32_t ofs, uint32_t len)
262 int ret;
263 size_t retlen;
265 ret = jffs2_flash_read(c, ofs, len, &retlen, buf);
266 if (ret) {
267 D1(printk(KERN_WARNING "mtd->read(0x%x bytes from 0x%x) returned %d\n", len, ofs, ret));
268 return ret;
270 if (retlen < len) {
271 D1(printk(KERN_WARNING "Read at 0x%x gave only 0x%zx bytes\n", ofs, retlen));
272 return -EIO;
274 D2(printk(KERN_DEBUG "Read 0x%x bytes from 0x%08x into buf\n", len, ofs));
275 D2(printk(KERN_DEBUG "000: %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x\n",
276 buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], buf[6], buf[7], buf[8], buf[9], buf[10], buf[11], buf[12], buf[13], buf[14], buf[15]));
277 return 0;
280 static int jffs2_scan_eraseblock (struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb,
281 unsigned char *buf, uint32_t buf_size) {
282 struct jffs2_unknown_node *node;
283 struct jffs2_unknown_node crcnode;
284 uint32_t ofs, prevofs;
285 uint32_t hdr_crc, buf_ofs, buf_len;
286 int err;
287 int noise = 0;
288 int wasempty = 0;
289 uint32_t empty_start = 0;
290 #ifdef CONFIG_JFFS2_FS_NAND
291 int cleanmarkerfound = 0;
292 #endif
294 ofs = jeb->offset;
295 prevofs = jeb->offset - 1;
297 D1(printk(KERN_DEBUG "jffs2_scan_eraseblock(): Scanning block at 0x%x\n", ofs));
299 #ifdef CONFIG_JFFS2_FS_NAND
300 if (jffs2_cleanmarker_oob(c)) {
301 int ret = jffs2_check_nand_cleanmarker(c, jeb);
302 D2(printk(KERN_NOTICE "jffs_check_nand_cleanmarker returned %d\n",ret));
303 /* Even if it's not found, we still scan to see
304 if the block is empty. We use this information
305 to decide whether to erase it or not. */
306 switch (ret) {
307 case 0: cleanmarkerfound = 1; break;
308 case 1: break;
309 case 2: return BLK_STATE_BADBLOCK;
310 case 3: return BLK_STATE_ALLDIRTY; /* Block has failed to erase min. once */
311 default: return ret;
314 #endif
315 buf_ofs = jeb->offset;
317 if (!buf_size) {
318 buf_len = c->sector_size;
319 } else {
320 buf_len = EMPTY_SCAN_SIZE;
321 err = jffs2_fill_scan_buf(c, buf, buf_ofs, buf_len);
322 if (err)
323 return err;
326 /* We temporarily use 'ofs' as a pointer into the buffer/jeb */
327 ofs = 0;
329 /* Scan only 4KiB of 0xFF before declaring it's empty */
330 while(ofs < EMPTY_SCAN_SIZE && *(uint32_t *)(&buf[ofs]) == 0xFFFFFFFF)
331 ofs += 4;
333 if (ofs == EMPTY_SCAN_SIZE) {
334 #ifdef CONFIG_JFFS2_FS_NAND
335 if (jffs2_cleanmarker_oob(c)) {
336 /* scan oob, take care of cleanmarker */
337 int ret = jffs2_check_oob_empty(c, jeb, cleanmarkerfound);
338 D2(printk(KERN_NOTICE "jffs2_check_oob_empty returned %d\n",ret));
339 switch (ret) {
340 case 0: return cleanmarkerfound ? BLK_STATE_CLEANMARKER : BLK_STATE_ALLFF;
341 case 1: return BLK_STATE_ALLDIRTY;
342 case 2: return BLK_STATE_BADBLOCK; /* case 2/3 are paranoia checks */
343 case 3: return BLK_STATE_ALLDIRTY; /* Block has failed to erase min. once */
344 default: return ret;
347 #endif
348 D1(printk(KERN_DEBUG "Block at 0x%08x is empty (erased)\n", jeb->offset));
349 return BLK_STATE_ALLFF; /* OK to erase if all blocks are like this */
351 if (ofs) {
352 D1(printk(KERN_DEBUG "Free space at %08x ends at %08x\n", jeb->offset,
353 jeb->offset + ofs));
354 DIRTY_SPACE(ofs);
357 /* Now ofs is a complete physical flash offset as it always was... */
358 ofs += jeb->offset;
360 noise = 10;
362 while(ofs < jeb->offset + c->sector_size) {
364 D1(ACCT_PARANOIA_CHECK(jeb));
366 cond_resched();
368 if (ofs & 3) {
369 printk(KERN_WARNING "Eep. ofs 0x%08x not word-aligned!\n", ofs);
370 ofs = PAD(ofs);
371 continue;
373 if (ofs == prevofs) {
374 printk(KERN_WARNING "ofs 0x%08x has already been seen. Skipping\n", ofs);
375 DIRTY_SPACE(4);
376 ofs += 4;
377 continue;
379 prevofs = ofs;
381 if (jeb->offset + c->sector_size < ofs + sizeof(*node)) {
382 D1(printk(KERN_DEBUG "Fewer than %zd bytes left to end of block. (%x+%x<%x+%zx) Not reading\n", sizeof(struct jffs2_unknown_node),
383 jeb->offset, c->sector_size, ofs, sizeof(*node)));
384 DIRTY_SPACE((jeb->offset + c->sector_size)-ofs);
385 break;
388 if (buf_ofs + buf_len < ofs + sizeof(*node)) {
389 buf_len = min_t(uint32_t, buf_size, jeb->offset + c->sector_size - ofs);
390 D1(printk(KERN_DEBUG "Fewer than %zd bytes (node header) left to end of buf. Reading 0x%x at 0x%08x\n",
391 sizeof(struct jffs2_unknown_node), buf_len, ofs));
392 err = jffs2_fill_scan_buf(c, buf, ofs, buf_len);
393 if (err)
394 return err;
395 buf_ofs = ofs;
398 node = (struct jffs2_unknown_node *)&buf[ofs-buf_ofs];
400 if (*(uint32_t *)(&buf[ofs-buf_ofs]) == 0xffffffff) {
401 uint32_t inbuf_ofs = ofs - buf_ofs + 4;
402 uint32_t scanend;
404 empty_start = ofs;
405 ofs += 4;
407 /* If scanning empty space after only a cleanmarker, don't
408 bother scanning the whole block */
409 if (unlikely(empty_start == jeb->offset + c->cleanmarker_size &&
410 jeb->offset + EMPTY_SCAN_SIZE < buf_ofs + buf_len))
411 scanend = jeb->offset + EMPTY_SCAN_SIZE - buf_ofs;
412 else
413 scanend = buf_len;
415 D1(printk(KERN_DEBUG "Found empty flash at 0x%08x\n", ofs));
416 while (inbuf_ofs < scanend) {
417 if (*(uint32_t *)(&buf[inbuf_ofs]) != 0xffffffff)
418 goto emptyends;
420 inbuf_ofs+=4;
421 ofs += 4;
423 /* Ran off end. */
424 D1(printk(KERN_DEBUG "Empty flash ends normally at 0x%08x\n", ofs));
426 if (buf_ofs == jeb->offset && jeb->used_size == PAD(c->cleanmarker_size) &&
427 c->cleanmarker_size && !jeb->first_node->next_in_ino && !jeb->dirty_size)
428 return BLK_STATE_CLEANMARKER;
429 wasempty = 1;
430 continue;
431 } else if (wasempty) {
432 emptyends:
433 printk(KERN_WARNING "Empty flash at 0x%08x ends at 0x%08x\n", empty_start, ofs);
434 DIRTY_SPACE(ofs-empty_start);
435 wasempty = 0;
436 continue;
439 if (ofs == jeb->offset && je16_to_cpu(node->magic) == KSAMTIB_CIGAM_2SFFJ) {
440 printk(KERN_WARNING "Magic bitmask is backwards at offset 0x%08x. Wrong endian filesystem?\n", ofs);
441 DIRTY_SPACE(4);
442 ofs += 4;
443 continue;
445 if (je16_to_cpu(node->magic) == JFFS2_DIRTY_BITMASK) {
446 D1(printk(KERN_DEBUG "Dirty bitmask at 0x%08x\n", ofs));
447 DIRTY_SPACE(4);
448 ofs += 4;
449 continue;
451 if (je16_to_cpu(node->magic) == JFFS2_OLD_MAGIC_BITMASK) {
452 printk(KERN_WARNING "Old JFFS2 bitmask found at 0x%08x\n", ofs);
453 printk(KERN_WARNING "You cannot use older JFFS2 filesystems with newer kernels\n");
454 DIRTY_SPACE(4);
455 ofs += 4;
456 continue;
458 if (je16_to_cpu(node->magic) != JFFS2_MAGIC_BITMASK) {
459 /* OK. We're out of possibilities. Whinge and move on */
460 noisy_printk(&noise, "jffs2_scan_eraseblock(): Magic bitmask 0x%04x not found at 0x%08x: 0x%04x instead\n",
461 JFFS2_MAGIC_BITMASK, ofs,
462 je16_to_cpu(node->magic));
463 DIRTY_SPACE(4);
464 ofs += 4;
465 continue;
467 /* We seem to have a node of sorts. Check the CRC */
468 crcnode.magic = node->magic;
469 crcnode.nodetype = cpu_to_je16( je16_to_cpu(node->nodetype) | JFFS2_NODE_ACCURATE);
470 crcnode.totlen = node->totlen;
471 hdr_crc = crc32(0, &crcnode, sizeof(crcnode)-4);
473 if (hdr_crc != je32_to_cpu(node->hdr_crc)) {
474 noisy_printk(&noise, "jffs2_scan_eraseblock(): Node at 0x%08x {0x%04x, 0x%04x, 0x%08x) has invalid CRC 0x%08x (calculated 0x%08x)\n",
475 ofs, je16_to_cpu(node->magic),
476 je16_to_cpu(node->nodetype),
477 je32_to_cpu(node->totlen),
478 je32_to_cpu(node->hdr_crc),
479 hdr_crc);
480 DIRTY_SPACE(4);
481 ofs += 4;
482 continue;
485 if (ofs + je32_to_cpu(node->totlen) >
486 jeb->offset + c->sector_size) {
487 /* Eep. Node goes over the end of the erase block. */
488 printk(KERN_WARNING "Node at 0x%08x with length 0x%08x would run over the end of the erase block\n",
489 ofs, je32_to_cpu(node->totlen));
490 printk(KERN_WARNING "Perhaps the file system was created with the wrong erase size?\n");
491 DIRTY_SPACE(4);
492 ofs += 4;
493 continue;
496 if (!(je16_to_cpu(node->nodetype) & JFFS2_NODE_ACCURATE)) {
497 /* Wheee. This is an obsoleted node */
498 D2(printk(KERN_DEBUG "Node at 0x%08x is obsolete. Skipping\n", ofs));
499 DIRTY_SPACE(PAD(je32_to_cpu(node->totlen)));
500 ofs += PAD(je32_to_cpu(node->totlen));
501 continue;
504 switch(je16_to_cpu(node->nodetype)) {
505 case JFFS2_NODETYPE_INODE:
506 if (buf_ofs + buf_len < ofs + sizeof(struct jffs2_raw_inode)) {
507 buf_len = min_t(uint32_t, buf_size, jeb->offset + c->sector_size - ofs);
508 D1(printk(KERN_DEBUG "Fewer than %zd bytes (inode node) left to end of buf. Reading 0x%x at 0x%08x\n",
509 sizeof(struct jffs2_raw_inode), buf_len, ofs));
510 err = jffs2_fill_scan_buf(c, buf, ofs, buf_len);
511 if (err)
512 return err;
513 buf_ofs = ofs;
514 node = (void *)buf;
516 err = jffs2_scan_inode_node(c, jeb, (void *)node, ofs);
517 if (err) return err;
518 ofs += PAD(je32_to_cpu(node->totlen));
519 break;
521 case JFFS2_NODETYPE_DIRENT:
522 if (buf_ofs + buf_len < ofs + je32_to_cpu(node->totlen)) {
523 buf_len = min_t(uint32_t, buf_size, jeb->offset + c->sector_size - ofs);
524 D1(printk(KERN_DEBUG "Fewer than %d bytes (dirent node) left to end of buf. Reading 0x%x at 0x%08x\n",
525 je32_to_cpu(node->totlen), buf_len, ofs));
526 err = jffs2_fill_scan_buf(c, buf, ofs, buf_len);
527 if (err)
528 return err;
529 buf_ofs = ofs;
530 node = (void *)buf;
532 err = jffs2_scan_dirent_node(c, jeb, (void *)node, ofs);
533 if (err) return err;
534 ofs += PAD(je32_to_cpu(node->totlen));
535 break;
537 case JFFS2_NODETYPE_CLEANMARKER:
538 D1(printk(KERN_DEBUG "CLEANMARKER node found at 0x%08x\n", ofs));
539 if (je32_to_cpu(node->totlen) != c->cleanmarker_size) {
540 printk(KERN_NOTICE "CLEANMARKER node found at 0x%08x has totlen 0x%x != normal 0x%x\n",
541 ofs, je32_to_cpu(node->totlen), c->cleanmarker_size);
542 DIRTY_SPACE(PAD(sizeof(struct jffs2_unknown_node)));
543 ofs += PAD(sizeof(struct jffs2_unknown_node));
544 } else if (jeb->first_node) {
545 printk(KERN_NOTICE "CLEANMARKER node found at 0x%08x, not first node in block (0x%08x)\n", ofs, jeb->offset);
546 DIRTY_SPACE(PAD(sizeof(struct jffs2_unknown_node)));
547 ofs += PAD(sizeof(struct jffs2_unknown_node));
548 } else {
549 struct jffs2_raw_node_ref *marker_ref = jffs2_alloc_raw_node_ref();
550 if (!marker_ref) {
551 printk(KERN_NOTICE "Failed to allocate node ref for clean marker\n");
552 return -ENOMEM;
554 marker_ref->next_in_ino = NULL;
555 marker_ref->next_phys = NULL;
556 marker_ref->flash_offset = ofs | REF_NORMAL;
557 marker_ref->totlen = c->cleanmarker_size;
558 jeb->first_node = jeb->last_node = marker_ref;
560 USED_SPACE(PAD(c->cleanmarker_size));
561 ofs += PAD(c->cleanmarker_size);
563 break;
565 case JFFS2_NODETYPE_PADDING:
566 DIRTY_SPACE(PAD(je32_to_cpu(node->totlen)));
567 ofs += PAD(je32_to_cpu(node->totlen));
568 break;
570 default:
571 switch (je16_to_cpu(node->nodetype) & JFFS2_COMPAT_MASK) {
572 case JFFS2_FEATURE_ROCOMPAT:
573 printk(KERN_NOTICE "Read-only compatible feature node (0x%04x) found at offset 0x%08x\n", je16_to_cpu(node->nodetype), ofs);
574 c->flags |= JFFS2_SB_FLAG_RO;
575 if (!(jffs2_is_readonly(c)))
576 return -EROFS;
577 DIRTY_SPACE(PAD(je32_to_cpu(node->totlen)));
578 ofs += PAD(je32_to_cpu(node->totlen));
579 break;
581 case JFFS2_FEATURE_INCOMPAT:
582 printk(KERN_NOTICE "Incompatible feature node (0x%04x) found at offset 0x%08x\n", je16_to_cpu(node->nodetype), ofs);
583 return -EINVAL;
585 case JFFS2_FEATURE_RWCOMPAT_DELETE:
586 D1(printk(KERN_NOTICE "Unknown but compatible feature node (0x%04x) found at offset 0x%08x\n", je16_to_cpu(node->nodetype), ofs));
587 DIRTY_SPACE(PAD(je32_to_cpu(node->totlen)));
588 ofs += PAD(je32_to_cpu(node->totlen));
589 break;
591 case JFFS2_FEATURE_RWCOMPAT_COPY:
592 D1(printk(KERN_NOTICE "Unknown but compatible feature node (0x%04x) found at offset 0x%08x\n", je16_to_cpu(node->nodetype), ofs));
593 USED_SPACE(PAD(je32_to_cpu(node->totlen)));
594 ofs += PAD(je32_to_cpu(node->totlen));
595 break;
601 D1(printk(KERN_DEBUG "Block at 0x%08x: free 0x%08x, dirty 0x%08x, unchecked 0x%08x, used 0x%08x\n", jeb->offset,
602 jeb->free_size, jeb->dirty_size, jeb->unchecked_size, jeb->used_size));
604 /* mark_node_obsolete can add to wasted !! */
605 if (jeb->wasted_size) {
606 jeb->dirty_size += jeb->wasted_size;
607 c->dirty_size += jeb->wasted_size;
608 c->wasted_size -= jeb->wasted_size;
609 jeb->wasted_size = 0;
612 if ((jeb->used_size + jeb->unchecked_size) == PAD(c->cleanmarker_size) && !jeb->dirty_size
613 && (!jeb->first_node || jeb->first_node->next_in_ino) )
614 return BLK_STATE_CLEANMARKER;
616 /* move blocks with max 4 byte dirty space to cleanlist */
617 else if (!ISDIRTY(c->sector_size - (jeb->used_size + jeb->unchecked_size))) {
618 c->dirty_size -= jeb->dirty_size;
619 c->wasted_size += jeb->dirty_size;
620 jeb->wasted_size += jeb->dirty_size;
621 jeb->dirty_size = 0;
622 return BLK_STATE_CLEAN;
623 } else if (jeb->used_size || jeb->unchecked_size)
624 return BLK_STATE_PARTDIRTY;
625 else
626 return BLK_STATE_ALLDIRTY;
629 static struct jffs2_inode_cache *jffs2_scan_make_ino_cache(struct jffs2_sb_info *c, uint32_t ino)
631 struct jffs2_inode_cache *ic;
633 ic = jffs2_get_ino_cache(c, ino);
634 if (ic)
635 return ic;
637 ic = jffs2_alloc_inode_cache();
638 if (!ic) {
639 printk(KERN_NOTICE "jffs2_scan_make_inode_cache(): allocation of inode cache failed\n");
640 return NULL;
642 memset(ic, 0, sizeof(*ic));
644 ic->ino = ino;
645 ic->nodes = (void *)ic;
646 jffs2_add_ino_cache(c, ic);
647 if (ino == 1)
648 ic->nlink=1;
649 return ic;
652 static int jffs2_scan_inode_node(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb,
653 struct jffs2_raw_inode *ri, uint32_t ofs)
655 struct jffs2_raw_node_ref *raw;
656 struct jffs2_inode_cache *ic;
657 uint32_t ino = je32_to_cpu(ri->ino);
659 D1(printk(KERN_DEBUG "jffs2_scan_inode_node(): Node at 0x%08x\n", ofs));
661 /* We do very little here now. Just check the ino# to which we should attribute
662 this node; we can do all the CRC checking etc. later. There's a tradeoff here --
663 we used to scan the flash once only, reading everything we want from it into
664 memory, then building all our in-core data structures and freeing the extra
665 information. Now we allow the first part of the mount to complete a lot quicker,
666 but we have to go _back_ to the flash in order to finish the CRC checking, etc.
667 Which means that the _full_ amount of time to get to proper write mode with GC
668 operational may actually be _longer_ than before. Sucks to be me. */
670 raw = jffs2_alloc_raw_node_ref();
671 if (!raw) {
672 printk(KERN_NOTICE "jffs2_scan_inode_node(): allocation of node reference failed\n");
673 return -ENOMEM;
676 ic = jffs2_get_ino_cache(c, ino);
677 if (!ic) {
678 /* Inocache get failed. Either we read a bogus ino# or it's just genuinely the
679 first node we found for this inode. Do a CRC check to protect against the former
680 case */
681 uint32_t crc = crc32(0, ri, sizeof(*ri)-8);
683 if (crc != je32_to_cpu(ri->node_crc)) {
684 printk(KERN_NOTICE "jffs2_scan_inode_node(): CRC failed on node at 0x%08x: Read 0x%08x, calculated 0x%08x\n",
685 ofs, je32_to_cpu(ri->node_crc), crc);
686 /* We believe totlen because the CRC on the node _header_ was OK, just the node itself failed. */
687 DIRTY_SPACE(PAD(je32_to_cpu(ri->totlen)));
688 jffs2_free_raw_node_ref(raw);
689 return 0;
691 ic = jffs2_scan_make_ino_cache(c, ino);
692 if (!ic) {
693 jffs2_free_raw_node_ref(raw);
694 return -ENOMEM;
698 /* Wheee. It worked */
700 raw->flash_offset = ofs | REF_UNCHECKED;
701 raw->totlen = PAD(je32_to_cpu(ri->totlen));
702 raw->next_phys = NULL;
703 raw->next_in_ino = ic->nodes;
705 ic->nodes = raw;
706 if (!jeb->first_node)
707 jeb->first_node = raw;
708 if (jeb->last_node)
709 jeb->last_node->next_phys = raw;
710 jeb->last_node = raw;
712 D1(printk(KERN_DEBUG "Node is ino #%u, version %d. Range 0x%x-0x%x\n",
713 je32_to_cpu(ri->ino), je32_to_cpu(ri->version),
714 je32_to_cpu(ri->offset),
715 je32_to_cpu(ri->offset)+je32_to_cpu(ri->dsize)));
717 pseudo_random += je32_to_cpu(ri->version);
719 UNCHECKED_SPACE(PAD(je32_to_cpu(ri->totlen)));
720 return 0;
723 static int jffs2_scan_dirent_node(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb,
724 struct jffs2_raw_dirent *rd, uint32_t ofs)
726 struct jffs2_raw_node_ref *raw;
727 struct jffs2_full_dirent *fd;
728 struct jffs2_inode_cache *ic;
729 uint32_t crc;
731 D1(printk(KERN_DEBUG "jffs2_scan_dirent_node(): Node at 0x%08x\n", ofs));
733 /* We don't get here unless the node is still valid, so we don't have to
734 mask in the ACCURATE bit any more. */
735 crc = crc32(0, rd, sizeof(*rd)-8);
737 if (crc != je32_to_cpu(rd->node_crc)) {
738 printk(KERN_NOTICE "jffs2_scan_dirent_node(): Node CRC failed on node at 0x%08x: Read 0x%08x, calculated 0x%08x\n",
739 ofs, je32_to_cpu(rd->node_crc), crc);
740 /* We believe totlen because the CRC on the node _header_ was OK, just the node itself failed. */
741 DIRTY_SPACE(PAD(je32_to_cpu(rd->totlen)));
742 return 0;
745 pseudo_random += je32_to_cpu(rd->version);
747 fd = jffs2_alloc_full_dirent(rd->nsize+1);
748 if (!fd) {
749 return -ENOMEM;
751 memcpy(&fd->name, rd->name, rd->nsize);
752 fd->name[rd->nsize] = 0;
754 crc = crc32(0, fd->name, rd->nsize);
755 if (crc != je32_to_cpu(rd->name_crc)) {
756 printk(KERN_NOTICE "jffs2_scan_dirent_node(): Name CRC failed on node at 0x%08x: Read 0x%08x, calculated 0x%08x\n",
757 ofs, je32_to_cpu(rd->name_crc), crc);
758 D1(printk(KERN_NOTICE "Name for which CRC failed is (now) '%s', ino #%d\n", fd->name, je32_to_cpu(rd->ino)));
759 jffs2_free_full_dirent(fd);
760 /* FIXME: Why do we believe totlen? */
761 /* We believe totlen because the CRC on the node _header_ was OK, just the name failed. */
762 DIRTY_SPACE(PAD(je32_to_cpu(rd->totlen)));
763 return 0;
765 raw = jffs2_alloc_raw_node_ref();
766 if (!raw) {
767 jffs2_free_full_dirent(fd);
768 printk(KERN_NOTICE "jffs2_scan_dirent_node(): allocation of node reference failed\n");
769 return -ENOMEM;
771 ic = jffs2_scan_make_ino_cache(c, je32_to_cpu(rd->pino));
772 if (!ic) {
773 jffs2_free_full_dirent(fd);
774 jffs2_free_raw_node_ref(raw);
775 return -ENOMEM;
778 raw->totlen = PAD(je32_to_cpu(rd->totlen));
779 raw->flash_offset = ofs | REF_PRISTINE;
780 raw->next_phys = NULL;
781 raw->next_in_ino = ic->nodes;
782 ic->nodes = raw;
783 if (!jeb->first_node)
784 jeb->first_node = raw;
785 if (jeb->last_node)
786 jeb->last_node->next_phys = raw;
787 jeb->last_node = raw;
789 fd->raw = raw;
790 fd->next = NULL;
791 fd->version = je32_to_cpu(rd->version);
792 fd->ino = je32_to_cpu(rd->ino);
793 fd->nhash = full_name_hash(fd->name, rd->nsize);
794 fd->type = rd->type;
795 USED_SPACE(PAD(je32_to_cpu(rd->totlen)));
796 jffs2_add_fd_to_list(c, fd, &ic->scan_dents);
798 return 0;
801 static int count_list(struct list_head *l)
803 uint32_t count = 0;
804 struct list_head *tmp;
806 list_for_each(tmp, l) {
807 count++;
809 return count;
812 /* Note: This breaks if list_empty(head). I don't care. You
813 might, if you copy this code and use it elsewhere :) */
814 static void rotate_list(struct list_head *head, uint32_t count)
816 struct list_head *n = head->next;
818 list_del(head);
819 while(count--) {
820 n = n->next;
822 list_add(head, n);
825 void jffs2_rotate_lists(struct jffs2_sb_info *c)
827 uint32_t x;
828 uint32_t rotateby;
830 x = count_list(&c->clean_list);
831 if (x) {
832 rotateby = pseudo_random % x;
833 D1(printk(KERN_DEBUG "Rotating clean_list by %d\n", rotateby));
835 rotate_list((&c->clean_list), rotateby);
837 D1(printk(KERN_DEBUG "Erase block at front of clean_list is at %08x\n",
838 list_entry(c->clean_list.next, struct jffs2_eraseblock, list)->offset));
839 } else {
840 D1(printk(KERN_DEBUG "Not rotating empty clean_list\n"));
843 x = count_list(&c->very_dirty_list);
844 if (x) {
845 rotateby = pseudo_random % x;
846 D1(printk(KERN_DEBUG "Rotating very_dirty_list by %d\n", rotateby));
848 rotate_list((&c->very_dirty_list), rotateby);
850 D1(printk(KERN_DEBUG "Erase block at front of very_dirty_list is at %08x\n",
851 list_entry(c->very_dirty_list.next, struct jffs2_eraseblock, list)->offset));
852 } else {
853 D1(printk(KERN_DEBUG "Not rotating empty very_dirty_list\n"));
856 x = count_list(&c->dirty_list);
857 if (x) {
858 rotateby = pseudo_random % x;
859 D1(printk(KERN_DEBUG "Rotating dirty_list by %d\n", rotateby));
861 rotate_list((&c->dirty_list), rotateby);
863 D1(printk(KERN_DEBUG "Erase block at front of dirty_list is at %08x\n",
864 list_entry(c->dirty_list.next, struct jffs2_eraseblock, list)->offset));
865 } else {
866 D1(printk(KERN_DEBUG "Not rotating empty dirty_list\n"));
869 x = count_list(&c->erasable_list);
870 if (x) {
871 rotateby = pseudo_random % x;
872 D1(printk(KERN_DEBUG "Rotating erasable_list by %d\n", rotateby));
874 rotate_list((&c->erasable_list), rotateby);
876 D1(printk(KERN_DEBUG "Erase block at front of erasable_list is at %08x\n",
877 list_entry(c->erasable_list.next, struct jffs2_eraseblock, list)->offset));
878 } else {
879 D1(printk(KERN_DEBUG "Not rotating empty erasable_list\n"));
882 if (c->nr_erasing_blocks) {
883 rotateby = pseudo_random % c->nr_erasing_blocks;
884 D1(printk(KERN_DEBUG "Rotating erase_pending_list by %d\n", rotateby));
886 rotate_list((&c->erase_pending_list), rotateby);
888 D1(printk(KERN_DEBUG "Erase block at front of erase_pending_list is at %08x\n",
889 list_entry(c->erase_pending_list.next, struct jffs2_eraseblock, list)->offset));
890 } else {
891 D1(printk(KERN_DEBUG "Not rotating empty erase_pending_list\n"));
894 if (c->nr_free_blocks) {
895 rotateby = pseudo_random % c->nr_free_blocks;
896 D1(printk(KERN_DEBUG "Rotating free_list by %d\n", rotateby));
898 rotate_list((&c->free_list), rotateby);
900 D1(printk(KERN_DEBUG "Erase block at front of free_list is at %08x\n",
901 list_entry(c->free_list.next, struct jffs2_eraseblock, list)->offset));
902 } else {
903 D1(printk(KERN_DEBUG "Not rotating empty free_list\n"));