scan.c 35.1 KB
Newer Older
L
Linus Torvalds 已提交
1 2 3
/*
 * JFFS2 -- Journalling Flash File System, Version 2.
 *
4
 * Copyright © 2001-2007 Red Hat, Inc.
L
Linus Torvalds 已提交
5 6 7 8 9 10
 *
 * Created by David Woodhouse <dwmw2@infradead.org>
 *
 * For licensing information, see the file 'LICENCE' in this directory.
 *
 */
11

12 13
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt

L
Linus Torvalds 已提交
14 15 16 17 18 19 20 21
#include <linux/kernel.h>
#include <linux/sched.h>
#include <linux/slab.h>
#include <linux/mtd/mtd.h>
#include <linux/pagemap.h>
#include <linux/crc32.h>
#include <linux/compiler.h>
#include "nodelist.h"
22 23
#include "summary.h"
#include "debug.h"
L
Linus Torvalds 已提交
24

25
#define DEFAULT_EMPTY_SCAN_SIZE 256
L
Linus Torvalds 已提交
26

27 28 29 30 31 32 33 34 35
#define noisy_printk(noise, fmt, ...)					\
do {									\
	if (*(noise)) {							\
		pr_notice(fmt, ##__VA_ARGS__);				\
		(*(noise))--;						\
		if (!(*(noise)))					\
			pr_notice("Further such events for this erase block will not be printed\n"); \
	}								\
} while (0)
L
Linus Torvalds 已提交
36 37 38 39

static uint32_t pseudo_random;

static int jffs2_scan_eraseblock (struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb,
40
				  unsigned char *buf, uint32_t buf_size, struct jffs2_summary *s);
L
Linus Torvalds 已提交
41

42
/* These helper functions _must_ increase ofs and also do the dirty/used space accounting.
L
Linus Torvalds 已提交
43 44 45
 * Returning an error will abort the mount - bad checksums etc. should just mark the space
 * as dirty.
 */
46
static int jffs2_scan_inode_node(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb,
47
				 struct jffs2_raw_inode *ri, uint32_t ofs, struct jffs2_summary *s);
L
Linus Torvalds 已提交
48
static int jffs2_scan_dirent_node(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb,
49
				 struct jffs2_raw_dirent *rd, uint32_t ofs, struct jffs2_summary *s);
L
Linus Torvalds 已提交
50 51 52 53

static inline int min_free(struct jffs2_sb_info *c)
{
	uint32_t min = 2 * sizeof(struct jffs2_raw_inode);
54
#ifdef CONFIG_JFFS2_FS_WRITEBUFFER
L
Linus Torvalds 已提交
55 56 57 58 59 60
	if (!jffs2_can_mark_obsolete(c) && min < c->wbuf_pagesize)
		return c->wbuf_pagesize;
#endif
	return min;

}
61 62 63 64 65 66 67 68

static inline uint32_t EMPTY_SCAN_SIZE(uint32_t sector_size) {
	if (sector_size < DEFAULT_EMPTY_SCAN_SIZE)
		return sector_size;
	else
		return DEFAULT_EMPTY_SCAN_SIZE;
}

69 70
static int file_dirty(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb)
{
71 72 73 74 75
	int ret;

	if ((ret = jffs2_prealloc_raw_node_refs(c, jeb, 1)))
		return ret;
	if ((ret = jffs2_scan_dirty_space(c, jeb, jeb->free_size)))
76 77 78 79 80 81 82 83 84 85 86 87 88 89 90
		return ret;
	/* Turned wasted size into dirty, since we apparently 
	   think it's recoverable now. */
	jeb->dirty_size += jeb->wasted_size;
	c->dirty_size += jeb->wasted_size;
	c->wasted_size -= jeb->wasted_size;
	jeb->wasted_size = 0;
	if (VERYDIRTY(c, jeb->dirty_size)) {
		list_add(&jeb->list, &c->very_dirty_list);
	} else {
		list_add(&jeb->list, &c->dirty_list);
	}
	return 0;
}

L
Linus Torvalds 已提交
91 92 93 94 95 96
int jffs2_scan_medium(struct jffs2_sb_info *c)
{
	int i, ret;
	uint32_t empty_blocks = 0, bad_blocks = 0;
	unsigned char *flashbuf = NULL;
	uint32_t buf_size = 0;
97
	struct jffs2_summary *s = NULL; /* summary info collected by the scan process */
L
Linus Torvalds 已提交
98
#ifndef __ECOS
99
	size_t pointlen, try_size;
L
Linus Torvalds 已提交
100

101 102 103 104
	ret = mtd_point(c->mtd, 0, c->mtd->size, &pointlen,
			(void **)&flashbuf, NULL);
	if (!ret && pointlen < c->mtd->size) {
		/* Don't muck about if it won't let us point to the whole flash */
105 106
		jffs2_dbg(1, "MTD point returned len too short: 0x%zx\n",
			  pointlen);
107 108
		mtd_unpoint(c->mtd, 0, pointlen);
		flashbuf = NULL;
L
Linus Torvalds 已提交
109
	}
110
	if (ret && ret != -EOPNOTSUPP)
111
		jffs2_dbg(1, "MTD point failed %d\n", ret);
L
Linus Torvalds 已提交
112 113 114 115 116
#endif
	if (!flashbuf) {
		/* For NAND it's quicker to read a whole eraseblock at a time,
		   apparently */
		if (jffs2_cleanmarker_oob(c))
117
			try_size = c->sector_size;
L
Linus Torvalds 已提交
118
		else
119
			try_size = PAGE_SIZE;
L
Linus Torvalds 已提交
120

121 122
		jffs2_dbg(1, "Trying to allocate readbuf of %zu "
			  "bytes\n", try_size);
L
Linus Torvalds 已提交
123

124
		flashbuf = mtd_kmalloc_up_to(c->mtd, &try_size);
L
Linus Torvalds 已提交
125 126
		if (!flashbuf)
			return -ENOMEM;
127

128 129
		jffs2_dbg(1, "Allocated readbuf of %zu bytes\n",
			  try_size);
130 131

		buf_size = (uint32_t)try_size;
L
Linus Torvalds 已提交
132 133
	}

134
	if (jffs2_sum_active()) {
135
		s = kzalloc(sizeof(struct jffs2_summary), GFP_KERNEL);
136 137
		if (!s) {
			JFFS2_WARNING("Can't allocate memory for summary\n");
138 139
			ret = -ENOMEM;
			goto out;
140 141 142
		}
	}

L
Linus Torvalds 已提交
143 144 145
	for (i=0; i<c->nr_blocks; i++) {
		struct jffs2_eraseblock *jeb = &c->blocks[i];

A
Artem Bityutskiy 已提交
146 147
		cond_resched();

148 149 150 151 152
		/* reset summary info for next eraseblock scan */
		jffs2_sum_reset_collected(s);

		ret = jffs2_scan_eraseblock(c, jeb, buf_size?flashbuf:(flashbuf+jeb->offset),
						buf_size, s);
L
Linus Torvalds 已提交
153 154 155 156

		if (ret < 0)
			goto out;

157
		jffs2_dbg_acct_paranoia_check_nolock(c, jeb);
L
Linus Torvalds 已提交
158 159 160 161

		/* Now decide which list to put it on */
		switch(ret) {
		case BLK_STATE_ALLFF:
162 163
			/*
			 * Empty block.   Since we can't be sure it
L
Linus Torvalds 已提交
164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181
			 * was entirely erased, we just queue it for erase
			 * again.  It will be marked as such when the erase
			 * is complete.  Meanwhile we still count it as empty
			 * for later checks.
			 */
			empty_blocks++;
			list_add(&jeb->list, &c->erase_pending_list);
			c->nr_erasing_blocks++;
			break;

		case BLK_STATE_CLEANMARKER:
			/* Only a CLEANMARKER node is valid */
			if (!jeb->dirty_size) {
				/* It's actually free */
				list_add(&jeb->list, &c->free_list);
				c->nr_free_blocks++;
			} else {
				/* Dirt */
182 183
				jffs2_dbg(1, "Adding all-dirty block at 0x%08x to erase_pending_list\n",
					  jeb->offset);
L
Linus Torvalds 已提交
184 185 186 187 188 189
				list_add(&jeb->list, &c->erase_pending_list);
				c->nr_erasing_blocks++;
			}
			break;

		case BLK_STATE_CLEAN:
190 191
			/* Full (or almost full) of clean data. Clean list */
			list_add(&jeb->list, &c->clean_list);
L
Linus Torvalds 已提交
192 193 194
			break;

		case BLK_STATE_PARTDIRTY:
195 196 197 198 199 200 201
			/* Some data, but not full. Dirty list. */
			/* We want to remember the block with most free space
			and stick it in the 'nextblock' position to start writing to it. */
			if (jeb->free_size > min_free(c) &&
					(!c->nextblock || c->nextblock->free_size < jeb->free_size)) {
				/* Better candidate for the next writes to go to */
				if (c->nextblock) {
202 203
					ret = file_dirty(c, c->nextblock);
					if (ret)
204
						goto out;
205 206
					/* deleting summary information of the old nextblock */
					jffs2_sum_reset_collected(c->summary);
L
Linus Torvalds 已提交
207
				}
208
				/* update collected summary information for the current nextblock */
209
				jffs2_sum_move_collected(c, s);
210 211
				jffs2_dbg(1, "%s(): new nextblock = 0x%08x\n",
					  __func__, jeb->offset);
212 213
				c->nextblock = jeb;
			} else {
214 215
				ret = file_dirty(c, jeb);
				if (ret)
216
					goto out;
217
			}
L
Linus Torvalds 已提交
218 219 220 221
			break;

		case BLK_STATE_ALLDIRTY:
			/* Nothing valid - not even a clean marker. Needs erasing. */
222
			/* For now we just put it on the erasing list. We'll start the erases later */
223
			jffs2_dbg(1, "Erase block at 0x%08x is not formatted. It will be erased\n",
224
				  jeb->offset);
225
			list_add(&jeb->list, &c->erase_pending_list);
L
Linus Torvalds 已提交
226 227
			c->nr_erasing_blocks++;
			break;
228

L
Linus Torvalds 已提交
229
		case BLK_STATE_BADBLOCK:
230
			jffs2_dbg(1, "Block at 0x%08x is bad\n", jeb->offset);
231
			list_add(&jeb->list, &c->bad_list);
L
Linus Torvalds 已提交
232 233 234 235 236
			c->bad_size += c->sector_size;
			c->free_size -= c->sector_size;
			bad_blocks++;
			break;
		default:
237
			pr_warn("%s(): unknown block state\n", __func__);
238
			BUG();
L
Linus Torvalds 已提交
239 240
		}
	}
241

L
Linus Torvalds 已提交
242 243 244 245 246 247 248
	/* Nextblock dirty is always seen as wasted, because we cannot recycle it now */
	if (c->nextblock && (c->nextblock->dirty_size)) {
		c->nextblock->wasted_size += c->nextblock->dirty_size;
		c->wasted_size += c->nextblock->dirty_size;
		c->dirty_size -= c->nextblock->dirty_size;
		c->nextblock->dirty_size = 0;
	}
249
#ifdef CONFIG_JFFS2_FS_WRITEBUFFER
250
	if (!jffs2_can_mark_obsolete(c) && c->wbuf_pagesize && c->nextblock && (c->nextblock->free_size % c->wbuf_pagesize)) {
251
		/* If we're going to start writing into a block which already
L
Linus Torvalds 已提交
252 253 254
		   contains data, and the end of the data isn't page-aligned,
		   skip a little and align it. */

255
		uint32_t skip = c->nextblock->free_size % c->wbuf_pagesize;
L
Linus Torvalds 已提交
256

257 258
		jffs2_dbg(1, "%s(): Skipping %d bytes in nextblock to ensure page alignment\n",
			  __func__, skip);
259
		jffs2_prealloc_raw_node_refs(c, c->nextblock, 1);
260
		jffs2_scan_dirty_space(c, c->nextblock, skip);
L
Linus Torvalds 已提交
261 262 263
	}
#endif
	if (c->nr_erasing_blocks) {
264
		if ( !c->used_size && ((c->nr_free_blocks+empty_blocks+bad_blocks)!= c->nr_blocks || bad_blocks == c->nr_blocks) ) {
265 266 267
			pr_notice("Cowardly refusing to erase blocks on filesystem with no valid JFFS2 nodes\n");
			pr_notice("empty_blocks %d, bad_blocks %d, c->nr_blocks %d\n",
				  empty_blocks, bad_blocks, c->nr_blocks);
L
Linus Torvalds 已提交
268 269 270
			ret = -EIO;
			goto out;
		}
271 272 273
		spin_lock(&c->erase_completion_lock);
		jffs2_garbage_collect_trigger(c);
		spin_unlock(&c->erase_completion_lock);
L
Linus Torvalds 已提交
274 275 276 277 278 279
	}
	ret = 0;
 out:
	if (buf_size)
		kfree(flashbuf);
#ifndef __ECOS
280
	else
281
		mtd_unpoint(c->mtd, 0, c->mtd->size);
L
Linus Torvalds 已提交
282
#endif
283
	kfree(s);
L
Linus Torvalds 已提交
284 285 286
	return ret;
}

A
Adrian Bunk 已提交
287 288
static int jffs2_fill_scan_buf(struct jffs2_sb_info *c, void *buf,
			       uint32_t ofs, uint32_t len)
L
Linus Torvalds 已提交
289 290 291 292 293 294
{
	int ret;
	size_t retlen;

	ret = jffs2_flash_read(c, ofs, len, &retlen, buf);
	if (ret) {
295 296
		jffs2_dbg(1, "mtd->read(0x%x bytes from 0x%x) returned %d\n",
			  len, ofs, ret);
L
Linus Torvalds 已提交
297 298 299
		return ret;
	}
	if (retlen < len) {
300 301
		jffs2_dbg(1, "Read at 0x%x gave only 0x%zx bytes\n",
			  ofs, retlen);
L
Linus Torvalds 已提交
302 303 304 305 306
		return -EIO;
	}
	return 0;
}

307 308 309
int jffs2_scan_classify_jeb(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb)
{
	if ((jeb->used_size + jeb->unchecked_size) == PAD(c->cleanmarker_size) && !jeb->dirty_size
310
	    && (!jeb->first_node || !ref_next(jeb->first_node)) )
311 312 313 314 315 316 317 318 319 320 321 322 323 324 325
		return BLK_STATE_CLEANMARKER;

	/* move blocks with max 4 byte dirty space to cleanlist */
	else if (!ISDIRTY(c->sector_size - (jeb->used_size + jeb->unchecked_size))) {
		c->dirty_size -= jeb->dirty_size;
		c->wasted_size += jeb->dirty_size;
		jeb->wasted_size += jeb->dirty_size;
		jeb->dirty_size = 0;
		return BLK_STATE_CLEAN;
	} else if (jeb->used_size || jeb->unchecked_size)
		return BLK_STATE_PARTDIRTY;
	else
		return BLK_STATE_ALLDIRTY;
}

326 327 328 329 330 331
#ifdef CONFIG_JFFS2_FS_XATTR
static int jffs2_scan_xattr_node(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb,
				 struct jffs2_raw_xattr *rx, uint32_t ofs,
				 struct jffs2_summary *s)
{
	struct jffs2_xattr_datum *xd;
332
	uint32_t xid, version, totlen, crc;
333
	int err;
334 335 336

	crc = crc32(0, rx, sizeof(struct jffs2_raw_xattr) - 4);
	if (crc != je32_to_cpu(rx->node_crc)) {
337 338
		JFFS2_WARNING("node CRC failed at %#08x, read=%#08x, calc=%#08x\n",
			      ofs, je32_to_cpu(rx->node_crc), crc);
339 340
		if ((err = jffs2_scan_dirty_space(c, jeb, je32_to_cpu(rx->totlen))))
			return err;
341 342 343
		return 0;
	}

344 345 346
	xid = je32_to_cpu(rx->xid);
	version = je32_to_cpu(rx->version);

347 348
	totlen = PAD(sizeof(struct jffs2_raw_xattr)
			+ rx->name_len + 1 + je16_to_cpu(rx->value_len));
349 350 351
	if (totlen != je32_to_cpu(rx->totlen)) {
		JFFS2_WARNING("node length mismatch at %#08x, read=%u, calc=%u\n",
			      ofs, je32_to_cpu(rx->totlen), totlen);
352 353
		if ((err = jffs2_scan_dirty_space(c, jeb, je32_to_cpu(rx->totlen))))
			return err;
354 355 356
		return 0;
	}

357 358
	xd = jffs2_setup_xattr_datum(c, xid, version);
	if (IS_ERR(xd))
359 360
		return PTR_ERR(xd);

361 362 363 364 365 366 367 368 369 370 371 372 373 374
	if (xd->version > version) {
		struct jffs2_raw_node_ref *raw
			= jffs2_link_node_ref(c, jeb, ofs | REF_PRISTINE, totlen, NULL);
		raw->next_in_ino = xd->node->next_in_ino;
		xd->node->next_in_ino = raw;
	} else {
		xd->version = version;
		xd->xprefix = rx->xprefix;
		xd->name_len = rx->name_len;
		xd->value_len = je16_to_cpu(rx->value_len);
		xd->data_crc = je32_to_cpu(rx->data_crc);

		jffs2_link_node_ref(c, jeb, ofs | REF_PRISTINE, totlen, (void *)xd);
	}
375

376 377
	if (jffs2_sum_active())
		jffs2_sum_add_xattr_mem(s, rx, ofs - jeb->offset);
M
Masanari Iida 已提交
378
	dbg_xattr("scanning xdatum at %#08x (xid=%u, version=%u)\n",
379 380 381 382 383 384 385 386 387 388
		  ofs, xd->xid, xd->version);
	return 0;
}

static int jffs2_scan_xref_node(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb,
				struct jffs2_raw_xref *rr, uint32_t ofs,
				struct jffs2_summary *s)
{
	struct jffs2_xattr_ref *ref;
	uint32_t crc;
389
	int err;
390 391 392

	crc = crc32(0, rr, sizeof(*rr) - 4);
	if (crc != je32_to_cpu(rr->node_crc)) {
393 394
		JFFS2_WARNING("node CRC failed at %#08x, read=%#08x, calc=%#08x\n",
			      ofs, je32_to_cpu(rr->node_crc), crc);
395 396
		if ((err = jffs2_scan_dirty_space(c, jeb, PAD(je32_to_cpu(rr->totlen)))))
			return err;
397 398 399 400
		return 0;
	}

	if (PAD(sizeof(struct jffs2_raw_xref)) != je32_to_cpu(rr->totlen)) {
401
		JFFS2_WARNING("node length mismatch at %#08x, read=%u, calc=%zd\n",
402 403
			      ofs, je32_to_cpu(rr->totlen),
			      PAD(sizeof(struct jffs2_raw_xref)));
404 405
		if ((err = jffs2_scan_dirty_space(c, jeb, je32_to_cpu(rr->totlen))))
			return err;
406 407 408 409 410 411 412 413
		return 0;
	}

	ref = jffs2_alloc_xattr_ref();
	if (!ref)
		return -ENOMEM;

	/* BEFORE jffs2_build_xattr_subsystem() called, 
414
	 * and AFTER xattr_ref is marked as a dead xref,
415 416 417
	 * ref->xid is used to store 32bit xid, xd is not used
	 * ref->ino is used to store 32bit inode-number, ic is not used
	 * Thoes variables are declared as union, thus using those
418
	 * are exclusive. In a similar way, ref->next is temporarily
419 420 421 422 423
	 * used to chain all xattr_ref object. It's re-chained to
	 * jffs2_inode_cache in jffs2_build_xattr_subsystem() correctly.
	 */
	ref->ino = je32_to_cpu(rr->ino);
	ref->xid = je32_to_cpu(rr->xid);
424 425 426
	ref->xseqno = je32_to_cpu(rr->xseqno);
	if (ref->xseqno > c->highest_xseqno)
		c->highest_xseqno = (ref->xseqno & ~XREF_DELETE_MARKER);
427 428
	ref->next = c->xref_temp;
	c->xref_temp = ref;
429

430
	jffs2_link_node_ref(c, jeb, ofs | REF_PRISTINE, PAD(je32_to_cpu(rr->totlen)), (void *)ref);
431

432 433 434 435 436 437 438 439
	if (jffs2_sum_active())
		jffs2_sum_add_xref_mem(s, rr, ofs - jeb->offset);
	dbg_xattr("scan xref at %#08x (xid=%u, ino=%u)\n",
		  ofs, ref->xid, ref->ino);
	return 0;
}
#endif

440 441
/* Called with 'buf_size == 0' if buf is in fact a pointer _directly_ into
   the flash, XIP-style */
L
Linus Torvalds 已提交
442
static int jffs2_scan_eraseblock (struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb,
443
				  unsigned char *buf, uint32_t buf_size, struct jffs2_summary *s) {
L
Linus Torvalds 已提交
444 445
	struct jffs2_unknown_node *node;
	struct jffs2_unknown_node crcnode;
446
	uint32_t ofs, prevofs, max_ofs;
L
Linus Torvalds 已提交
447 448 449
	uint32_t hdr_crc, buf_ofs, buf_len;
	int err;
	int noise = 0;
450 451


452
#ifdef CONFIG_JFFS2_FS_WRITEBUFFER
L
Linus Torvalds 已提交
453 454 455 456 457 458
	int cleanmarkerfound = 0;
#endif

	ofs = jeb->offset;
	prevofs = jeb->offset - 1;

459
	jffs2_dbg(1, "%s(): Scanning block at 0x%x\n", __func__, ofs);
L
Linus Torvalds 已提交
460

461
#ifdef CONFIG_JFFS2_FS_WRITEBUFFER
L
Linus Torvalds 已提交
462
	if (jffs2_cleanmarker_oob(c)) {
463 464
		int ret;

465
		if (mtd_block_isbad(c->mtd, jeb->offset))
466 467 468
			return BLK_STATE_BADBLOCK;

		ret = jffs2_check_nand_cleanmarker(c, jeb);
469
		jffs2_dbg(2, "jffs_check_nand_cleanmarker returned %d\n", ret);
470

L
Linus Torvalds 已提交
471 472 473 474 475 476 477 478 479 480
		/* Even if it's not found, we still scan to see
		   if the block is empty. We use this information
		   to decide whether to erase it or not. */
		switch (ret) {
		case 0:		cleanmarkerfound = 1; break;
		case 1: 	break;
		default: 	return ret;
		}
	}
#endif
481 482

	if (jffs2_sum_active()) {
483 484 485 486 487 488
		struct jffs2_sum_marker *sm;
		void *sumptr = NULL;
		uint32_t sumlen;
	      
		if (!buf_size) {
			/* XIP case. Just look, point at the summary if it's there */
489
			sm = (void *)buf + c->sector_size - sizeof(*sm);
490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529
			if (je32_to_cpu(sm->magic) == JFFS2_SUM_MAGIC) {
				sumptr = buf + je32_to_cpu(sm->offset);
				sumlen = c->sector_size - je32_to_cpu(sm->offset);
			}
		} else {
			/* If NAND flash, read a whole page of it. Else just the end */
			if (c->wbuf_pagesize)
				buf_len = c->wbuf_pagesize;
			else
				buf_len = sizeof(*sm);

			/* Read as much as we want into the _end_ of the preallocated buffer */
			err = jffs2_fill_scan_buf(c, buf + buf_size - buf_len, 
						  jeb->offset + c->sector_size - buf_len,
						  buf_len);				
			if (err)
				return err;

			sm = (void *)buf + buf_size - sizeof(*sm);
			if (je32_to_cpu(sm->magic) == JFFS2_SUM_MAGIC) {
				sumlen = c->sector_size - je32_to_cpu(sm->offset);
				sumptr = buf + buf_size - sumlen;

				/* Now, make sure the summary itself is available */
				if (sumlen > buf_size) {
					/* Need to kmalloc for this. */
					sumptr = kmalloc(sumlen, GFP_KERNEL);
					if (!sumptr)
						return -ENOMEM;
					memcpy(sumptr + sumlen - buf_len, buf + buf_size - buf_len, buf_len);
				}
				if (buf_len < sumlen) {
					/* Need to read more so that the entire summary node is present */
					err = jffs2_fill_scan_buf(c, sumptr, 
								  jeb->offset + c->sector_size - sumlen,
								  sumlen - buf_len);				
					if (err)
						return err;
				}
			}
530 531 532

		}

533 534
		if (sumptr) {
			err = jffs2_sum_scan_sumnode(c, jeb, sumptr, sumlen, &pseudo_random);
535

536 537
			if (buf_size && sumlen > buf_size)
				kfree(sumptr);
538 539 540 541 542 543
			/* If it returns with a real error, bail. 
			   If it returns positive, that's a block classification
			   (i.e. BLK_STATE_xxx) so return that too.
			   If it returns zero, fall through to full scan. */
			if (err)
				return err;
544 545 546
		}
	}

L
Linus Torvalds 已提交
547 548 549
	buf_ofs = jeb->offset;

	if (!buf_size) {
550
		/* This is the XIP case -- we're reading _directly_ from the flash chip */
L
Linus Torvalds 已提交
551 552
		buf_len = c->sector_size;
	} else {
553
		buf_len = EMPTY_SCAN_SIZE(c->sector_size);
L
Linus Torvalds 已提交
554 555 556 557
		err = jffs2_fill_scan_buf(c, buf, buf_ofs, buf_len);
		if (err)
			return err;
	}
558

L
Linus Torvalds 已提交
559 560
	/* We temporarily use 'ofs' as a pointer into the buffer/jeb */
	ofs = 0;
561 562 563
	max_ofs = EMPTY_SCAN_SIZE(c->sector_size);
	/* Scan only EMPTY_SCAN_SIZE of 0xFF before declaring it's empty */
	while(ofs < max_ofs && *(uint32_t *)(&buf[ofs]) == 0xFFFFFFFF)
L
Linus Torvalds 已提交
564 565
		ofs += 4;

566
	if (ofs == max_ofs) {
567
#ifdef CONFIG_JFFS2_FS_WRITEBUFFER
L
Linus Torvalds 已提交
568 569 570
		if (jffs2_cleanmarker_oob(c)) {
			/* scan oob, take care of cleanmarker */
			int ret = jffs2_check_oob_empty(c, jeb, cleanmarkerfound);
571 572
			jffs2_dbg(2, "jffs2_check_oob_empty returned %d\n",
				  ret);
L
Linus Torvalds 已提交
573 574 575 576 577 578 579
			switch (ret) {
			case 0:		return cleanmarkerfound ? BLK_STATE_CLEANMARKER : BLK_STATE_ALLFF;
			case 1: 	return BLK_STATE_ALLDIRTY;
			default: 	return ret;
			}
		}
#endif
580 581
		jffs2_dbg(1, "Block at 0x%08x is empty (erased)\n",
			  jeb->offset);
582 583 584 585
		if (c->cleanmarker_size == 0)
			return BLK_STATE_CLEANMARKER;	/* don't bother with re-erase */
		else
			return BLK_STATE_ALLFF;	/* OK to erase if all blocks are like this */
L
Linus Torvalds 已提交
586 587
	}
	if (ofs) {
588 589
		jffs2_dbg(1, "Free space at %08x ends at %08x\n", jeb->offset,
			  jeb->offset + ofs);
590 591
		if ((err = jffs2_prealloc_raw_node_refs(c, jeb, 1)))
			return err;
592 593
		if ((err = jffs2_scan_dirty_space(c, jeb, ofs)))
			return err;
L
Linus Torvalds 已提交
594 595 596 597 598 599 600
	}

	/* Now ofs is a complete physical flash offset as it always was... */
	ofs += jeb->offset;

	noise = 10;

601
	dbg_summary("no summary found in jeb 0x%08x. Apply original scan.\n",jeb->offset);
602

603
scan_more:
L
Linus Torvalds 已提交
604 605
	while(ofs < jeb->offset + c->sector_size) {

606
		jffs2_dbg_acct_paranoia_check_nolock(c, jeb);
L
Linus Torvalds 已提交
607

608
		/* Make sure there are node refs available for use */
609
		err = jffs2_prealloc_raw_node_refs(c, jeb, 2);
610 611 612
		if (err)
			return err;

L
Linus Torvalds 已提交
613 614 615
		cond_resched();

		if (ofs & 3) {
616
			pr_warn("Eep. ofs 0x%08x not word-aligned!\n", ofs);
L
Linus Torvalds 已提交
617 618 619 620
			ofs = PAD(ofs);
			continue;
		}
		if (ofs == prevofs) {
621 622
			pr_warn("ofs 0x%08x has already been seen. Skipping\n",
				ofs);
623 624
			if ((err = jffs2_scan_dirty_space(c, jeb, 4)))
				return err;
L
Linus Torvalds 已提交
625 626 627 628 629 630
			ofs += 4;
			continue;
		}
		prevofs = ofs;

		if (jeb->offset + c->sector_size < ofs + sizeof(*node)) {
631 632 633 634
			jffs2_dbg(1, "Fewer than %zd bytes left to end of block. (%x+%x<%x+%zx) Not reading\n",
				  sizeof(struct jffs2_unknown_node),
				  jeb->offset, c->sector_size, ofs,
				  sizeof(*node));
635 636
			if ((err = jffs2_scan_dirty_space(c, jeb, (jeb->offset + c->sector_size)-ofs)))
				return err;
L
Linus Torvalds 已提交
637 638 639 640 641
			break;
		}

		if (buf_ofs + buf_len < ofs + sizeof(*node)) {
			buf_len = min_t(uint32_t, buf_size, jeb->offset + c->sector_size - ofs);
642 643 644
			jffs2_dbg(1, "Fewer than %zd bytes (node header) left to end of buf. Reading 0x%x at 0x%08x\n",
				  sizeof(struct jffs2_unknown_node),
				  buf_len, ofs);
L
Linus Torvalds 已提交
645 646 647 648 649 650 651 652 653 654
			err = jffs2_fill_scan_buf(c, buf, ofs, buf_len);
			if (err)
				return err;
			buf_ofs = ofs;
		}

		node = (struct jffs2_unknown_node *)&buf[ofs-buf_ofs];

		if (*(uint32_t *)(&buf[ofs-buf_ofs]) == 0xffffffff) {
			uint32_t inbuf_ofs;
655
			uint32_t empty_start, scan_end;
L
Linus Torvalds 已提交
656 657 658

			empty_start = ofs;
			ofs += 4;
659
			scan_end = min_t(uint32_t, EMPTY_SCAN_SIZE(c->sector_size)/8, buf_len);
L
Linus Torvalds 已提交
660

661
			jffs2_dbg(1, "Found empty flash at 0x%08x\n", ofs);
L
Linus Torvalds 已提交
662 663
		more_empty:
			inbuf_ofs = ofs - buf_ofs;
664 665
			while (inbuf_ofs < scan_end) {
				if (unlikely(*(uint32_t *)(&buf[inbuf_ofs]) != 0xffffffff)) {
666 667
					pr_warn("Empty flash at 0x%08x ends at 0x%08x\n",
						empty_start, ofs);
668 669
					if ((err = jffs2_scan_dirty_space(c, jeb, ofs-empty_start)))
						return err;
L
Linus Torvalds 已提交
670 671 672 673 674 675 676
					goto scan_more;
				}

				inbuf_ofs+=4;
				ofs += 4;
			}
			/* Ran off end. */
677 678
			jffs2_dbg(1, "Empty flash to end of buffer at 0x%08x\n",
				  ofs);
L
Linus Torvalds 已提交
679 680 681

			/* If we're only checking the beginning of a block with a cleanmarker,
			   bail now */
682
			if (buf_ofs == jeb->offset && jeb->used_size == PAD(c->cleanmarker_size) &&
683
			    c->cleanmarker_size && !jeb->dirty_size && !ref_next(jeb->first_node)) {
684 685
				jffs2_dbg(1, "%d bytes at start of block seems clean... assuming all clean\n",
					  EMPTY_SCAN_SIZE(c->sector_size));
L
Linus Torvalds 已提交
686 687
				return BLK_STATE_CLEANMARKER;
			}
688 689 690 691 692
			if (!buf_size && (scan_end != buf_len)) {/* XIP/point case */
				scan_end = buf_len;
				goto more_empty;
			}
			
L
Linus Torvalds 已提交
693 694 695
			/* See how much more there is to read in this eraseblock... */
			buf_len = min_t(uint32_t, buf_size, jeb->offset + c->sector_size - ofs);
			if (!buf_len) {
696
				/* No more to read. Break out of main loop without marking
L
Linus Torvalds 已提交
697
				   this range of empty space as dirty (because it's not) */
698 699
				jffs2_dbg(1, "Empty flash at %08x runs to end of block. Treating as free_space\n",
					  empty_start);
L
Linus Torvalds 已提交
700 701
				break;
			}
702 703
			/* point never reaches here */
			scan_end = buf_len;
704 705
			jffs2_dbg(1, "Reading another 0x%x at 0x%08x\n",
				  buf_len, ofs);
L
Linus Torvalds 已提交
706 707 708 709 710 711 712 713
			err = jffs2_fill_scan_buf(c, buf, ofs, buf_len);
			if (err)
				return err;
			buf_ofs = ofs;
			goto more_empty;
		}

		if (ofs == jeb->offset && je16_to_cpu(node->magic) == KSAMTIB_CIGAM_2SFFJ) {
714 715
			pr_warn("Magic bitmask is backwards at offset 0x%08x. Wrong endian filesystem?\n",
				ofs);
716 717
			if ((err = jffs2_scan_dirty_space(c, jeb, 4)))
				return err;
L
Linus Torvalds 已提交
718 719 720 721
			ofs += 4;
			continue;
		}
		if (je16_to_cpu(node->magic) == JFFS2_DIRTY_BITMASK) {
722
			jffs2_dbg(1, "Dirty bitmask at 0x%08x\n", ofs);
723 724
			if ((err = jffs2_scan_dirty_space(c, jeb, 4)))
				return err;
L
Linus Torvalds 已提交
725 726 727 728
			ofs += 4;
			continue;
		}
		if (je16_to_cpu(node->magic) == JFFS2_OLD_MAGIC_BITMASK) {
729 730
			pr_warn("Old JFFS2 bitmask found at 0x%08x\n", ofs);
			pr_warn("You cannot use older JFFS2 filesystems with newer kernels\n");
731 732
			if ((err = jffs2_scan_dirty_space(c, jeb, 4)))
				return err;
L
Linus Torvalds 已提交
733 734 735 736 737
			ofs += 4;
			continue;
		}
		if (je16_to_cpu(node->magic) != JFFS2_MAGIC_BITMASK) {
			/* OK. We're out of possibilities. Whinge and move on */
738 739
			noisy_printk(&noise, "%s(): Magic bitmask 0x%04x not found at 0x%08x: 0x%04x instead\n",
				     __func__,
740
				     JFFS2_MAGIC_BITMASK, ofs,
L
Linus Torvalds 已提交
741
				     je16_to_cpu(node->magic));
742 743
			if ((err = jffs2_scan_dirty_space(c, jeb, 4)))
				return err;
L
Linus Torvalds 已提交
744 745 746 747 748 749 750 751 752 753
			ofs += 4;
			continue;
		}
		/* We seem to have a node of sorts. Check the CRC */
		crcnode.magic = node->magic;
		crcnode.nodetype = cpu_to_je16( je16_to_cpu(node->nodetype) | JFFS2_NODE_ACCURATE);
		crcnode.totlen = node->totlen;
		hdr_crc = crc32(0, &crcnode, sizeof(crcnode)-4);

		if (hdr_crc != je32_to_cpu(node->hdr_crc)) {
754 755
			noisy_printk(&noise, "%s(): Node at 0x%08x {0x%04x, 0x%04x, 0x%08x) has invalid CRC 0x%08x (calculated 0x%08x)\n",
				     __func__,
L
Linus Torvalds 已提交
756
				     ofs, je16_to_cpu(node->magic),
757
				     je16_to_cpu(node->nodetype),
L
Linus Torvalds 已提交
758 759 760
				     je32_to_cpu(node->totlen),
				     je32_to_cpu(node->hdr_crc),
				     hdr_crc);
761 762
			if ((err = jffs2_scan_dirty_space(c, jeb, 4)))
				return err;
L
Linus Torvalds 已提交
763 764 765 766
			ofs += 4;
			continue;
		}

767
		if (ofs + je32_to_cpu(node->totlen) > jeb->offset + c->sector_size) {
L
Linus Torvalds 已提交
768
			/* Eep. Node goes over the end of the erase block. */
769 770 771
			pr_warn("Node at 0x%08x with length 0x%08x would run over the end of the erase block\n",
				ofs, je32_to_cpu(node->totlen));
			pr_warn("Perhaps the file system was created with the wrong erase size?\n");
772 773
			if ((err = jffs2_scan_dirty_space(c, jeb, 4)))
				return err;
L
Linus Torvalds 已提交
774 775 776 777 778 779
			ofs += 4;
			continue;
		}

		if (!(je16_to_cpu(node->nodetype) & JFFS2_NODE_ACCURATE)) {
			/* Wheee. This is an obsoleted node */
780 781
			jffs2_dbg(2, "Node at 0x%08x is obsolete. Skipping\n",
				  ofs);
782 783
			if ((err = jffs2_scan_dirty_space(c, jeb, PAD(je32_to_cpu(node->totlen)))))
				return err;
L
Linus Torvalds 已提交
784 785 786 787 788 789 790 791
			ofs += PAD(je32_to_cpu(node->totlen));
			continue;
		}

		switch(je16_to_cpu(node->nodetype)) {
		case JFFS2_NODETYPE_INODE:
			if (buf_ofs + buf_len < ofs + sizeof(struct jffs2_raw_inode)) {
				buf_len = min_t(uint32_t, buf_size, jeb->offset + c->sector_size - ofs);
792 793 794
				jffs2_dbg(1, "Fewer than %zd bytes (inode node) left to end of buf. Reading 0x%x at 0x%08x\n",
					  sizeof(struct jffs2_raw_inode),
					  buf_len, ofs);
L
Linus Torvalds 已提交
795 796 797 798 799 800
				err = jffs2_fill_scan_buf(c, buf, ofs, buf_len);
				if (err)
					return err;
				buf_ofs = ofs;
				node = (void *)buf;
			}
801
			err = jffs2_scan_inode_node(c, jeb, (void *)node, ofs, s);
L
Linus Torvalds 已提交
802 803 804
			if (err) return err;
			ofs += PAD(je32_to_cpu(node->totlen));
			break;
805

L
Linus Torvalds 已提交
806 807 808
		case JFFS2_NODETYPE_DIRENT:
			if (buf_ofs + buf_len < ofs + je32_to_cpu(node->totlen)) {
				buf_len = min_t(uint32_t, buf_size, jeb->offset + c->sector_size - ofs);
809 810 811
				jffs2_dbg(1, "Fewer than %d bytes (dirent node) left to end of buf. Reading 0x%x at 0x%08x\n",
					  je32_to_cpu(node->totlen), buf_len,
					  ofs);
L
Linus Torvalds 已提交
812 813 814 815 816 817
				err = jffs2_fill_scan_buf(c, buf, ofs, buf_len);
				if (err)
					return err;
				buf_ofs = ofs;
				node = (void *)buf;
			}
818
			err = jffs2_scan_dirent_node(c, jeb, (void *)node, ofs, s);
L
Linus Torvalds 已提交
819 820 821 822
			if (err) return err;
			ofs += PAD(je32_to_cpu(node->totlen));
			break;

823 824 825 826
#ifdef CONFIG_JFFS2_FS_XATTR
		case JFFS2_NODETYPE_XATTR:
			if (buf_ofs + buf_len < ofs + je32_to_cpu(node->totlen)) {
				buf_len = min_t(uint32_t, buf_size, jeb->offset + c->sector_size - ofs);
827 828 829
				jffs2_dbg(1, "Fewer than %d bytes (xattr node) left to end of buf. Reading 0x%x at 0x%08x\n",
					  je32_to_cpu(node->totlen), buf_len,
					  ofs);
830 831 832 833 834 835 836 837 838 839 840 841 842 843
				err = jffs2_fill_scan_buf(c, buf, ofs, buf_len);
				if (err)
					return err;
				buf_ofs = ofs;
				node = (void *)buf;
			}
			err = jffs2_scan_xattr_node(c, jeb, (void *)node, ofs, s);
			if (err)
				return err;
			ofs += PAD(je32_to_cpu(node->totlen));
			break;
		case JFFS2_NODETYPE_XREF:
			if (buf_ofs + buf_len < ofs + je32_to_cpu(node->totlen)) {
				buf_len = min_t(uint32_t, buf_size, jeb->offset + c->sector_size - ofs);
844 845 846
				jffs2_dbg(1, "Fewer than %d bytes (xref node) left to end of buf. Reading 0x%x at 0x%08x\n",
					  je32_to_cpu(node->totlen), buf_len,
					  ofs);
847 848 849 850 851 852 853 854 855 856 857 858 859
				err = jffs2_fill_scan_buf(c, buf, ofs, buf_len);
				if (err)
					return err;
				buf_ofs = ofs;
				node = (void *)buf;
			}
			err = jffs2_scan_xref_node(c, jeb, (void *)node, ofs, s);
			if (err)
				return err;
			ofs += PAD(je32_to_cpu(node->totlen));
			break;
#endif	/* CONFIG_JFFS2_FS_XATTR */

L
Linus Torvalds 已提交
860
		case JFFS2_NODETYPE_CLEANMARKER:
861
			jffs2_dbg(1, "CLEANMARKER node found at 0x%08x\n", ofs);
L
Linus Torvalds 已提交
862
			if (je32_to_cpu(node->totlen) != c->cleanmarker_size) {
863 864 865
				pr_notice("CLEANMARKER node found at 0x%08x has totlen 0x%x != normal 0x%x\n",
					  ofs, je32_to_cpu(node->totlen),
					  c->cleanmarker_size);
866 867
				if ((err = jffs2_scan_dirty_space(c, jeb, PAD(sizeof(struct jffs2_unknown_node)))))
					return err;
L
Linus Torvalds 已提交
868 869
				ofs += PAD(sizeof(struct jffs2_unknown_node));
			} else if (jeb->first_node) {
870 871
				pr_notice("CLEANMARKER node found at 0x%08x, not first node in block (0x%08x)\n",
					  ofs, jeb->offset);
872 873
				if ((err = jffs2_scan_dirty_space(c, jeb, PAD(sizeof(struct jffs2_unknown_node)))))
					return err;
L
Linus Torvalds 已提交
874 875
				ofs += PAD(sizeof(struct jffs2_unknown_node));
			} else {
876
				jffs2_link_node_ref(c, jeb, ofs | REF_NORMAL, c->cleanmarker_size, NULL);
877

L
Linus Torvalds 已提交
878 879 880 881 882
				ofs += PAD(c->cleanmarker_size);
			}
			break;

		case JFFS2_NODETYPE_PADDING:
883 884
			if (jffs2_sum_active())
				jffs2_sum_add_padding_mem(s, je32_to_cpu(node->totlen));
885 886
			if ((err = jffs2_scan_dirty_space(c, jeb, PAD(je32_to_cpu(node->totlen)))))
				return err;
L
Linus Torvalds 已提交
887 888 889 890 891 892
			ofs += PAD(je32_to_cpu(node->totlen));
			break;

		default:
			switch (je16_to_cpu(node->nodetype) & JFFS2_COMPAT_MASK) {
			case JFFS2_FEATURE_ROCOMPAT:
893 894
				pr_notice("Read-only compatible feature node (0x%04x) found at offset 0x%08x\n",
					  je16_to_cpu(node->nodetype), ofs);
D
David Woodhouse 已提交
895
				c->flags |= JFFS2_SB_FLAG_RO;
L
Linus Torvalds 已提交
896 897
				if (!(jffs2_is_readonly(c)))
					return -EROFS;
898 899
				if ((err = jffs2_scan_dirty_space(c, jeb, PAD(je32_to_cpu(node->totlen)))))
					return err;
L
Linus Torvalds 已提交
900 901 902 903
				ofs += PAD(je32_to_cpu(node->totlen));
				break;

			case JFFS2_FEATURE_INCOMPAT:
904 905
				pr_notice("Incompatible feature node (0x%04x) found at offset 0x%08x\n",
					  je16_to_cpu(node->nodetype), ofs);
L
Linus Torvalds 已提交
906 907 908
				return -EINVAL;

			case JFFS2_FEATURE_RWCOMPAT_DELETE:
909 910
				jffs2_dbg(1, "Unknown but compatible feature node (0x%04x) found at offset 0x%08x\n",
					  je16_to_cpu(node->nodetype), ofs);
911 912
				if ((err = jffs2_scan_dirty_space(c, jeb, PAD(je32_to_cpu(node->totlen)))))
					return err;
L
Linus Torvalds 已提交
913 914 915
				ofs += PAD(je32_to_cpu(node->totlen));
				break;

916
			case JFFS2_FEATURE_RWCOMPAT_COPY: {
917 918
				jffs2_dbg(1, "Unknown but compatible feature node (0x%04x) found at offset 0x%08x\n",
					  je16_to_cpu(node->nodetype), ofs);
919

920
				jffs2_link_node_ref(c, jeb, ofs | REF_PRISTINE, PAD(je32_to_cpu(node->totlen)), NULL);
921 922 923

				/* We can't summarise nodes we don't grok */
				jffs2_sum_disable_collecting(s);
L
Linus Torvalds 已提交
924 925
				ofs += PAD(je32_to_cpu(node->totlen));
				break;
926
				}
L
Linus Torvalds 已提交
927 928 929 930
			}
		}
	}

931 932
	if (jffs2_sum_active()) {
		if (PAD(s->sum_size + JFFS2_SUMMARY_FRAME_SIZE) > jeb->free_size) {
933
			dbg_summary("There is not enough space for "
934 935 936 937
				"summary information, disabling for this jeb!\n");
			jffs2_sum_disable_collecting(s);
		}
	}
L
Linus Torvalds 已提交
938

939 940 941
	jffs2_dbg(1, "Block at 0x%08x: free 0x%08x, dirty 0x%08x, unchecked 0x%08x, used 0x%08x, wasted 0x%08x\n",
		  jeb->offset, jeb->free_size, jeb->dirty_size,
		  jeb->unchecked_size, jeb->used_size, jeb->wasted_size);
942
	
L
Linus Torvalds 已提交
943 944 945 946 947 948 949 950
	/* mark_node_obsolete can add to wasted !! */
	if (jeb->wasted_size) {
		jeb->dirty_size += jeb->wasted_size;
		c->dirty_size += jeb->wasted_size;
		c->wasted_size -= jeb->wasted_size;
		jeb->wasted_size = 0;
	}

951
	return jffs2_scan_classify_jeb(c, jeb);
L
Linus Torvalds 已提交
952 953
}

954
struct jffs2_inode_cache *jffs2_scan_make_ino_cache(struct jffs2_sb_info *c, uint32_t ino)
L
Linus Torvalds 已提交
955 956 957 958 959 960 961 962 963 964 965 966
{
	struct jffs2_inode_cache *ic;

	ic = jffs2_get_ino_cache(c, ino);
	if (ic)
		return ic;

	if (ino > c->highest_ino)
		c->highest_ino = ino;

	ic = jffs2_alloc_inode_cache();
	if (!ic) {
967
		pr_notice("%s(): allocation of inode cache failed\n", __func__);
L
Linus Torvalds 已提交
968 969 970 971 972 973 974 975
		return NULL;
	}
	memset(ic, 0, sizeof(*ic));

	ic->ino = ino;
	ic->nodes = (void *)ic;
	jffs2_add_ino_cache(c, ic);
	if (ino == 1)
976
		ic->pino_nlink = 1;
L
Linus Torvalds 已提交
977 978 979
	return ic;
}

980
static int jffs2_scan_inode_node(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb,
981
				 struct jffs2_raw_inode *ri, uint32_t ofs, struct jffs2_summary *s)
L
Linus Torvalds 已提交
982 983
{
	struct jffs2_inode_cache *ic;
984
	uint32_t crc, ino = je32_to_cpu(ri->ino);
L
Linus Torvalds 已提交
985

986
	jffs2_dbg(1, "%s(): Node at 0x%08x\n", __func__, ofs);
L
Linus Torvalds 已提交
987 988

	/* We do very little here now. Just check the ino# to which we should attribute
989
	   this node; we can do all the CRC checking etc. later. There's a tradeoff here --
L
Linus Torvalds 已提交
990 991 992
	   we used to scan the flash once only, reading everything we want from it into
	   memory, then building all our in-core data structures and freeing the extra
	   information. Now we allow the first part of the mount to complete a lot quicker,
993
	   but we have to go _back_ to the flash in order to finish the CRC checking, etc.
L
Linus Torvalds 已提交
994 995 996
	   Which means that the _full_ amount of time to get to proper write mode with GC
	   operational may actually be _longer_ than before. Sucks to be me. */

997 998 999
	/* Check the node CRC in any case. */
	crc = crc32(0, ri, sizeof(*ri)-8);
	if (crc != je32_to_cpu(ri->node_crc)) {
1000 1001
		pr_notice("%s(): CRC failed on node at 0x%08x: Read 0x%08x, calculated 0x%08x\n",
			  __func__, ofs, je32_to_cpu(ri->node_crc), crc);
1002 1003 1004 1005 1006 1007 1008 1009
		/*
		 * We believe totlen because the CRC on the node
		 * _header_ was OK, just the node itself failed.
		 */
		return jffs2_scan_dirty_space(c, jeb,
					      PAD(je32_to_cpu(ri->totlen)));
	}

L
Linus Torvalds 已提交
1010 1011 1012
	ic = jffs2_get_ino_cache(c, ino);
	if (!ic) {
		ic = jffs2_scan_make_ino_cache(c, ino);
1013
		if (!ic)
L
Linus Torvalds 已提交
1014 1015 1016 1017
			return -ENOMEM;
	}

	/* Wheee. It worked */
1018
	jffs2_link_node_ref(c, jeb, ofs | REF_UNCHECKED, PAD(je32_to_cpu(ri->totlen)), ic);
L
Linus Torvalds 已提交
1019

1020
	jffs2_dbg(1, "Node is ino #%u, version %d. Range 0x%x-0x%x\n",
L
Linus Torvalds 已提交
1021 1022
		  je32_to_cpu(ri->ino), je32_to_cpu(ri->version),
		  je32_to_cpu(ri->offset),
1023
		  je32_to_cpu(ri->offset)+je32_to_cpu(ri->dsize));
L
Linus Torvalds 已提交
1024 1025 1026

	pseudo_random += je32_to_cpu(ri->version);

1027 1028 1029 1030
	if (jffs2_sum_active()) {
		jffs2_sum_add_inode_mem(s, ri, ofs - jeb->offset);
	}

L
Linus Torvalds 已提交
1031 1032 1033
	return 0;
}

1034
static int jffs2_scan_dirent_node(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb,
1035
				  struct jffs2_raw_dirent *rd, uint32_t ofs, struct jffs2_summary *s)
L
Linus Torvalds 已提交
1036 1037 1038
{
	struct jffs2_full_dirent *fd;
	struct jffs2_inode_cache *ic;
1039
	uint32_t checkedlen;
L
Linus Torvalds 已提交
1040
	uint32_t crc;
1041
	int err;
L
Linus Torvalds 已提交
1042

1043
	jffs2_dbg(1, "%s(): Node at 0x%08x\n", __func__, ofs);
L
Linus Torvalds 已提交
1044 1045 1046 1047 1048 1049

	/* We don't get here unless the node is still valid, so we don't have to
	   mask in the ACCURATE bit any more. */
	crc = crc32(0, rd, sizeof(*rd)-8);

	if (crc != je32_to_cpu(rd->node_crc)) {
1050 1051
		pr_notice("%s(): Node CRC failed on node at 0x%08x: Read 0x%08x, calculated 0x%08x\n",
			  __func__, ofs, je32_to_cpu(rd->node_crc), crc);
L
Linus Torvalds 已提交
1052
		/* We believe totlen because the CRC on the node _header_ was OK, just the node itself failed. */
1053 1054
		if ((err = jffs2_scan_dirty_space(c, jeb, PAD(je32_to_cpu(rd->totlen)))))
			return err;
L
Linus Torvalds 已提交
1055 1056 1057 1058 1059
		return 0;
	}

	pseudo_random += je32_to_cpu(rd->version);

1060 1061 1062
	/* Should never happen. Did. (OLPC trac #4184)*/
	checkedlen = strnlen(rd->name, rd->nsize);
	if (checkedlen < rd->nsize) {
1063
		pr_err("Dirent at %08x has zeroes in name. Truncating to %d chars\n",
1064 1065 1066
		       ofs, checkedlen);
	}
	fd = jffs2_alloc_full_dirent(checkedlen+1);
L
Linus Torvalds 已提交
1067 1068 1069
	if (!fd) {
		return -ENOMEM;
	}
1070 1071
	memcpy(&fd->name, rd->name, checkedlen);
	fd->name[checkedlen] = 0;
L
Linus Torvalds 已提交
1072 1073 1074

	crc = crc32(0, fd->name, rd->nsize);
	if (crc != je32_to_cpu(rd->name_crc)) {
1075 1076
		pr_notice("%s(): Name CRC failed on node at 0x%08x: Read 0x%08x, calculated 0x%08x\n",
			  __func__, ofs, je32_to_cpu(rd->name_crc), crc);
1077 1078
		jffs2_dbg(1, "Name for which CRC failed is (now) '%s', ino #%d\n",
			  fd->name, je32_to_cpu(rd->ino));
L
Linus Torvalds 已提交
1079 1080 1081
		jffs2_free_full_dirent(fd);
		/* FIXME: Why do we believe totlen? */
		/* We believe totlen because the CRC on the node _header_ was OK, just the name failed. */
1082 1083
		if ((err = jffs2_scan_dirty_space(c, jeb, PAD(je32_to_cpu(rd->totlen)))))
			return err;
L
Linus Torvalds 已提交
1084 1085 1086 1087 1088 1089 1090
		return 0;
	}
	ic = jffs2_scan_make_ino_cache(c, je32_to_cpu(rd->pino));
	if (!ic) {
		jffs2_free_full_dirent(fd);
		return -ENOMEM;
	}
1091

1092 1093
	fd->raw = jffs2_link_node_ref(c, jeb, ofs | dirent_node_state(rd),
				      PAD(je32_to_cpu(rd->totlen)), ic);
L
Linus Torvalds 已提交
1094 1095 1096 1097

	fd->next = NULL;
	fd->version = je32_to_cpu(rd->version);
	fd->ino = je32_to_cpu(rd->ino);
1098
	fd->nhash = full_name_hash(fd->name, checkedlen);
L
Linus Torvalds 已提交
1099 1100 1101
	fd->type = rd->type;
	jffs2_add_fd_to_list(c, fd, &ic->scan_dents);

1102 1103 1104 1105
	if (jffs2_sum_active()) {
		jffs2_sum_add_dirent_mem(s, rd, ofs - jeb->offset);
	}

L
Linus Torvalds 已提交
1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171
	return 0;
}

static int count_list(struct list_head *l)
{
	uint32_t count = 0;
	struct list_head *tmp;

	list_for_each(tmp, l) {
		count++;
	}
	return count;
}

/* Note: This breaks if list_empty(head). I don't care. You
   might, if you copy this code and use it elsewhere :) */
static void rotate_list(struct list_head *head, uint32_t count)
{
	struct list_head *n = head->next;

	list_del(head);
	while(count--) {
		n = n->next;
	}
	list_add(head, n);
}

void jffs2_rotate_lists(struct jffs2_sb_info *c)
{
	uint32_t x;
	uint32_t rotateby;

	x = count_list(&c->clean_list);
	if (x) {
		rotateby = pseudo_random % x;
		rotate_list((&c->clean_list), rotateby);
	}

	x = count_list(&c->very_dirty_list);
	if (x) {
		rotateby = pseudo_random % x;
		rotate_list((&c->very_dirty_list), rotateby);
	}

	x = count_list(&c->dirty_list);
	if (x) {
		rotateby = pseudo_random % x;
		rotate_list((&c->dirty_list), rotateby);
	}

	x = count_list(&c->erasable_list);
	if (x) {
		rotateby = pseudo_random % x;
		rotate_list((&c->erasable_list), rotateby);
	}

	if (c->nr_erasing_blocks) {
		rotateby = pseudo_random % c->nr_erasing_blocks;
		rotate_list((&c->erase_pending_list), rotateby);
	}

	if (c->nr_free_blocks) {
		rotateby = pseudo_random % c->nr_free_blocks;
		rotate_list((&c->free_list), rotateby);
	}
}