Pull acpi-produce-consume into release branch
[linux-2.6-block.git] / fs / jffs / intrep.c
CommitLineData
1da177e4
LT
1/*
2 * JFFS -- Journaling Flash File System, Linux implementation.
3 *
4 * Copyright (C) 1999, 2000 Axis Communications, Inc.
5 *
6 * Created by Finn Hakansson <finn@axis.com>.
7 *
8 * This is free software; you can redistribute it and/or modify it
9 * under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
12 *
13 * $Id: intrep.c,v 1.102 2001/09/23 23:28:36 dwmw2 Exp $
14 *
15 * Ported to Linux 2.3.x and MTD:
16 * Copyright (C) 2000 Alexander Larsson (alex@cendio.se), Cendio Systems AB
17 *
18 */
19
20/* This file contains the code for the internal structure of the
21 Journaling Flash File System, JFFS. */
22
23/*
24 * Todo list:
25 *
26 * memcpy_to_flash() and memcpy_from_flash() functions.
27 *
28 * Implementation of hard links.
29 *
30 * Organize the source code in a better way. Against the VFS we could
31 * have jffs_ext.c, and against the block device jffs_int.c.
32 * A better file-internal organization too.
33 *
34 * A better checksum algorithm.
35 *
36 * Consider endianness stuff. ntohl() etc.
37 *
38 * Are we handling the atime, mtime, ctime members of the inode right?
39 *
40 * Remove some duplicated code. Take a look at jffs_write_node() and
41 * jffs_rewrite_data() for instance.
42 *
43 * Implement more meaning of the nlink member in various data structures.
44 * nlink could be used in conjunction with hard links for instance.
45 *
46 * Better memory management. Allocate data structures in larger chunks
47 * if possible.
48 *
49 * If too much meta data is stored, a garbage collect should be issued.
50 * We have experienced problems with too much meta data with for instance
51 * log files.
52 *
53 * Improve the calls to jffs_ioctl(). We would like to retrieve more
54 * information to be able to debug (or to supervise) JFFS during run-time.
55 *
56 */
57
58#include <linux/config.h>
59#include <linux/types.h>
60#include <linux/slab.h>
61#include <linux/jffs.h>
62#include <linux/fs.h>
63#include <linux/stat.h>
64#include <linux/pagemap.h>
65#include <asm/semaphore.h>
66#include <asm/byteorder.h>
67#include <linux/smp_lock.h>
68#include <linux/time.h>
69#include <linux/ctype.h>
70
71#include "intrep.h"
72#include "jffs_fm.h"
73
74long no_jffs_node = 0;
75static long no_jffs_file = 0;
76#if defined(JFFS_MEMORY_DEBUG) && JFFS_MEMORY_DEBUG
77long no_jffs_control = 0;
78long no_jffs_raw_inode = 0;
79long no_jffs_node_ref = 0;
80long no_jffs_fm = 0;
81long no_jffs_fmcontrol = 0;
82long no_hash = 0;
83long no_name = 0;
84#endif
85
86static int jffs_scan_flash(struct jffs_control *c);
87static int jffs_update_file(struct jffs_file *f, struct jffs_node *node);
88static int jffs_build_file(struct jffs_file *f);
89static int jffs_free_file(struct jffs_file *f);
90static int jffs_free_node_list(struct jffs_file *f);
91static int jffs_garbage_collect_now(struct jffs_control *c);
92static int jffs_insert_file_into_hash(struct jffs_file *f);
93static int jffs_remove_redundant_nodes(struct jffs_file *f);
94
95/* Is there enough space on the flash? */
96static inline int JFFS_ENOUGH_SPACE(struct jffs_control *c, __u32 space)
97{
98 struct jffs_fmcontrol *fmc = c->fmc;
99
100 while (1) {
101 if ((fmc->flash_size - (fmc->used_size + fmc->dirty_size))
102 >= fmc->min_free_size + space) {
103 return 1;
104 }
105 if (fmc->dirty_size < fmc->sector_size)
106 return 0;
107
108 if (jffs_garbage_collect_now(c)) {
109 D1(printk("JFFS_ENOUGH_SPACE: jffs_garbage_collect_now() failed.\n"));
110 return 0;
111 }
112 }
113}
114
115#if CONFIG_JFFS_FS_VERBOSE > 0
116static __u8
117flash_read_u8(struct mtd_info *mtd, loff_t from)
118{
119 size_t retlen;
120 __u8 ret;
121 int res;
122
123 res = MTD_READ(mtd, from, 1, &retlen, &ret);
124 if (retlen != 1) {
125 printk("Didn't read a byte in flash_read_u8(). Returned %d\n", res);
126 return 0;
127 }
128
129 return ret;
130}
131
132static void
133jffs_hexdump(struct mtd_info *mtd, loff_t pos, int size)
134{
135 char line[16];
136 int j = 0;
137
138 while (size > 0) {
139 int i;
140
141 printk("%ld:", (long) pos);
142 for (j = 0; j < 16; j++) {
143 line[j] = flash_read_u8(mtd, pos++);
144 }
145 for (i = 0; i < j; i++) {
146 if (!(i & 1)) {
147 printk(" %.2x", line[i] & 0xff);
148 }
149 else {
150 printk("%.2x", line[i] & 0xff);
151 }
152 }
153
154 /* Print empty space */
155 for (; i < 16; i++) {
156 if (!(i & 1)) {
157 printk(" ");
158 }
159 else {
160 printk(" ");
161 }
162 }
163 printk(" ");
164
165 for (i = 0; i < j; i++) {
166 if (isgraph(line[i])) {
167 printk("%c", line[i]);
168 }
169 else {
170 printk(".");
171 }
172 }
173 printk("\n");
174 size -= 16;
175 }
176}
177
94c9eca2
AB
178/* Print the contents of a node. */
179static void
180jffs_print_node(struct jffs_node *n)
181{
182 D(printk("jffs_node: 0x%p\n", n));
183 D(printk("{\n"));
184 D(printk(" 0x%08x, /* version */\n", n->version));
185 D(printk(" 0x%08x, /* data_offset */\n", n->data_offset));
186 D(printk(" 0x%08x, /* data_size */\n", n->data_size));
187 D(printk(" 0x%08x, /* removed_size */\n", n->removed_size));
188 D(printk(" 0x%08x, /* fm_offset */\n", n->fm_offset));
189 D(printk(" 0x%02x, /* name_size */\n", n->name_size));
190 D(printk(" 0x%p, /* fm, fm->offset: %u */\n",
191 n->fm, (n->fm ? n->fm->offset : 0)));
192 D(printk(" 0x%p, /* version_prev */\n", n->version_prev));
193 D(printk(" 0x%p, /* version_next */\n", n->version_next));
194 D(printk(" 0x%p, /* range_prev */\n", n->range_prev));
195 D(printk(" 0x%p, /* range_next */\n", n->range_next));
196 D(printk("}\n"));
197}
198
1da177e4
LT
199#endif
200
94c9eca2
AB
201/* Print the contents of a raw inode. */
202static void
203jffs_print_raw_inode(struct jffs_raw_inode *raw_inode)
204{
205 D(printk("jffs_raw_inode: inode number: %u\n", raw_inode->ino));
206 D(printk("{\n"));
207 D(printk(" 0x%08x, /* magic */\n", raw_inode->magic));
208 D(printk(" 0x%08x, /* ino */\n", raw_inode->ino));
209 D(printk(" 0x%08x, /* pino */\n", raw_inode->pino));
210 D(printk(" 0x%08x, /* version */\n", raw_inode->version));
211 D(printk(" 0x%08x, /* mode */\n", raw_inode->mode));
212 D(printk(" 0x%04x, /* uid */\n", raw_inode->uid));
213 D(printk(" 0x%04x, /* gid */\n", raw_inode->gid));
214 D(printk(" 0x%08x, /* atime */\n", raw_inode->atime));
215 D(printk(" 0x%08x, /* mtime */\n", raw_inode->mtime));
216 D(printk(" 0x%08x, /* ctime */\n", raw_inode->ctime));
217 D(printk(" 0x%08x, /* offset */\n", raw_inode->offset));
218 D(printk(" 0x%08x, /* dsize */\n", raw_inode->dsize));
219 D(printk(" 0x%08x, /* rsize */\n", raw_inode->rsize));
220 D(printk(" 0x%02x, /* nsize */\n", raw_inode->nsize));
221 D(printk(" 0x%02x, /* nlink */\n", raw_inode->nlink));
222 D(printk(" 0x%02x, /* spare */\n",
223 raw_inode->spare));
224 D(printk(" %u, /* rename */\n",
225 raw_inode->rename));
226 D(printk(" %u, /* deleted */\n",
227 raw_inode->deleted));
228 D(printk(" 0x%02x, /* accurate */\n",
229 raw_inode->accurate));
230 D(printk(" 0x%08x, /* dchksum */\n", raw_inode->dchksum));
231 D(printk(" 0x%04x, /* nchksum */\n", raw_inode->nchksum));
232 D(printk(" 0x%04x, /* chksum */\n", raw_inode->chksum));
233 D(printk("}\n"));
234}
235
1da177e4
LT
236#define flash_safe_acquire(arg)
237#define flash_safe_release(arg)
238
239
240static int
241flash_safe_read(struct mtd_info *mtd, loff_t from,
242 u_char *buf, size_t count)
243{
244 size_t retlen;
245 int res;
246
247 D3(printk(KERN_NOTICE "flash_safe_read(%p, %08x, %p, %08x)\n",
248 mtd, (unsigned int) from, buf, count));
249
250 res = MTD_READ(mtd, from, count, &retlen, buf);
251 if (retlen != count) {
252 panic("Didn't read all bytes in flash_safe_read(). Returned %d\n", res);
253 }
254 return res?res:retlen;
255}
256
257
258static __u32
259flash_read_u32(struct mtd_info *mtd, loff_t from)
260{
261 size_t retlen;
262 __u32 ret;
263 int res;
264
265 res = MTD_READ(mtd, from, 4, &retlen, (unsigned char *)&ret);
266 if (retlen != 4) {
267 printk("Didn't read all bytes in flash_read_u32(). Returned %d\n", res);
268 return 0;
269 }
270
271 return ret;
272}
273
274
275static int
276flash_safe_write(struct mtd_info *mtd, loff_t to,
277 const u_char *buf, size_t count)
278{
279 size_t retlen;
280 int res;
281
282 D3(printk(KERN_NOTICE "flash_safe_write(%p, %08x, %p, %08x)\n",
283 mtd, (unsigned int) to, buf, count));
284
285 res = MTD_WRITE(mtd, to, count, &retlen, buf);
286 if (retlen != count) {
287 printk("Didn't write all bytes in flash_safe_write(). Returned %d\n", res);
288 }
289 return res?res:retlen;
290}
291
292
293static int
294flash_safe_writev(struct mtd_info *mtd, const struct kvec *vecs,
295 unsigned long iovec_cnt, loff_t to)
296{
297 size_t retlen, retlen_a;
298 int i;
299 int res;
300
301 D3(printk(KERN_NOTICE "flash_safe_writev(%p, %08x, %p)\n",
302 mtd, (unsigned int) to, vecs));
303
304 if (mtd->writev) {
305 res = MTD_WRITEV(mtd, vecs, iovec_cnt, to, &retlen);
306 return res ? res : retlen;
307 }
308 /* Not implemented writev. Repeatedly use write - on the not so
309 unreasonable assumption that the mtd driver doesn't care how
310 many write cycles we use. */
311 res=0;
312 retlen=0;
313
314 for (i=0; !res && i<iovec_cnt; i++) {
315 res = MTD_WRITE(mtd, to, vecs[i].iov_len, &retlen_a, vecs[i].iov_base);
316 if (retlen_a != vecs[i].iov_len) {
317 printk("Didn't write all bytes in flash_safe_writev(). Returned %d\n", res);
318 if (i != iovec_cnt-1)
319 return -EIO;
320 }
321 /* If res is non-zero, retlen_a is undefined, but we don't
322 care because in that case it's not going to be
323 returned anyway.
324 */
325 to += retlen_a;
326 retlen += retlen_a;
327 }
328 return res?res:retlen;
329}
330
331
332static int
333flash_memset(struct mtd_info *mtd, loff_t to,
334 const u_char c, size_t size)
335{
336 static unsigned char pattern[64];
337 int i;
338
339 /* fill up pattern */
340
341 for(i = 0; i < 64; i++)
342 pattern[i] = c;
343
344 /* write as many 64-byte chunks as we can */
345
346 while (size >= 64) {
347 flash_safe_write(mtd, to, pattern, 64);
348 size -= 64;
349 to += 64;
350 }
351
352 /* and the rest */
353
354 if(size)
355 flash_safe_write(mtd, to, pattern, size);
356
357 return size;
358}
359
360
361static void
362intrep_erase_callback(struct erase_info *done)
363{
364 wait_queue_head_t *wait_q;
365
366 wait_q = (wait_queue_head_t *)done->priv;
367
368 wake_up(wait_q);
369}
370
371
372static int
373flash_erase_region(struct mtd_info *mtd, loff_t start,
374 size_t size)
375{
376 struct erase_info *erase;
377 DECLARE_WAITQUEUE(wait, current);
378 wait_queue_head_t wait_q;
379
380 erase = kmalloc(sizeof(struct erase_info), GFP_KERNEL);
381 if (!erase)
382 return -ENOMEM;
383
384 init_waitqueue_head(&wait_q);
385
386 erase->mtd = mtd;
387 erase->callback = intrep_erase_callback;
388 erase->addr = start;
389 erase->len = size;
390 erase->priv = (u_long)&wait_q;
391
392 /* FIXME: Use TASK_INTERRUPTIBLE and deal with being interrupted */
393 set_current_state(TASK_UNINTERRUPTIBLE);
394 add_wait_queue(&wait_q, &wait);
395
396 if (MTD_ERASE(mtd, erase) < 0) {
397 set_current_state(TASK_RUNNING);
398 remove_wait_queue(&wait_q, &wait);
399 kfree(erase);
400
401 printk(KERN_WARNING "flash: erase of region [0x%lx, 0x%lx] "
402 "totally failed\n", (long)start, (long)start + size);
403
404 return -1;
405 }
406
407 schedule(); /* Wait for flash to finish. */
408 remove_wait_queue(&wait_q, &wait);
409
410 kfree(erase);
411
412 return 0;
413}
414
415/* This routine calculates checksums in JFFS. */
416static __u32
417jffs_checksum(const void *data, int size)
418{
419 __u32 sum = 0;
420 __u8 *ptr = (__u8 *)data;
421 while (size-- > 0) {
422 sum += *ptr++;
423 }
424 D3(printk(", result: 0x%08x\n", sum));
425 return sum;
426}
427
428
429static int
430jffs_checksum_flash(struct mtd_info *mtd, loff_t start, int size, __u32 *result)
431{
432 __u32 sum = 0;
433 loff_t ptr = start;
434 __u8 *read_buf;
435 int i, length;
436
437 /* Allocate read buffer */
438 read_buf = (__u8 *) kmalloc (sizeof(__u8) * 4096, GFP_KERNEL);
439 if (!read_buf) {
440 printk(KERN_NOTICE "kmalloc failed in jffs_checksum_flash()\n");
441 return -ENOMEM;
442 }
443 /* Loop until checksum done */
444 while (size) {
445 /* Get amount of data to read */
446 if (size < 4096)
447 length = size;
448 else
449 length = 4096;
450
451 /* Perform flash read */
452 D3(printk(KERN_NOTICE "jffs_checksum_flash\n"));
453 flash_safe_read(mtd, ptr, &read_buf[0], length);
454
455 /* Compute checksum */
456 for (i=0; i < length ; i++)
457 sum += read_buf[i];
458
459 /* Update pointer and size */
460 size -= length;
461 ptr += length;
462 }
463
464 /* Free read buffer */
465 kfree (read_buf);
466
467 /* Return result */
468 D3(printk("checksum result: 0x%08x\n", sum));
469 *result = sum;
470 return 0;
471}
472
473static __inline__ void jffs_fm_write_lock(struct jffs_fmcontrol *fmc)
474{
475 // down(&fmc->wlock);
476}
477
478static __inline__ void jffs_fm_write_unlock(struct jffs_fmcontrol *fmc)
479{
480 // up(&fmc->wlock);
481}
482
483
484/* Create and initialize a new struct jffs_file. */
485static struct jffs_file *
486jffs_create_file(struct jffs_control *c,
487 const struct jffs_raw_inode *raw_inode)
488{
489 struct jffs_file *f;
490
491 if (!(f = (struct jffs_file *)kmalloc(sizeof(struct jffs_file),
492 GFP_KERNEL))) {
493 D(printk("jffs_create_file(): Failed!\n"));
494 return NULL;
495 }
496 no_jffs_file++;
497 memset(f, 0, sizeof(struct jffs_file));
498 f->ino = raw_inode->ino;
499 f->pino = raw_inode->pino;
500 f->nlink = raw_inode->nlink;
501 f->deleted = raw_inode->deleted;
502 f->c = c;
503
504 return f;
505}
506
507
508/* Build a control block for the file system. */
509static struct jffs_control *
510jffs_create_control(struct super_block *sb)
511{
512 struct jffs_control *c;
513 register int s = sizeof(struct jffs_control);
514 int i;
515 D(char *t = 0);
516
517 D2(printk("jffs_create_control()\n"));
518
519 if (!(c = (struct jffs_control *)kmalloc(s, GFP_KERNEL))) {
520 goto fail_control;
521 }
522 DJM(no_jffs_control++);
523 c->root = NULL;
524 c->gc_task = NULL;
525 c->hash_len = JFFS_HASH_SIZE;
526 s = sizeof(struct list_head) * c->hash_len;
527 if (!(c->hash = (struct list_head *)kmalloc(s, GFP_KERNEL))) {
528 goto fail_hash;
529 }
530 DJM(no_hash++);
531 for (i = 0; i < c->hash_len; i++)
532 INIT_LIST_HEAD(&c->hash[i]);
533 if (!(c->fmc = jffs_build_begin(c, MINOR(sb->s_dev)))) {
534 goto fail_fminit;
535 }
536 c->next_ino = JFFS_MIN_INO + 1;
537 c->delete_list = (struct jffs_delete_list *) 0;
538 return c;
539
540fail_fminit:
541 D(t = "c->fmc");
542fail_hash:
543 kfree(c);
544 DJM(no_jffs_control--);
545 D(t = t ? t : "c->hash");
546fail_control:
547 D(t = t ? t : "control");
548 D(printk("jffs_create_control(): Allocation failed: (%s)\n", t));
549 return (struct jffs_control *)0;
550}
551
552
553/* Clean up all data structures associated with the file system. */
554void
555jffs_cleanup_control(struct jffs_control *c)
556{
557 D2(printk("jffs_cleanup_control()\n"));
558
559 if (!c) {
560 D(printk("jffs_cleanup_control(): c == NULL !!!\n"));
561 return;
562 }
563
564 while (c->delete_list) {
565 struct jffs_delete_list *delete_list_element;
566 delete_list_element = c->delete_list;
567 c->delete_list = c->delete_list->next;
568 kfree(delete_list_element);
569 }
570
571 /* Free all files and nodes. */
572 if (c->hash) {
573 jffs_foreach_file(c, jffs_free_node_list);
574 jffs_foreach_file(c, jffs_free_file);
575 kfree(c->hash);
576 DJM(no_hash--);
577 }
578 jffs_cleanup_fmcontrol(c->fmc);
579 kfree(c);
580 DJM(no_jffs_control--);
581 D3(printk("jffs_cleanup_control(): Leaving...\n"));
582}
583
584
585/* This function adds a virtual root node to the in-RAM representation.
586 Called by jffs_build_fs(). */
587static int
588jffs_add_virtual_root(struct jffs_control *c)
589{
590 struct jffs_file *root;
591 struct jffs_node *node;
592
593 D2(printk("jffs_add_virtual_root(): "
594 "Creating a virtual root directory.\n"));
595
596 if (!(root = (struct jffs_file *)kmalloc(sizeof(struct jffs_file),
597 GFP_KERNEL))) {
598 return -ENOMEM;
599 }
600 no_jffs_file++;
601 if (!(node = jffs_alloc_node())) {
602 kfree(root);
603 no_jffs_file--;
604 return -ENOMEM;
605 }
606 DJM(no_jffs_node++);
607 memset(node, 0, sizeof(struct jffs_node));
608 node->ino = JFFS_MIN_INO;
609 memset(root, 0, sizeof(struct jffs_file));
610 root->ino = JFFS_MIN_INO;
611 root->mode = S_IFDIR | S_IRWXU | S_IRGRP
612 | S_IXGRP | S_IROTH | S_IXOTH;
613 root->atime = root->mtime = root->ctime = get_seconds();
614 root->nlink = 1;
615 root->c = c;
616 root->version_head = root->version_tail = node;
617 jffs_insert_file_into_hash(root);
618 return 0;
619}
620
621
622/* This is where the file system is built and initialized. */
623int
624jffs_build_fs(struct super_block *sb)
625{
626 struct jffs_control *c;
627 int err = 0;
628
629 D2(printk("jffs_build_fs()\n"));
630
631 if (!(c = jffs_create_control(sb))) {
632 return -ENOMEM;
633 }
634 c->building_fs = 1;
635 c->sb = sb;
636 if ((err = jffs_scan_flash(c)) < 0) {
637 if(err == -EAGAIN){
638 /* scan_flash() wants us to try once more. A flipping
639 bits sector was detect in the middle of the scan flash.
640 Clean up old allocated memory before going in.
641 */
642 D1(printk("jffs_build_fs: Cleaning up all control structures,"
643 " reallocating them and trying mount again.\n"));
644 jffs_cleanup_control(c);
645 if (!(c = jffs_create_control(sb))) {
646 return -ENOMEM;
647 }
648 c->building_fs = 1;
649 c->sb = sb;
650
651 if ((err = jffs_scan_flash(c)) < 0) {
652 goto jffs_build_fs_fail;
653 }
654 }else{
655 goto jffs_build_fs_fail;
656 }
657 }
658
659 /* Add a virtual root node if no one exists. */
660 if (!jffs_find_file(c, JFFS_MIN_INO)) {
661 if ((err = jffs_add_virtual_root(c)) < 0) {
662 goto jffs_build_fs_fail;
663 }
664 }
665
666 while (c->delete_list) {
667 struct jffs_file *f;
668 struct jffs_delete_list *delete_list_element;
669
670 if ((f = jffs_find_file(c, c->delete_list->ino))) {
671 f->deleted = 1;
672 }
673 delete_list_element = c->delete_list;
674 c->delete_list = c->delete_list->next;
675 kfree(delete_list_element);
676 }
677
678 /* Remove deleted nodes. */
679 if ((err = jffs_foreach_file(c, jffs_possibly_delete_file)) < 0) {
680 printk(KERN_ERR "JFFS: Failed to remove deleted nodes.\n");
681 goto jffs_build_fs_fail;
682 }
683 /* Remove redundant nodes. (We are not interested in the
684 return value in this case.) */
685 jffs_foreach_file(c, jffs_remove_redundant_nodes);
686 /* Try to build a tree from all the nodes. */
687 if ((err = jffs_foreach_file(c, jffs_insert_file_into_tree)) < 0) {
688 printk("JFFS: Failed to build tree.\n");
689 goto jffs_build_fs_fail;
690 }
691 /* Compute the sizes of all files in the filesystem. Adjust if
692 necessary. */
693 if ((err = jffs_foreach_file(c, jffs_build_file)) < 0) {
694 printk("JFFS: Failed to build file system.\n");
695 goto jffs_build_fs_fail;
696 }
697 sb->s_fs_info = (void *)c;
698 c->building_fs = 0;
699
700 D1(jffs_print_hash_table(c));
701 D1(jffs_print_tree(c->root, 0));
702
703 return 0;
704
705jffs_build_fs_fail:
706 jffs_cleanup_control(c);
707 return err;
708} /* jffs_build_fs() */
709
710
711/*
712 This checks for sectors that were being erased in their previous
713 lifetimes and for some reason or the other (power fail etc.),
714 the erase cycles never completed.
715 As the flash array would have reverted back to read status,
716 these sectors are detected by the symptom of the "flipping bits",
717 i.e. bits being read back differently from the same location in
718 flash if read multiple times.
719 The only solution to this is to re-erase the entire
720 sector.
721 Unfortunately detecting "flipping bits" is not a simple exercise
722 as a bit may be read back at 1 or 0 depending on the alignment
723 of the stars in the universe.
724 The level of confidence is in direct proportion to the number of
725 scans done. By power fail testing I (Vipin) have been able to
726 proove that reading twice is not enough.
727 Maybe 4 times? Change NUM_REREADS to a higher number if you want
728 a (even) higher degree of confidence in your mount process.
729 A higher number would of course slow down your mount.
730*/
731static int check_partly_erased_sectors(struct jffs_fmcontrol *fmc){
732
733#define NUM_REREADS 4 /* see note above */
734#define READ_AHEAD_BYTES 4096 /* must be a multiple of 4,
735 usually set to kernel page size */
736
737 __u8 *read_buf1;
738 __u8 *read_buf2;
739
740 int err = 0;
741 int retlen;
742 int i;
743 int cnt;
744 __u32 offset;
745 loff_t pos = 0;
746 loff_t end = fmc->flash_size;
747
748
749 /* Allocate read buffers */
750 read_buf1 = (__u8 *) kmalloc (sizeof(__u8) * READ_AHEAD_BYTES, GFP_KERNEL);
751 if (!read_buf1)
752 return -ENOMEM;
753
754 read_buf2 = (__u8 *) kmalloc (sizeof(__u8) * READ_AHEAD_BYTES, GFP_KERNEL);
755 if (!read_buf2) {
756 kfree(read_buf1);
757 return -ENOMEM;
758 }
759
760 CHECK_NEXT:
761 while(pos < end){
762
763 D1(printk("check_partly_erased_sector():checking sector which contains"
764 " offset 0x%x for flipping bits..\n", (__u32)pos));
765
766 retlen = flash_safe_read(fmc->mtd, pos,
767 &read_buf1[0], READ_AHEAD_BYTES);
768 retlen &= ~3;
769
770 for(cnt = 0; cnt < NUM_REREADS; cnt++){
771 (void)flash_safe_read(fmc->mtd, pos,
772 &read_buf2[0], READ_AHEAD_BYTES);
773
774 for (i=0 ; i < retlen ; i+=4) {
775 /* buffers MUST match, double word for word! */
776 if(*((__u32 *) &read_buf1[i]) !=
777 *((__u32 *) &read_buf2[i])
778 ){
779 /* flipping bits detected, time to erase sector */
780 /* This will help us log some statistics etc. */
781 D1(printk("Flipping bits detected in re-read round:%i of %i\n",
782 cnt, NUM_REREADS));
783 D1(printk("check_partly_erased_sectors:flipping bits detected"
784 " @offset:0x%x(0x%x!=0x%x)\n",
785 (__u32)pos+i, *((__u32 *) &read_buf1[i]),
786 *((__u32 *) &read_buf2[i])));
787
788 /* calculate start of present sector */
789 offset = (((__u32)pos+i)/(__u32)fmc->sector_size) * (__u32)fmc->sector_size;
790
791 D1(printk("check_partly_erased_sector():erasing sector starting 0x%x.\n",
792 offset));
793
794 if (flash_erase_region(fmc->mtd,
795 offset, fmc->sector_size) < 0) {
796 printk(KERN_ERR "JFFS: Erase of flash failed. "
797 "offset = %u, erase_size = %d\n",
798 offset , fmc->sector_size);
799
800 err = -EIO;
801 goto returnBack;
802
803 }else{
804 D1(printk("JFFS: Erase of flash sector @0x%x successful.\n",
805 offset));
806 /* skip ahead to the next sector */
807 pos = (((__u32)pos+i)/(__u32)fmc->sector_size) * (__u32)fmc->sector_size;
808 pos += fmc->sector_size;
809 goto CHECK_NEXT;
810 }
811 }
812 }
813 }
814 pos += READ_AHEAD_BYTES;
815 }
816
817 returnBack:
818 kfree(read_buf1);
819 kfree(read_buf2);
820
821 D2(printk("check_partly_erased_sector():Done checking all sectors till offset 0x%x for flipping bits.\n",
822 (__u32)pos));
823
824 return err;
825
826}/* end check_partly_erased_sectors() */
827
828
829
830/* Scan the whole flash memory in order to find all nodes in the
831 file systems. */
832static int
833jffs_scan_flash(struct jffs_control *c)
834{
835 char name[JFFS_MAX_NAME_LEN + 2];
836 struct jffs_raw_inode raw_inode;
837 struct jffs_node *node = NULL;
838 struct jffs_fmcontrol *fmc = c->fmc;
839 __u32 checksum;
840 __u8 tmp_accurate;
841 __u16 tmp_chksum;
842 __u32 deleted_file;
843 loff_t pos = 0;
844 loff_t start;
845 loff_t test_start;
846 loff_t end = fmc->flash_size;
847 __u8 *read_buf;
848 int i, len, retlen;
849 __u32 offset;
850
851 __u32 free_chunk_size1;
852 __u32 free_chunk_size2;
853
854
855#define NUMFREEALLOWED 2 /* 2 chunks of at least erase size space allowed */
856 int num_free_space = 0; /* Flag err if more than TWO
857 free blocks found. This is NOT allowed
858 by the current jffs design.
859 */
860 int num_free_spc_not_accp = 0; /* For debugging purposed keep count
861 of how much free space was rejected and
862 marked dirty
863 */
864
865 D1(printk("jffs_scan_flash(): start pos = 0x%lx, end = 0x%lx\n",
866 (long)pos, (long)end));
867
868 flash_safe_acquire(fmc->mtd);
869
870 /*
871 check and make sure that any sector does not suffer
872 from the "partly erased, bit flipping syndrome" (TM Vipin :)
873 If so, offending sectors will be erased.
874 */
875 if(check_partly_erased_sectors(fmc) < 0){
876
877 flash_safe_release(fmc->mtd);
878 return -EIO; /* bad, bad, bad error. Cannot continue.*/
879 }
880
881 /* Allocate read buffer */
882 read_buf = (__u8 *) kmalloc (sizeof(__u8) * 4096, GFP_KERNEL);
883 if (!read_buf) {
884 flash_safe_release(fmc->mtd);
885 return -ENOMEM;
886 }
887
888 /* Start the scan. */
889 while (pos < end) {
890 deleted_file = 0;
891
892 /* Remember the position from where we started this scan. */
893 start = pos;
894
895 switch (flash_read_u32(fmc->mtd, pos)) {
896 case JFFS_EMPTY_BITMASK:
897 /* We have found 0xffffffff at this position. We have to
898 scan the rest of the flash till the end or till
899 something else than 0xffffffff is found.
900 Keep going till we do not find JFFS_EMPTY_BITMASK
901 anymore */
902
903 D1(printk("jffs_scan_flash(): 0xffffffff at pos 0x%lx.\n",
904 (long)pos));
905
906 while(pos < end){
907
908 len = end - pos < 4096 ? end - pos : 4096;
909
910 retlen = flash_safe_read(fmc->mtd, pos,
911 &read_buf[0], len);
912
913 retlen &= ~3;
914
915 for (i=0 ; i < retlen ; i+=4, pos += 4) {
916 if(*((__u32 *) &read_buf[i]) !=
917 JFFS_EMPTY_BITMASK)
918 break;
919 }
920 if (i == retlen)
921 continue;
922 else
923 break;
924 }
925
926 D1(printk("jffs_scan_flash():0xffffffff ended at pos 0x%lx.\n",
927 (long)pos));
928
929 /* If some free space ends in the middle of a sector,
930 treat it as dirty rather than clean.
931 This is to handle the case where one thread
932 allocated space for a node, but didn't get to
933 actually _write_ it before power was lost, leaving
934 a gap in the log. Shifting all node writes into
935 a single kernel thread will fix the original problem.
936 */
937 if ((__u32) pos % fmc->sector_size) {
938 /* If there was free space in previous
939 sectors, don't mark that dirty too -
940 only from the beginning of this sector
941 (or from start)
942 */
943
944 test_start = pos & ~(fmc->sector_size-1); /* end of last sector */
945
946 if (start < test_start) {
947
948 /* free space started in the previous sector! */
949
950 if((num_free_space < NUMFREEALLOWED) &&
951 ((unsigned int)(test_start - start) >= fmc->sector_size)){
952
953 /*
954 Count it in if we are still under NUMFREEALLOWED *and* it is
955 at least 1 erase sector in length. This will keep us from
956 picking any little ole' space as "free".
957 */
958
959 D1(printk("Reducing end of free space to 0x%x from 0x%x\n",
960 (unsigned int)test_start, (unsigned int)pos));
961
962 D1(printk("Free space accepted: Starting 0x%x for 0x%x bytes\n",
963 (unsigned int) start,
964 (unsigned int)(test_start - start)));
965
966 /* below, space from "start" to "pos" will be marked dirty. */
967 start = test_start;
968
969 /* Being in here means that we have found at least an entire
970 erase sector size of free space ending on a sector boundary.
971 Keep track of free spaces accepted.
972 */
973 num_free_space++;
974 }else{
975 num_free_spc_not_accp++;
976 D1(printk("Free space (#%i) found but *Not* accepted: Starting"
977 " 0x%x for 0x%x bytes\n",
978 num_free_spc_not_accp, (unsigned int)start,
979 (unsigned int)((unsigned int)(pos & ~(fmc->sector_size-1)) - (unsigned int)start)));
980
981 }
982
983 }
984 if((((__u32)(pos - start)) != 0)){
985
986 D1(printk("Dirty space: Starting 0x%x for 0x%x bytes\n",
987 (unsigned int) start, (unsigned int) (pos - start)));
988 jffs_fmalloced(fmc, (__u32) start,
989 (__u32) (pos - start), NULL);
990 }else{
991 /* "Flipping bits" detected. This means that our scan for them
992 did not catch this offset. See check_partly_erased_sectors() for
993 more info.
994 */
995
996 D1(printk("jffs_scan_flash():wants to allocate dirty flash "
997 "space for 0 bytes.\n"));
998 D1(printk("jffs_scan_flash(): Flipping bits! We will free "
999 "all allocated memory, erase this sector and remount\n"));
1000
1001 /* calculate start of present sector */
1002 offset = (((__u32)pos)/(__u32)fmc->sector_size) * (__u32)fmc->sector_size;
1003
1004 D1(printk("jffs_scan_flash():erasing sector starting 0x%x.\n",
1005 offset));
1006
1007 if (flash_erase_region(fmc->mtd,
1008 offset, fmc->sector_size) < 0) {
1009 printk(KERN_ERR "JFFS: Erase of flash failed. "
1010 "offset = %u, erase_size = %d\n",
1011 offset , fmc->sector_size);
1012
1013 flash_safe_release(fmc->mtd);
1014 kfree (read_buf);
1015 return -1; /* bad, bad, bad! */
1016
1017 }
1018 flash_safe_release(fmc->mtd);
1019 kfree (read_buf);
1020
1021 return -EAGAIN; /* erased offending sector. Try mount one more time please. */
1022 }
1023 }else{
1024 /* Being in here means that we have found free space that ends on an erase sector
1025 boundary.
1026 Count it in if we are still under NUMFREEALLOWED *and* it is at least 1 erase
1027 sector in length. This will keep us from picking any little ole' space as "free".
1028 */
1029 if((num_free_space < NUMFREEALLOWED) &&
1030 ((unsigned int)(pos - start) >= fmc->sector_size)){
1031 /* We really don't do anything to mark space as free, except *not*
1032 mark it dirty and just advance the "pos" location pointer.
1033 It will automatically be picked up as free space.
1034 */
1035 num_free_space++;
1036 D1(printk("Free space accepted: Starting 0x%x for 0x%x bytes\n",
1037 (unsigned int) start, (unsigned int) (pos - start)));
1038 }else{
1039 num_free_spc_not_accp++;
1040 D1(printk("Free space (#%i) found but *Not* accepted: Starting "
1041 "0x%x for 0x%x bytes\n", num_free_spc_not_accp,
1042 (unsigned int) start,
1043 (unsigned int) (pos - start)));
1044
1045 /* Mark this space as dirty. We already have our free space. */
1046 D1(printk("Dirty space: Starting 0x%x for 0x%x bytes\n",
1047 (unsigned int) start, (unsigned int) (pos - start)));
1048 jffs_fmalloced(fmc, (__u32) start,
1049 (__u32) (pos - start), NULL);
1050 }
1051
1052 }
1053 if(num_free_space > NUMFREEALLOWED){
1054 printk(KERN_WARNING "jffs_scan_flash(): Found free space "
1055 "number %i. Only %i free space is allowed.\n",
1056 num_free_space, NUMFREEALLOWED);
1057 }
1058 continue;
1059
1060 case JFFS_DIRTY_BITMASK:
1061 /* We have found 0x00000000 at this position. Scan as far
1062 as possible to find out how much is dirty. */
1063 D1(printk("jffs_scan_flash(): 0x00000000 at pos 0x%lx.\n",
1064 (long)pos));
1065 for (; pos < end
1066 && JFFS_DIRTY_BITMASK == flash_read_u32(fmc->mtd, pos);
1067 pos += 4);
1068 D1(printk("jffs_scan_flash(): 0x00 ended at "
1069 "pos 0x%lx.\n", (long)pos));
1070 jffs_fmalloced(fmc, (__u32) start,
1071 (__u32) (pos - start), NULL);
1072 continue;
1073
1074 case JFFS_MAGIC_BITMASK:
1075 /* We have probably found a new raw inode. */
1076 break;
1077
1078 default:
1079 bad_inode:
1080 /* We're f*cked. This is not solved yet. We have
1081 to scan for the magic pattern. */
1082 D1(printk("*************** Dirty flash memory or "
1083 "bad inode: "
1084 "hexdump(pos = 0x%lx, len = 128):\n",
1085 (long)pos));
1086 D1(jffs_hexdump(fmc->mtd, pos, 128));
1087
1088 for (pos += 4; pos < end; pos += 4) {
1089 switch (flash_read_u32(fmc->mtd, pos)) {
1090 case JFFS_MAGIC_BITMASK:
1091 case JFFS_EMPTY_BITMASK:
1092 /* handle these in the main switch() loop */
1093 goto cont_scan;
1094
1095 default:
1096 break;
1097 }
1098 }
1099
1100 cont_scan:
1101 /* First, mark as dirty the region
1102 which really does contain crap. */
1103 jffs_fmalloced(fmc, (__u32) start,
1104 (__u32) (pos - start),
1105 NULL);
1106
1107 continue;
1108 }/* switch */
1109
1110 /* We have found the beginning of an inode. Create a
1111 node for it unless there already is one available. */
1112 if (!node) {
1113 if (!(node = jffs_alloc_node())) {
1114 /* Free read buffer */
1115 kfree (read_buf);
1116
1117 /* Release the flash device */
1118 flash_safe_release(fmc->mtd);
1119
1120 return -ENOMEM;
1121 }
1122 DJM(no_jffs_node++);
1123 }
1124
1125 /* Read the next raw inode. */
1126
1127 flash_safe_read(fmc->mtd, pos, (u_char *) &raw_inode,
1128 sizeof(struct jffs_raw_inode));
1129
1130 /* When we compute the checksum for the inode, we never
1131 count the 'accurate' or the 'checksum' fields. */
1132 tmp_accurate = raw_inode.accurate;
1133 tmp_chksum = raw_inode.chksum;
1134 raw_inode.accurate = 0;
1135 raw_inode.chksum = 0;
1136 checksum = jffs_checksum(&raw_inode,
1137 sizeof(struct jffs_raw_inode));
1138 raw_inode.accurate = tmp_accurate;
1139 raw_inode.chksum = tmp_chksum;
1140
1141 D3(printk("*** We have found this raw inode at pos 0x%lx "
1142 "on the flash:\n", (long)pos));
1143 D3(jffs_print_raw_inode(&raw_inode));
1144
1145 if (checksum != raw_inode.chksum) {
1146 D1(printk("jffs_scan_flash(): Bad checksum: "
1147 "checksum = %u, "
1148 "raw_inode.chksum = %u\n",
1149 checksum, raw_inode.chksum));
1150 pos += sizeof(struct jffs_raw_inode);
1151 jffs_fmalloced(fmc, (__u32) start,
1152 (__u32) (pos - start), NULL);
1153 /* Reuse this unused struct jffs_node. */
1154 continue;
1155 }
1156
1157 /* Check the raw inode read so far. Start with the
1158 maximum length of the filename. */
1159 if (raw_inode.nsize > JFFS_MAX_NAME_LEN) {
1160 printk(KERN_WARNING "jffs_scan_flash: Found a "
1161 "JFFS node with name too large\n");
1162 goto bad_inode;
1163 }
1164
1165 if (raw_inode.rename && raw_inode.dsize != sizeof(__u32)) {
1166 printk(KERN_WARNING "jffs_scan_flash: Found a "
1167 "rename node with dsize %u.\n",
1168 raw_inode.dsize);
1169 jffs_print_raw_inode(&raw_inode);
1170 goto bad_inode;
1171 }
1172
1173 /* The node's data segment should not exceed a
1174 certain length. */
1175 if (raw_inode.dsize > fmc->max_chunk_size) {
1176 printk(KERN_WARNING "jffs_scan_flash: Found a "
1177 "JFFS node with dsize (0x%x) > max_chunk_size (0x%x)\n",
1178 raw_inode.dsize, fmc->max_chunk_size);
1179 goto bad_inode;
1180 }
1181
1182 pos += sizeof(struct jffs_raw_inode);
1183
1184 /* This shouldn't be necessary because a node that
1185 violates the flash boundaries shouldn't be written
1186 in the first place. */
1187 if (pos >= end) {
1188 goto check_node;
1189 }
1190
1191 /* Read the name. */
1192 *name = 0;
1193 if (raw_inode.nsize) {
1194 flash_safe_read(fmc->mtd, pos, name, raw_inode.nsize);
1195 name[raw_inode.nsize] = '\0';
1196 pos += raw_inode.nsize
1197 + JFFS_GET_PAD_BYTES(raw_inode.nsize);
1198 D3(printk("name == \"%s\"\n", name));
1199 checksum = jffs_checksum(name, raw_inode.nsize);
1200 if (checksum != raw_inode.nchksum) {
1201 D1(printk("jffs_scan_flash(): Bad checksum: "
1202 "checksum = %u, "
1203 "raw_inode.nchksum = %u\n",
1204 checksum, raw_inode.nchksum));
1205 jffs_fmalloced(fmc, (__u32) start,
1206 (__u32) (pos - start), NULL);
1207 /* Reuse this unused struct jffs_node. */
1208 continue;
1209 }
1210 if (pos >= end) {
1211 goto check_node;
1212 }
1213 }
1214
1215 /* Read the data, if it exists, in order to be sure it
1216 matches the checksum. */
1217 if (raw_inode.dsize) {
1218 if (raw_inode.rename) {
1219 deleted_file = flash_read_u32(fmc->mtd, pos);
1220 }
1221 if (jffs_checksum_flash(fmc->mtd, pos, raw_inode.dsize, &checksum)) {
1222 printk("jffs_checksum_flash() failed to calculate a checksum\n");
1223 jffs_fmalloced(fmc, (__u32) start,
1224 (__u32) (pos - start), NULL);
1225 /* Reuse this unused struct jffs_node. */
1226 continue;
1227 }
1228 pos += raw_inode.dsize
1229 + JFFS_GET_PAD_BYTES(raw_inode.dsize);
1230
1231 if (checksum != raw_inode.dchksum) {
1232 D1(printk("jffs_scan_flash(): Bad checksum: "
1233 "checksum = %u, "
1234 "raw_inode.dchksum = %u\n",
1235 checksum, raw_inode.dchksum));
1236 jffs_fmalloced(fmc, (__u32) start,
1237 (__u32) (pos - start), NULL);
1238 /* Reuse this unused struct jffs_node. */
1239 continue;
1240 }
1241 }
1242
1243 check_node:
1244
1245 /* Remember the highest inode number in the whole file
1246 system. This information will be used when assigning
1247 new files new inode numbers. */
1248 if (c->next_ino <= raw_inode.ino) {
1249 c->next_ino = raw_inode.ino + 1;
1250 }
1251
1252 if (raw_inode.accurate) {
1253 int err;
1254 node->data_offset = raw_inode.offset;
1255 node->data_size = raw_inode.dsize;
1256 node->removed_size = raw_inode.rsize;
1257 /* Compute the offset to the actual data in the
1258 on-flash node. */
1259 node->fm_offset
1260 = sizeof(struct jffs_raw_inode)
1261 + raw_inode.nsize
1262 + JFFS_GET_PAD_BYTES(raw_inode.nsize);
1263 node->fm = jffs_fmalloced(fmc, (__u32) start,
1264 (__u32) (pos - start),
1265 node);
1266 if (!node->fm) {
1267 D(printk("jffs_scan_flash(): !node->fm\n"));
1268 jffs_free_node(node);
1269 DJM(no_jffs_node--);
1270
1271 /* Free read buffer */
1272 kfree (read_buf);
1273
1274 /* Release the flash device */
1275 flash_safe_release(fmc->mtd);
1276
1277 return -ENOMEM;
1278 }
1279 if ((err = jffs_insert_node(c, NULL, &raw_inode,
1280 name, node)) < 0) {
1281 printk("JFFS: Failed to handle raw inode. "
1282 "(err = %d)\n", err);
1283 break;
1284 }
1285 if (raw_inode.rename) {
1286 struct jffs_delete_list *dl
1287 = (struct jffs_delete_list *)
1288 kmalloc(sizeof(struct jffs_delete_list),
1289 GFP_KERNEL);
1290 if (!dl) {
1291 D(printk("jffs_scan_flash: !dl\n"));
1292 jffs_free_node(node);
1293 DJM(no_jffs_node--);
1294
1295 /* Release the flash device */
1296 flash_safe_release(fmc->flash_part);
1297
1298 /* Free read buffer */
1299 kfree (read_buf);
1300
1301 return -ENOMEM;
1302 }
1303 dl->ino = deleted_file;
1304 dl->next = c->delete_list;
1305 c->delete_list = dl;
1306 node->data_size = 0;
1307 }
1308 D3(jffs_print_node(node));
1309 node = NULL; /* Don't free the node! */
1310 }
1311 else {
1312 jffs_fmalloced(fmc, (__u32) start,
1313 (__u32) (pos - start), NULL);
1314 D3(printk("jffs_scan_flash(): Just found an obsolete "
1315 "raw_inode. Continuing the scan...\n"));
1316 /* Reuse this unused struct jffs_node. */
1317 }
1318 }
1319
1320 if (node) {
1321 jffs_free_node(node);
1322 DJM(no_jffs_node--);
1323 }
1324 jffs_build_end(fmc);
1325
1326 /* Free read buffer */
1327 kfree (read_buf);
1328
1329 if(!num_free_space){
1330 printk(KERN_WARNING "jffs_scan_flash(): Did not find even a single "
1331 "chunk of free space. This is BAD!\n");
1332 }
1333
1334 /* Return happy */
1335 D3(printk("jffs_scan_flash(): Leaving...\n"));
1336 flash_safe_release(fmc->mtd);
1337
1338 /* This is to trap the "free size accounting screwed error. */
1339 free_chunk_size1 = jffs_free_size1(fmc);
1340 free_chunk_size2 = jffs_free_size2(fmc);
1341
1342 if (free_chunk_size1 + free_chunk_size2 != fmc->free_size) {
1343
1344 printk(KERN_WARNING "jffs_scan_falsh():Free size accounting screwed\n");
1345 printk(KERN_WARNING "jfffs_scan_flash():free_chunk_size1 == 0x%x, "
1346 "free_chunk_size2 == 0x%x, fmc->free_size == 0x%x\n",
1347 free_chunk_size1, free_chunk_size2, fmc->free_size);
1348
1349 return -1; /* Do NOT mount f/s so that we can inspect what happened.
1350 Mounting this screwed up f/s will screw us up anyway.
1351 */
1352 }
1353
1354 return 0; /* as far as we are concerned, we are happy! */
1355} /* jffs_scan_flash() */
1356
1357
1358/* Insert any kind of node into the file system. Take care of data
1359 insertions and deletions. Also remove redundant information. The
1360 memory allocated for the `name' is regarded as "given away" in the
1361 caller's perspective. */
1362int
1363jffs_insert_node(struct jffs_control *c, struct jffs_file *f,
1364 const struct jffs_raw_inode *raw_inode,
1365 const char *name, struct jffs_node *node)
1366{
1367 int update_name = 0;
1368 int insert_into_tree = 0;
1369
1370 D2(printk("jffs_insert_node(): ino = %u, version = %u, "
1371 "name = \"%s\", deleted = %d\n",
1372 raw_inode->ino, raw_inode->version,
1373 ((name && *name) ? name : ""), raw_inode->deleted));
1374
1375 /* If there doesn't exist an associated jffs_file, then
1376 create, initialize and insert one into the file system. */
1377 if (!f && !(f = jffs_find_file(c, raw_inode->ino))) {
1378 if (!(f = jffs_create_file(c, raw_inode))) {
1379 return -ENOMEM;
1380 }
1381 jffs_insert_file_into_hash(f);
1382 insert_into_tree = 1;
1383 }
1384 node->ino = raw_inode->ino;
1385 node->version = raw_inode->version;
1386 node->data_size = raw_inode->dsize;
1387 node->fm_offset = sizeof(struct jffs_raw_inode) + raw_inode->nsize
1388 + JFFS_GET_PAD_BYTES(raw_inode->nsize);
1389 node->name_size = raw_inode->nsize;
1390
1391 /* Now insert the node at the correct position into the file's
1392 version list. */
1393 if (!f->version_head) {
1394 /* This is the first node. */
1395 f->version_head = node;
1396 f->version_tail = node;
1397 node->version_prev = NULL;
1398 node->version_next = NULL;
1399 f->highest_version = node->version;
1400 update_name = 1;
1401 f->mode = raw_inode->mode;
1402 f->uid = raw_inode->uid;
1403 f->gid = raw_inode->gid;
1404 f->atime = raw_inode->atime;
1405 f->mtime = raw_inode->mtime;
1406 f->ctime = raw_inode->ctime;
1407 }
1408 else if ((f->highest_version < node->version)
1409 || (node->version == 0)) {
1410 /* Insert at the end of the list. I.e. this node is the
1411 newest one so far. */
1412 node->version_prev = f->version_tail;
1413 node->version_next = NULL;
1414 f->version_tail->version_next = node;
1415 f->version_tail = node;
1416 f->highest_version = node->version;
1417 update_name = 1;
1418 f->pino = raw_inode->pino;
1419 f->mode = raw_inode->mode;
1420 f->uid = raw_inode->uid;
1421 f->gid = raw_inode->gid;
1422 f->atime = raw_inode->atime;
1423 f->mtime = raw_inode->mtime;
1424 f->ctime = raw_inode->ctime;
1425 }
1426 else if (f->version_head->version > node->version) {
1427 /* Insert at the bottom of the list. */
1428 node->version_prev = NULL;
1429 node->version_next = f->version_head;
1430 f->version_head->version_prev = node;
1431 f->version_head = node;
1432 if (!f->name) {
1433 update_name = 1;
1434 }
1435 }
1436 else {
1437 struct jffs_node *n;
1438 int newer_name = 0;
1439 /* Search for the insertion position starting from
1440 the tail (newest node). */
1441 for (n = f->version_tail; n; n = n->version_prev) {
1442 if (n->version < node->version) {
1443 node->version_prev = n;
1444 node->version_next = n->version_next;
1445 node->version_next->version_prev = node;
1446 n->version_next = node;
1447 if (!newer_name) {
1448 update_name = 1;
1449 }
1450 break;
1451 }
1452 if (n->name_size) {
1453 newer_name = 1;
1454 }
1455 }
1456 }
1457
1458 /* Deletion is irreversible. If any 'deleted' node is ever
1459 written, the file is deleted */
1460 if (raw_inode->deleted)
1461 f->deleted = raw_inode->deleted;
1462
1463 /* Perhaps update the name. */
1464 if (raw_inode->nsize && update_name && name && *name && (name != f->name)) {
1465 if (f->name) {
1466 kfree(f->name);
1467 DJM(no_name--);
1468 }
1469 if (!(f->name = (char *) kmalloc(raw_inode->nsize + 1,
1470 GFP_KERNEL))) {
1471 return -ENOMEM;
1472 }
1473 DJM(no_name++);
1474 memcpy(f->name, name, raw_inode->nsize);
1475 f->name[raw_inode->nsize] = '\0';
1476 f->nsize = raw_inode->nsize;
1477 D3(printk("jffs_insert_node(): Updated the name of "
1478 "the file to \"%s\".\n", name));
1479 }
1480
1481 if (!c->building_fs) {
1482 D3(printk("jffs_insert_node(): ---------------------------"
1483 "------------------------------------------- 1\n"));
1484 if (insert_into_tree) {
1485 jffs_insert_file_into_tree(f);
1486 }
1487 /* Once upon a time, we would call jffs_possibly_delete_file()
1488 here. That causes an oops if someone's still got the file
1489 open, so now we only do it in jffs_delete_inode()
1490 -- dwmw2
1491 */
1492 if (node->data_size || node->removed_size) {
1493 jffs_update_file(f, node);
1494 }
1495 jffs_remove_redundant_nodes(f);
1496
1497 jffs_garbage_collect_trigger(c);
1498
1499 D3(printk("jffs_insert_node(): ---------------------------"
1500 "------------------------------------------- 2\n"));
1501 }
1502
1503 return 0;
1504} /* jffs_insert_node() */
1505
1506
1507/* Unlink a jffs_node from the version list it is in. */
1508static inline void
1509jffs_unlink_node_from_version_list(struct jffs_file *f,
1510 struct jffs_node *node)
1511{
1512 if (node->version_prev) {
1513 node->version_prev->version_next = node->version_next;
1514 } else {
1515 f->version_head = node->version_next;
1516 }
1517 if (node->version_next) {
1518 node->version_next->version_prev = node->version_prev;
1519 } else {
1520 f->version_tail = node->version_prev;
1521 }
1522}
1523
1524
1525/* Unlink a jffs_node from the range list it is in. */
1526static inline void
1527jffs_unlink_node_from_range_list(struct jffs_file *f, struct jffs_node *node)
1528{
1529 if (node->range_prev) {
1530 node->range_prev->range_next = node->range_next;
1531 }
1532 else {
1533 f->range_head = node->range_next;
1534 }
1535 if (node->range_next) {
1536 node->range_next->range_prev = node->range_prev;
1537 }
1538 else {
1539 f->range_tail = node->range_prev;
1540 }
1541}
1542
1543
1544/* Function used by jffs_remove_redundant_nodes() below. This function
1545 classifies what kind of information a node adds to a file. */
1546static inline __u8
1547jffs_classify_node(struct jffs_node *node)
1548{
1549 __u8 mod_type = JFFS_MODIFY_INODE;
1550
1551 if (node->name_size) {
1552 mod_type |= JFFS_MODIFY_NAME;
1553 }
1554 if (node->data_size || node->removed_size) {
1555 mod_type |= JFFS_MODIFY_DATA;
1556 }
1557 return mod_type;
1558}
1559
1560
1561/* Remove redundant nodes from a file. Mark the on-flash memory
1562 as dirty. */
1563static int
1564jffs_remove_redundant_nodes(struct jffs_file *f)
1565{
1566 struct jffs_node *newest_node;
1567 struct jffs_node *cur;
1568 struct jffs_node *prev;
1569 __u8 newest_type;
1570 __u8 mod_type;
1571 __u8 node_with_name_later = 0;
1572
1573 if (!(newest_node = f->version_tail)) {
1574 return 0;
1575 }
1576
1577 /* What does the `newest_node' modify? */
1578 newest_type = jffs_classify_node(newest_node);
1579 node_with_name_later = newest_type & JFFS_MODIFY_NAME;
1580
1581 D3(printk("jffs_remove_redundant_nodes(): ino: %u, name: \"%s\", "
1582 "newest_type: %u\n", f->ino, (f->name ? f->name : ""),
1583 newest_type));
1584
1585 /* Traverse the file's nodes and determine which of them that are
1586 superfluous. Yeah, this might look very complex at first
1587 glance but it is actually very simple. */
1588 for (cur = newest_node->version_prev; cur; cur = prev) {
1589 prev = cur->version_prev;
1590 mod_type = jffs_classify_node(cur);
1591 if ((mod_type <= JFFS_MODIFY_INODE)
1592 || ((newest_type & JFFS_MODIFY_NAME)
1593 && (mod_type
1594 <= (JFFS_MODIFY_INODE + JFFS_MODIFY_NAME)))
1595 || (cur->data_size == 0 && cur->removed_size
1596 && !cur->version_prev && node_with_name_later)) {
1597 /* Yes, this node is redundant. Remove it. */
1598 D2(printk("jffs_remove_redundant_nodes(): "
1599 "Removing node: ino: %u, version: %u, "
1600 "mod_type: %u\n", cur->ino, cur->version,
1601 mod_type));
1602 jffs_unlink_node_from_version_list(f, cur);
1603 jffs_fmfree(f->c->fmc, cur->fm, cur);
1604 jffs_free_node(cur);
1605 DJM(no_jffs_node--);
1606 }
1607 else {
1608 node_with_name_later |= (mod_type & JFFS_MODIFY_NAME);
1609 }
1610 }
1611
1612 return 0;
1613}
1614
1615
1616/* Insert a file into the hash table. */
1617static int
1618jffs_insert_file_into_hash(struct jffs_file *f)
1619{
1620 int i = f->ino % f->c->hash_len;
1621
1622 D3(printk("jffs_insert_file_into_hash(): f->ino: %u\n", f->ino));
1623
1624 list_add(&f->hash, &f->c->hash[i]);
1625 return 0;
1626}
1627
1628
1629/* Insert a file into the file system tree. */
1630int
1631jffs_insert_file_into_tree(struct jffs_file *f)
1632{
1633 struct jffs_file *parent;
1634
1635 D3(printk("jffs_insert_file_into_tree(): name: \"%s\"\n",
1636 (f->name ? f->name : "")));
1637
1638 if (!(parent = jffs_find_file(f->c, f->pino))) {
1639 if (f->pino == 0) {
1640 f->c->root = f;
1641 f->parent = NULL;
1642 f->sibling_prev = NULL;
1643 f->sibling_next = NULL;
1644 return 0;
1645 }
1646 else {
1647 D1(printk("jffs_insert_file_into_tree(): Found "
1648 "inode with no parent and pino == %u\n",
1649 f->pino));
1650 return -1;
1651 }
1652 }
1653 f->parent = parent;
1654 f->sibling_next = parent->children;
1655 if (f->sibling_next) {
1656 f->sibling_next->sibling_prev = f;
1657 }
1658 f->sibling_prev = NULL;
1659 parent->children = f;
1660 return 0;
1661}
1662
1663
1664/* Remove a file from the hash table. */
1665static int
1666jffs_unlink_file_from_hash(struct jffs_file *f)
1667{
1668 D3(printk("jffs_unlink_file_from_hash(): f: 0x%p, "
1669 "ino %u\n", f, f->ino));
1670
1671 list_del(&f->hash);
1672 return 0;
1673}
1674
1675
1676/* Just remove the file from the parent's children. Don't free
1677 any memory. */
1678int
1679jffs_unlink_file_from_tree(struct jffs_file *f)
1680{
1681 D3(printk("jffs_unlink_file_from_tree(): ino: %d, pino: %d, name: "
1682 "\"%s\"\n", f->ino, f->pino, (f->name ? f->name : "")));
1683
1684 if (f->sibling_prev) {
1685 f->sibling_prev->sibling_next = f->sibling_next;
1686 }
1687 else if (f->parent) {
1688 D3(printk("f->parent=%p\n", f->parent));
1689 f->parent->children = f->sibling_next;
1690 }
1691 if (f->sibling_next) {
1692 f->sibling_next->sibling_prev = f->sibling_prev;
1693 }
1694 return 0;
1695}
1696
1697
1698/* Find a file with its inode number. */
1699struct jffs_file *
1700jffs_find_file(struct jffs_control *c, __u32 ino)
1701{
1702 struct jffs_file *f;
1703 int i = ino % c->hash_len;
1da177e4
LT
1704
1705 D3(printk("jffs_find_file(): ino: %u\n", ino));
1706
216d81bb 1707 list_for_each_entry(f, &c->hash[i], hash) {
1da177e4
LT
1708 if (ino != f->ino)
1709 continue;
1710 D3(printk("jffs_find_file(): Found file with ino "
1711 "%u. (name: \"%s\")\n",
1712 ino, (f->name ? f->name : ""));
1713 );
1714 return f;
1715 }
1716 D3(printk("jffs_find_file(): Didn't find file "
1717 "with ino %u.\n", ino);
1718 );
1719 return NULL;
1720}
1721
1722
1723/* Find a file in a directory. We are comparing the names. */
1724struct jffs_file *
1725jffs_find_child(struct jffs_file *dir, const char *name, int len)
1726{
1727 struct jffs_file *f;
1728
1729 D3(printk("jffs_find_child()\n"));
1730
1731 for (f = dir->children; f; f = f->sibling_next) {
1732 if (!f->deleted && f->name
1733 && !strncmp(f->name, name, len)
1734 && f->name[len] == '\0') {
1735 break;
1736 }
1737 }
1738
1739 D3(if (f) {
1740 printk("jffs_find_child(): Found \"%s\".\n", f->name);
1741 }
1742 else {
1743 char *copy = (char *) kmalloc(len + 1, GFP_KERNEL);
1744 if (copy) {
1745 memcpy(copy, name, len);
1746 copy[len] = '\0';
1747 }
1748 printk("jffs_find_child(): Didn't find the file \"%s\".\n",
1749 (copy ? copy : ""));
1750 if (copy) {
1751 kfree(copy);
1752 }
1753 });
1754
1755 return f;
1756}
1757
1758
1759/* Write a raw inode that takes up a certain amount of space in the flash
1760 memory. At the end of the flash device, there is often space that is
1761 impossible to use. At these times we want to mark this space as not
1762 used. In the cases when the amount of space is greater or equal than
1763 a struct jffs_raw_inode, we write a "dummy node" that takes up this
1764 space. The space after the raw inode, if it exists, is left as it is.
1765 Since this space after the raw inode contains JFFS_EMPTY_BITMASK bytes,
1766 we can compute the checksum of it; we don't have to manipulate it any
1767 further.
1768
1769 If the space left on the device is less than the size of a struct
1770 jffs_raw_inode, this space is filled with JFFS_DIRTY_BITMASK bytes.
1771 No raw inode is written this time. */
1772static int
1773jffs_write_dummy_node(struct jffs_control *c, struct jffs_fm *dirty_fm)
1774{
1775 struct jffs_fmcontrol *fmc = c->fmc;
1776 int err;
1777
1778 D1(printk("jffs_write_dummy_node(): dirty_fm->offset = 0x%08x, "
1779 "dirty_fm->size = %u\n",
1780 dirty_fm->offset, dirty_fm->size));
1781
1782 if (dirty_fm->size >= sizeof(struct jffs_raw_inode)) {
1783 struct jffs_raw_inode raw_inode;
1784 memset(&raw_inode, 0, sizeof(struct jffs_raw_inode));
1785 raw_inode.magic = JFFS_MAGIC_BITMASK;
1786 raw_inode.dsize = dirty_fm->size
1787 - sizeof(struct jffs_raw_inode);
1788 raw_inode.dchksum = raw_inode.dsize * 0xff;
1789 raw_inode.chksum
1790 = jffs_checksum(&raw_inode, sizeof(struct jffs_raw_inode));
1791
1792 if ((err = flash_safe_write(fmc->mtd,
1793 dirty_fm->offset,
1794 (u_char *)&raw_inode,
1795 sizeof(struct jffs_raw_inode)))
1796 < 0) {
1797 printk(KERN_ERR "JFFS: jffs_write_dummy_node: "
1798 "flash_safe_write failed!\n");
1799 return err;
1800 }
1801 }
1802 else {
1803 flash_safe_acquire(fmc->mtd);
1804 flash_memset(fmc->mtd, dirty_fm->offset, 0, dirty_fm->size);
1805 flash_safe_release(fmc->mtd);
1806 }
1807
1808 D3(printk("jffs_write_dummy_node(): Leaving...\n"));
1809 return 0;
1810}
1811
1812
1813/* Write a raw inode, possibly its name and possibly some data. */
1814int
1815jffs_write_node(struct jffs_control *c, struct jffs_node *node,
1816 struct jffs_raw_inode *raw_inode,
1817 const char *name, const unsigned char *data,
1818 int recoverable,
1819 struct jffs_file *f)
1820{
1821 struct jffs_fmcontrol *fmc = c->fmc;
1822 struct jffs_fm *fm;
1823 struct kvec node_iovec[4];
1824 unsigned long iovec_cnt;
1825
1826 __u32 pos;
1827 int err;
1828 __u32 slack = 0;
1829
1830 __u32 total_name_size = raw_inode->nsize
1831 + JFFS_GET_PAD_BYTES(raw_inode->nsize);
1832 __u32 total_data_size = raw_inode->dsize
1833 + JFFS_GET_PAD_BYTES(raw_inode->dsize);
1834 __u32 total_size = sizeof(struct jffs_raw_inode)
1835 + total_name_size + total_data_size;
1836
1837 /* If this node isn't something that will eventually let
1838 GC free even more space, then don't allow it unless
1839 there's at least max_chunk_size space still available
1840 */
1841 if (!recoverable)
1842 slack = fmc->max_chunk_size;
1843
1844
1845 /* Fire the retrorockets and shoot the fruiton torpedoes, sir! */
1846
1847 ASSERT(if (!node) {
1848 printk("jffs_write_node(): node == NULL\n");
1849 return -EINVAL;
1850 });
1851 ASSERT(if (raw_inode && raw_inode->nsize && !name) {
1852 printk("*** jffs_write_node(): nsize = %u but name == NULL\n",
1853 raw_inode->nsize);
1854 return -EINVAL;
1855 });
1856
1857 D1(printk("jffs_write_node(): filename = \"%s\", ino = %u, "
1858 "total_size = %u\n",
1859 (name ? name : ""), raw_inode->ino,
1860 total_size));
1861
1862 jffs_fm_write_lock(fmc);
1863
1864retry:
1865 fm = NULL;
1866 err = 0;
1867 while (!fm) {
1868
1869 /* Deadlocks suck. */
1870 while(fmc->free_size < fmc->min_free_size + total_size + slack) {
1871 jffs_fm_write_unlock(fmc);
1872 if (!JFFS_ENOUGH_SPACE(c, total_size + slack))
1873 return -ENOSPC;
1874 jffs_fm_write_lock(fmc);
1875 }
1876
1877 /* First try to allocate some flash memory. */
1878 err = jffs_fmalloc(fmc, total_size, node, &fm);
1879
1880 if (err == -ENOSPC) {
1881 /* Just out of space. GC and try again */
1882 if (fmc->dirty_size < fmc->sector_size) {
1883 D(printk("jffs_write_node(): jffs_fmalloc(0x%p, %u) "
1884 "failed, no dirty space to GC\n", fmc,
1885 total_size));
1886 return err;
1887 }
1888
1889 D1(printk(KERN_INFO "jffs_write_node(): Calling jffs_garbage_collect_now()\n"));
1890 jffs_fm_write_unlock(fmc);
1891 if ((err = jffs_garbage_collect_now(c))) {
1892 D(printk("jffs_write_node(): jffs_garbage_collect_now() failed\n"));
1893 return err;
1894 }
1895 jffs_fm_write_lock(fmc);
1896 continue;
1897 }
1898
1899 if (err < 0) {
1900 jffs_fm_write_unlock(fmc);
1901
1902 D(printk("jffs_write_node(): jffs_fmalloc(0x%p, %u) "
1903 "failed!\n", fmc, total_size));
1904 return err;
1905 }
1906
1907 if (!fm->nodes) {
1908 /* The jffs_fm struct that we got is not good enough.
1909 Make that space dirty and try again */
1910 if ((err = jffs_write_dummy_node(c, fm)) < 0) {
1911 kfree(fm);
1912 DJM(no_jffs_fm--);
1913 jffs_fm_write_unlock(fmc);
1914 D(printk("jffs_write_node(): "
1915 "jffs_write_dummy_node(): Failed!\n"));
1916 return err;
1917 }
1918 fm = NULL;
1919 }
1920 } /* while(!fm) */
1921 node->fm = fm;
1922
1923 ASSERT(if (fm->nodes == 0) {
1924 printk(KERN_ERR "jffs_write_node(): fm->nodes == 0\n");
1925 });
1926
1927 pos = node->fm->offset;
1928
1929 /* Increment the version number here. We can't let the caller
1930 set it beforehand, because we might have had to do GC on a node
1931 of this file - and we'd end up reusing version numbers.
1932 */
1933 if (f) {
1934 raw_inode->version = f->highest_version + 1;
1935 D1(printk (KERN_NOTICE "jffs_write_node(): setting version of %s to %d\n", f->name, raw_inode->version));
1936
1937 /* if the file was deleted, set the deleted bit in the raw inode */
1938 if (f->deleted)
1939 raw_inode->deleted = 1;
1940 }
1941
1942 /* Compute the checksum for the data and name chunks. */
1943 raw_inode->dchksum = jffs_checksum(data, raw_inode->dsize);
1944 raw_inode->nchksum = jffs_checksum(name, raw_inode->nsize);
1945
1946 /* The checksum is calculated without the chksum and accurate
1947 fields so set them to zero first. */
1948 raw_inode->accurate = 0;
1949 raw_inode->chksum = 0;
1950 raw_inode->chksum = jffs_checksum(raw_inode,
1951 sizeof(struct jffs_raw_inode));
1952 raw_inode->accurate = 0xff;
1953
1954 D3(printk("jffs_write_node(): About to write this raw inode to the "
1955 "flash at pos 0x%lx:\n", (long)pos));
1956 D3(jffs_print_raw_inode(raw_inode));
1957
1958 /* The actual raw JFFS node */
1959 node_iovec[0].iov_base = (void *) raw_inode;
1960 node_iovec[0].iov_len = (size_t) sizeof(struct jffs_raw_inode);
1961 iovec_cnt = 1;
1962
1963 /* Get name and size if there is one */
1964 if (raw_inode->nsize) {
1965 node_iovec[iovec_cnt].iov_base = (void *) name;
1966 node_iovec[iovec_cnt].iov_len = (size_t) raw_inode->nsize;
1967 iovec_cnt++;
1968
1969 if (JFFS_GET_PAD_BYTES(raw_inode->nsize)) {
1970 static char allff[3]={255,255,255};
1971 /* Add some extra padding if necessary */
1972 node_iovec[iovec_cnt].iov_base = allff;
1973 node_iovec[iovec_cnt].iov_len =
1974 JFFS_GET_PAD_BYTES(raw_inode->nsize);
1975 iovec_cnt++;
1976 }
1977 }
1978
1979 /* Get data and size if there is any */
1980 if (raw_inode->dsize) {
1981 node_iovec[iovec_cnt].iov_base = (void *) data;
1982 node_iovec[iovec_cnt].iov_len = (size_t) raw_inode->dsize;
1983 iovec_cnt++;
1984 /* No need to pad this because we're not actually putting
1985 anything after it.
1986 */
1987 }
1988
1989 if ((err = flash_safe_writev(fmc->mtd, node_iovec, iovec_cnt,
1990 pos)) < 0) {
1991 jffs_fmfree_partly(fmc, fm, 0);
1992 jffs_fm_write_unlock(fmc);
1993 printk(KERN_ERR "JFFS: jffs_write_node: Failed to write, "
1994 "requested %i, wrote %i\n", total_size, err);
1995 goto retry;
1996 }
1997 if (raw_inode->deleted)
1998 f->deleted = 1;
1999
2000 jffs_fm_write_unlock(fmc);
2001 D3(printk("jffs_write_node(): Leaving...\n"));
2002 return raw_inode->dsize;
2003} /* jffs_write_node() */
2004
2005
2006/* Read data from the node and write it to the buffer. 'node_offset'
2007 is how much we have read from this particular node before and which
2008 shouldn't be read again. 'max_size' is how much space there is in
2009 the buffer. */
2010static int
2011jffs_get_node_data(struct jffs_file *f, struct jffs_node *node,
2012 unsigned char *buf,__u32 node_offset, __u32 max_size)
2013{
2014 struct jffs_fmcontrol *fmc = f->c->fmc;
2015 __u32 pos = node->fm->offset + node->fm_offset + node_offset;
2016 __u32 avail = node->data_size - node_offset;
2017 __u32 r;
2018
2019 D2(printk(" jffs_get_node_data(): file: \"%s\", ino: %u, "
2020 "version: %u, node_offset: %u\n",
2021 f->name, node->ino, node->version, node_offset));
2022
2023 r = min(avail, max_size);
2024 D3(printk(KERN_NOTICE "jffs_get_node_data\n"));
2025 flash_safe_read(fmc->mtd, pos, buf, r);
2026
2027 D3(printk(" jffs_get_node_data(): Read %u byte%s.\n",
2028 r, (r == 1 ? "" : "s")));
2029
2030 return r;
2031}
2032
2033
2034/* Read data from the file's nodes. Write the data to the buffer
2035 'buf'. 'read_offset' tells how much data we should skip. */
2036int
2037jffs_read_data(struct jffs_file *f, unsigned char *buf, __u32 read_offset,
2038 __u32 size)
2039{
2040 struct jffs_node *node;
2041 __u32 read_data = 0; /* Total amount of read data. */
2042 __u32 node_offset = 0;
2043 __u32 pos = 0; /* Number of bytes traversed. */
2044
2045 D2(printk("jffs_read_data(): file = \"%s\", read_offset = %d, "
2046 "size = %u\n",
2047 (f->name ? f->name : ""), read_offset, size));
2048
2049 if (read_offset >= f->size) {
2050 D(printk(" f->size: %d\n", f->size));
2051 return 0;
2052 }
2053
2054 /* First find the node to read data from. */
2055 node = f->range_head;
2056 while (pos <= read_offset) {
2057 node_offset = read_offset - pos;
2058 if (node_offset >= node->data_size) {
2059 pos += node->data_size;
2060 node = node->range_next;
2061 }
2062 else {
2063 break;
2064 }
2065 }
2066
2067 /* "Cats are living proof that not everything in nature
2068 has to be useful."
2069 - Garrison Keilor ('97) */
2070
2071 /* Fill the buffer. */
2072 while (node && (read_data < size)) {
2073 int r;
2074 if (!node->fm) {
2075 /* This node does not refer to real data. */
2076 r = min(size - read_data,
2077 node->data_size - node_offset);
2078 memset(&buf[read_data], 0, r);
2079 }
2080 else if ((r = jffs_get_node_data(f, node, &buf[read_data],
2081 node_offset,
2082 size - read_data)) < 0) {
2083 return r;
2084 }
2085 read_data += r;
2086 node_offset = 0;
2087 node = node->range_next;
2088 }
2089 D3(printk(" jffs_read_data(): Read %u bytes.\n", read_data));
2090 return read_data;
2091}
2092
2093
2094/* Used for traversing all nodes in the hash table. */
2095int
2096jffs_foreach_file(struct jffs_control *c, int (*func)(struct jffs_file *))
2097{
2098 int pos;
2099 int r;
2100 int result = 0;
2101
2102 for (pos = 0; pos < c->hash_len; pos++) {
216d81bb
DP
2103 struct jffs_file *f, *next;
2104
2105 /* We must do _safe, because 'func' might remove the
2106 current file 'f' from the list. */
2107 list_for_each_entry_safe(f, next, &c->hash[pos], hash) {
2108 r = func(f);
1da177e4
LT
2109 if (r < 0)
2110 return r;
2111 result += r;
2112 }
2113 }
2114
2115 return result;
2116}
2117
2118
2119/* Free all nodes associated with a file. */
2120static int
2121jffs_free_node_list(struct jffs_file *f)
2122{
2123 struct jffs_node *node;
2124 struct jffs_node *p;
2125
2126 D3(printk("jffs_free_node_list(): f #%u, \"%s\"\n",
2127 f->ino, (f->name ? f->name : "")));
2128 node = f->version_head;
2129 while (node) {
2130 p = node;
2131 node = node->version_next;
2132 jffs_free_node(p);
2133 DJM(no_jffs_node--);
2134 }
2135 return 0;
2136}
2137
2138
2139/* Free a file and its name. */
2140static int
2141jffs_free_file(struct jffs_file *f)
2142{
2143 D3(printk("jffs_free_file: f #%u, \"%s\"\n",
2144 f->ino, (f->name ? f->name : "")));
2145
2146 if (f->name) {
2147 kfree(f->name);
2148 DJM(no_name--);
2149 }
2150 kfree(f);
2151 no_jffs_file--;
2152 return 0;
2153}
2154
2155static long
2156jffs_get_file_count(void)
2157{
2158 return no_jffs_file;
2159}
2160
2161/* See if a file is deleted. If so, mark that file's nodes as obsolete. */
2162int
2163jffs_possibly_delete_file(struct jffs_file *f)
2164{
2165 struct jffs_node *n;
2166
2167 D3(printk("jffs_possibly_delete_file(): ino: %u\n",
2168 f->ino));
2169
2170 ASSERT(if (!f) {
2171 printk(KERN_ERR "jffs_possibly_delete_file(): f == NULL\n");
2172 return -1;
2173 });
2174
2175 if (f->deleted) {
2176 /* First try to remove all older versions. Commence with
2177 the oldest node. */
2178 for (n = f->version_head; n; n = n->version_next) {
2179 if (!n->fm) {
2180 continue;
2181 }
2182 if (jffs_fmfree(f->c->fmc, n->fm, n) < 0) {
2183 break;
2184 }
2185 }
2186 /* Unlink the file from the filesystem. */
2187 if (!f->c->building_fs) {
2188 jffs_unlink_file_from_tree(f);
2189 }
2190 jffs_unlink_file_from_hash(f);
2191 jffs_free_node_list(f);
2192 jffs_free_file(f);
2193 }
2194 return 0;
2195}
2196
2197
2198/* Used in conjunction with jffs_foreach_file() to count the number
2199 of files in the file system. */
2200int
2201jffs_file_count(struct jffs_file *f)
2202{
2203 return 1;
2204}
2205
2206
2207/* Build up a file's range list from scratch by going through the
2208 version list. */
2209static int
2210jffs_build_file(struct jffs_file *f)
2211{
2212 struct jffs_node *n;
2213
2214 D3(printk("jffs_build_file(): ino: %u, name: \"%s\"\n",
2215 f->ino, (f->name ? f->name : "")));
2216
2217 for (n = f->version_head; n; n = n->version_next) {
2218 jffs_update_file(f, n);
2219 }
2220 return 0;
2221}
2222
2223
2224/* Remove an amount of data from a file. If this amount of data is
2225 zero, that could mean that a node should be split in two parts.
2226 We remove or change the appropriate nodes in the lists.
2227
2228 Starting offset of area to be removed is node->data_offset,
2229 and the length of the area is in node->removed_size. */
2230static int
2231jffs_delete_data(struct jffs_file *f, struct jffs_node *node)
2232{
2233 struct jffs_node *n;
2234 __u32 offset = node->data_offset;
2235 __u32 remove_size = node->removed_size;
2236
2237 D3(printk("jffs_delete_data(): offset = %u, remove_size = %u\n",
2238 offset, remove_size));
2239
2240 if (remove_size == 0
2241 && f->range_tail
2242 && f->range_tail->data_offset + f->range_tail->data_size
2243 == offset) {
2244 /* A simple append; nothing to remove or no node to split. */
2245 return 0;
2246 }
2247
2248 /* Find the node where we should begin the removal. */
2249 for (n = f->range_head; n; n = n->range_next) {
2250 if (n->data_offset + n->data_size > offset) {
2251 break;
2252 }
2253 }
2254 if (!n) {
2255 /* If there's no data in the file there's no data to
2256 remove either. */
2257 return 0;
2258 }
2259
2260 if (n->data_offset > offset) {
2261 /* XXX: Not implemented yet. */
2262 printk(KERN_WARNING "JFFS: An unexpected situation "
2263 "occurred in jffs_delete_data.\n");
2264 }
2265 else if (n->data_offset < offset) {
2266 /* See if the node has to be split into two parts. */
2267 if (n->data_offset + n->data_size > offset + remove_size) {
2268 /* Do the split. */
2269 struct jffs_node *new_node;
2270 D3(printk("jffs_delete_data(): Split node with "
2271 "version number %u.\n", n->version));
2272
2273 if (!(new_node = jffs_alloc_node())) {
2274 D(printk("jffs_delete_data(): -ENOMEM\n"));
2275 return -ENOMEM;
2276 }
2277 DJM(no_jffs_node++);
2278
2279 new_node->ino = n->ino;
2280 new_node->version = n->version;
2281 new_node->data_offset = offset;
2282 new_node->data_size = n->data_size - (remove_size + (offset - n->data_offset));
2283 new_node->fm_offset = n->fm_offset + (remove_size + (offset - n->data_offset));
2284 new_node->name_size = n->name_size;
2285 new_node->fm = n->fm;
2286 new_node->version_prev = n;
2287 new_node->version_next = n->version_next;
2288 if (new_node->version_next) {
2289 new_node->version_next->version_prev
2290 = new_node;
2291 }
2292 else {
2293 f->version_tail = new_node;
2294 }
2295 n->version_next = new_node;
2296 new_node->range_prev = n;
2297 new_node->range_next = n->range_next;
2298 if (new_node->range_next) {
2299 new_node->range_next->range_prev = new_node;
2300 }
2301 else {
2302 f->range_tail = new_node;
2303 }
2304 /* A very interesting can of worms. */
2305 n->range_next = new_node;
2306 n->data_size = offset - n->data_offset;
2307 if (new_node->fm)
2308 jffs_add_node(new_node);
2309 else {
2310 D1(printk(KERN_WARNING "jffs_delete_data(): Splitting an empty node (file hold).\n!"));
2311 D1(printk(KERN_WARNING "FIXME: Did dwmw2 do the right thing here?\n"));
2312 }
2313 n = new_node->range_next;
2314 remove_size = 0;
2315 }
2316 else {
2317 /* No. No need to split the node. Just remove
2318 the end of the node. */
2319 int r = min(n->data_offset + n->data_size
2320 - offset, remove_size);
2321 n->data_size -= r;
2322 remove_size -= r;
2323 n = n->range_next;
2324 }
2325 }
2326
2327 /* Remove as many nodes as necessary. */
2328 while (n && remove_size) {
2329 if (n->data_size <= remove_size) {
2330 struct jffs_node *p = n;
2331 remove_size -= n->data_size;
2332 n = n->range_next;
2333 D3(printk("jffs_delete_data(): Removing node: "
2334 "ino: %u, version: %u%s\n",
2335 p->ino, p->version,
2336 (p->fm ? "" : " (virtual)")));
2337 if (p->fm) {
2338 jffs_fmfree(f->c->fmc, p->fm, p);
2339 }
2340 jffs_unlink_node_from_range_list(f, p);
2341 jffs_unlink_node_from_version_list(f, p);
2342 jffs_free_node(p);
2343 DJM(no_jffs_node--);
2344 }
2345 else {
2346 n->data_size -= remove_size;
2347 n->fm_offset += remove_size;
2348 n->data_offset -= (node->removed_size - remove_size);
2349 n = n->range_next;
2350 break;
2351 }
2352 }
2353
2354 /* Adjust the following nodes' information about offsets etc. */
2355 while (n && node->removed_size) {
2356 n->data_offset -= node->removed_size;
2357 n = n->range_next;
2358 }
2359
2360 if (node->removed_size > (f->size - node->data_offset)) {
2361 /* It's possible that the removed_size is in fact
2362 * greater than the amount of data we actually thought
2363 * were present in the first place - some of the nodes
2364 * which this node originally obsoleted may already have
2365 * been deleted from the flash by subsequent garbage
2366 * collection.
2367 *
2368 * If this is the case, don't let f->size go negative.
2369 * Bad things would happen :)
2370 */
2371 f->size = node->data_offset;
2372 } else {
2373 f->size -= node->removed_size;
2374 }
2375 D3(printk("jffs_delete_data(): f->size = %d\n", f->size));
2376 return 0;
2377} /* jffs_delete_data() */
2378
2379
2380/* Insert some data into a file. Prior to the call to this function,
2381 jffs_delete_data should be called. */
2382static int
2383jffs_insert_data(struct jffs_file *f, struct jffs_node *node)
2384{
2385 D3(printk("jffs_insert_data(): node->data_offset = %u, "
2386 "node->data_size = %u, f->size = %u\n",
2387 node->data_offset, node->data_size, f->size));
2388
2389 /* Find the position where we should insert data. */
2390 retry:
2391 if (node->data_offset == f->size) {
2392 /* A simple append. This is the most common operation. */
2393 node->range_next = NULL;
2394 node->range_prev = f->range_tail;
2395 if (node->range_prev) {
2396 node->range_prev->range_next = node;
2397 }
2398 f->range_tail = node;
2399 f->size += node->data_size;
2400 if (!f->range_head) {
2401 f->range_head = node;
2402 }
2403 }
2404 else if (node->data_offset < f->size) {
2405 /* Trying to insert data into the middle of the file. This
2406 means no problem because jffs_delete_data() has already
2407 prepared the range list for us. */
2408 struct jffs_node *n;
2409
2410 /* Find the correct place for the insertion and then insert
2411 the node. */
2412 for (n = f->range_head; n; n = n->range_next) {
2413 D2(printk("Cool stuff's happening!\n"));
2414
2415 if (n->data_offset == node->data_offset) {
2416 node->range_prev = n->range_prev;
2417 if (node->range_prev) {
2418 node->range_prev->range_next = node;
2419 }
2420 else {
2421 f->range_head = node;
2422 }
2423 node->range_next = n;
2424 n->range_prev = node;
2425 break;
2426 }
2427 ASSERT(else if (n->data_offset + n->data_size >
2428 node->data_offset) {
2429 printk(KERN_ERR "jffs_insert_data(): "
2430 "Couldn't find a place to insert "
2431 "the data!\n");
2432 return -1;
2433 });
2434 }
2435
2436 /* Adjust later nodes' offsets etc. */
2437 n = node->range_next;
2438 while (n) {
2439 n->data_offset += node->data_size;
2440 n = n->range_next;
2441 }
2442 f->size += node->data_size;
2443 }
2444 else if (node->data_offset > f->size) {
2445 /* Okay. This is tricky. This means that we want to insert
2446 data at a place that is beyond the limits of the file as
2447 it is constructed right now. This is actually a common
2448 event that for instance could occur during the mounting
2449 of the file system if a large file have been truncated,
2450 rewritten and then only partially garbage collected. */
2451
2452 struct jffs_node *n;
2453
2454 /* We need a place holder for the data that is missing in
2455 front of this insertion. This "virtual node" will not
2456 be associated with any space on the flash device. */
2457 struct jffs_node *virtual_node;
2458 if (!(virtual_node = jffs_alloc_node())) {
2459 return -ENOMEM;
2460 }
2461
2462 D(printk("jffs_insert_data: Inserting a virtual node.\n"));
2463 D(printk(" node->data_offset = %u\n", node->data_offset));
2464 D(printk(" f->size = %u\n", f->size));
2465
2466 virtual_node->ino = node->ino;
2467 virtual_node->version = node->version;
2468 virtual_node->removed_size = 0;
2469 virtual_node->fm_offset = 0;
2470 virtual_node->name_size = 0;
2471 virtual_node->fm = NULL; /* This is a virtual data holder. */
2472 virtual_node->version_prev = NULL;
2473 virtual_node->version_next = NULL;
2474 virtual_node->range_next = NULL;
2475
2476 /* Are there any data at all in the file yet? */
2477 if (f->range_head) {
2478 virtual_node->data_offset
2479 = f->range_tail->data_offset
2480 + f->range_tail->data_size;
2481 virtual_node->data_size
2482 = node->data_offset - virtual_node->data_offset;
2483 virtual_node->range_prev = f->range_tail;
2484 f->range_tail->range_next = virtual_node;
2485 }
2486 else {
2487 virtual_node->data_offset = 0;
2488 virtual_node->data_size = node->data_offset;
2489 virtual_node->range_prev = NULL;
2490 f->range_head = virtual_node;
2491 }
2492
2493 f->range_tail = virtual_node;
2494 f->size += virtual_node->data_size;
2495
2496 /* Insert this virtual node in the version list as well. */
2497 for (n = f->version_head; n ; n = n->version_next) {
2498 if (n->version == virtual_node->version) {
2499 virtual_node->version_prev = n->version_prev;
2500 n->version_prev = virtual_node;
2501 if (virtual_node->version_prev) {
2502 virtual_node->version_prev
2503 ->version_next = virtual_node;
2504 }
2505 else {
2506 f->version_head = virtual_node;
2507 }
2508 virtual_node->version_next = n;
2509 break;
2510 }
2511 }
2512
2513 D(jffs_print_node(virtual_node));
2514
2515 /* Make a new try to insert the node. */
2516 goto retry;
2517 }
2518
2519 D3(printk("jffs_insert_data(): f->size = %d\n", f->size));
2520 return 0;
2521}
2522
2523
2524/* A new node (with data) has been added to the file and now the range
2525 list has to be modified. */
2526static int
2527jffs_update_file(struct jffs_file *f, struct jffs_node *node)
2528{
2529 int err;
2530
2531 D3(printk("jffs_update_file(): ino: %u, version: %u\n",
2532 f->ino, node->version));
2533
2534 if (node->data_size == 0) {
2535 if (node->removed_size == 0) {
2536 /* data_offset == X */
2537 /* data_size == 0 */
2538 /* remove_size == 0 */
2539 }
2540 else {
2541 /* data_offset == X */
2542 /* data_size == 0 */
2543 /* remove_size != 0 */
2544 if ((err = jffs_delete_data(f, node)) < 0) {
2545 return err;
2546 }
2547 }
2548 }
2549 else {
2550 /* data_offset == X */
2551 /* data_size != 0 */
2552 /* remove_size == Y */
2553 if ((err = jffs_delete_data(f, node)) < 0) {
2554 return err;
2555 }
2556 if ((err = jffs_insert_data(f, node)) < 0) {
2557 return err;
2558 }
2559 }
2560 return 0;
2561}
2562
1da177e4
LT
2563/* Print the contents of a file. */
2564#if 0
2565int
2566jffs_print_file(struct jffs_file *f)
2567{
2568 D(int i);
2569 D(printk("jffs_file: 0x%p\n", f));
2570 D(printk("{\n"));
2571 D(printk(" 0x%08x, /* ino */\n", f->ino));
2572 D(printk(" 0x%08x, /* pino */\n", f->pino));
2573 D(printk(" 0x%08x, /* mode */\n", f->mode));
2574 D(printk(" 0x%04x, /* uid */\n", f->uid));
2575 D(printk(" 0x%04x, /* gid */\n", f->gid));
2576 D(printk(" 0x%08x, /* atime */\n", f->atime));
2577 D(printk(" 0x%08x, /* mtime */\n", f->mtime));
2578 D(printk(" 0x%08x, /* ctime */\n", f->ctime));
2579 D(printk(" 0x%02x, /* nsize */\n", f->nsize));
2580 D(printk(" 0x%02x, /* nlink */\n", f->nlink));
2581 D(printk(" 0x%02x, /* deleted */\n", f->deleted));
2582 D(printk(" \"%s\", ", (f->name ? f->name : "")));
2583 D(for (i = strlen(f->name ? f->name : ""); i < 8; ++i) {
2584 printk(" ");
2585 });
2586 D(printk("/* name */\n"));
2587 D(printk(" 0x%08x, /* size */\n", f->size));
2588 D(printk(" 0x%08x, /* highest_version */\n",
2589 f->highest_version));
2590 D(printk(" 0x%p, /* c */\n", f->c));
2591 D(printk(" 0x%p, /* parent */\n", f->parent));
2592 D(printk(" 0x%p, /* children */\n", f->children));
2593 D(printk(" 0x%p, /* sibling_prev */\n", f->sibling_prev));
2594 D(printk(" 0x%p, /* sibling_next */\n", f->sibling_next));
2595 D(printk(" 0x%p, /* hash_prev */\n", f->hash.prev));
2596 D(printk(" 0x%p, /* hash_next */\n", f->hash.next));
2597 D(printk(" 0x%p, /* range_head */\n", f->range_head));
2598 D(printk(" 0x%p, /* range_tail */\n", f->range_tail));
2599 D(printk(" 0x%p, /* version_head */\n", f->version_head));
2600 D(printk(" 0x%p, /* version_tail */\n", f->version_tail));
2601 D(printk("}\n"));
2602 return 0;
2603}
2604#endif /* 0 */
2605
2606void
2607jffs_print_hash_table(struct jffs_control *c)
2608{
2609 int i;
2610
2611 printk("JFFS: Dumping the file system's hash table...\n");
2612 for (i = 0; i < c->hash_len; i++) {
216d81bb
DP
2613 struct jffs_file *f;
2614 list_for_each_entry(f, &c->hash[i], hash) {
1da177e4
LT
2615 printk("*** c->hash[%u]: \"%s\" "
2616 "(ino: %u, pino: %u)\n",
2617 i, (f->name ? f->name : ""),
2618 f->ino, f->pino);
2619 }
2620 }
2621}
2622
2623
2624void
2625jffs_print_tree(struct jffs_file *first_file, int indent)
2626{
2627 struct jffs_file *f;
2628 char *space;
2629 int dir;
2630
2631 if (!first_file) {
2632 return;
2633 }
2634
2635 if (!(space = (char *) kmalloc(indent + 1, GFP_KERNEL))) {
2636 printk("jffs_print_tree(): Out of memory!\n");
2637 return;
2638 }
2639
2640 memset(space, ' ', indent);
2641 space[indent] = '\0';
2642
2643 for (f = first_file; f; f = f->sibling_next) {
2644 dir = S_ISDIR(f->mode);
2645 printk("%s%s%s (ino: %u, highest_version: %u, size: %u)\n",
2646 space, (f->name ? f->name : ""), (dir ? "/" : ""),
2647 f->ino, f->highest_version, f->size);
2648 if (dir) {
2649 jffs_print_tree(f->children, indent + 2);
2650 }
2651 }
2652
2653 kfree(space);
2654}
2655
2656
2657#if defined(JFFS_MEMORY_DEBUG) && JFFS_MEMORY_DEBUG
2658void
2659jffs_print_memory_allocation_statistics(void)
2660{
2661 static long printout;
2662 printk("________ Memory printout #%ld ________\n", ++printout);
2663 printk("no_jffs_file = %ld\n", no_jffs_file);
2664 printk("no_jffs_node = %ld\n", no_jffs_node);
2665 printk("no_jffs_control = %ld\n", no_jffs_control);
2666 printk("no_jffs_raw_inode = %ld\n", no_jffs_raw_inode);
2667 printk("no_jffs_node_ref = %ld\n", no_jffs_node_ref);
2668 printk("no_jffs_fm = %ld\n", no_jffs_fm);
2669 printk("no_jffs_fmcontrol = %ld\n", no_jffs_fmcontrol);
2670 printk("no_hash = %ld\n", no_hash);
2671 printk("no_name = %ld\n", no_name);
2672 printk("\n");
2673}
2674#endif
2675
2676
2677/* Rewrite `size' bytes, and begin at `node'. */
2678static int
2679jffs_rewrite_data(struct jffs_file *f, struct jffs_node *node, __u32 size)
2680{
2681 struct jffs_control *c = f->c;
2682 struct jffs_fmcontrol *fmc = c->fmc;
2683 struct jffs_raw_inode raw_inode;
2684 struct jffs_node *new_node;
2685 struct jffs_fm *fm;
2686 __u32 pos;
2687 __u32 pos_dchksum;
2688 __u32 total_name_size;
2689 __u32 total_data_size;
2690 __u32 total_size;
2691 int err;
2692
2693 D1(printk("***jffs_rewrite_data(): node: %u, name: \"%s\", size: %u\n",
2694 f->ino, (f->name ? f->name : "(null)"), size));
2695
2696 /* Create and initialize the new node. */
2697 if (!(new_node = jffs_alloc_node())) {
2698 D(printk("jffs_rewrite_data(): "
2699 "Failed to allocate node.\n"));
2700 return -ENOMEM;
2701 }
2702 DJM(no_jffs_node++);
2703 new_node->data_offset = node->data_offset;
2704 new_node->removed_size = size;
2705 total_name_size = JFFS_PAD(f->nsize);
2706 total_data_size = JFFS_PAD(size);
2707 total_size = sizeof(struct jffs_raw_inode)
2708 + total_name_size + total_data_size;
2709 new_node->fm_offset = sizeof(struct jffs_raw_inode)
2710 + total_name_size;
2711
2712retry:
2713 jffs_fm_write_lock(fmc);
2714 err = 0;
2715
2716 if ((err = jffs_fmalloc(fmc, total_size, new_node, &fm)) < 0) {
2717 DJM(no_jffs_node--);
2718 jffs_fm_write_unlock(fmc);
2719 D(printk("jffs_rewrite_data(): Failed to allocate fm.\n"));
2720 jffs_free_node(new_node);
2721 return err;
2722 }
2723 else if (!fm->nodes) {
2724 /* The jffs_fm struct that we got is not big enough. */
2725 /* This should never happen, because we deal with this case
2726 in jffs_garbage_collect_next().*/
2727 printk(KERN_WARNING "jffs_rewrite_data(): Allocated node is too small (%d bytes of %d)\n", fm->size, total_size);
2728 if ((err = jffs_write_dummy_node(c, fm)) < 0) {
2729 D(printk("jffs_rewrite_data(): "
2730 "jffs_write_dummy_node() Failed!\n"));
2731 } else {
2732 err = -ENOSPC;
2733 }
2734 DJM(no_jffs_fm--);
2735 jffs_fm_write_unlock(fmc);
2736 kfree(fm);
2737
2738 return err;
2739 }
2740 new_node->fm = fm;
2741
2742 /* Initialize the raw inode. */
2743 raw_inode.magic = JFFS_MAGIC_BITMASK;
2744 raw_inode.ino = f->ino;
2745 raw_inode.pino = f->pino;
2746 raw_inode.version = f->highest_version + 1;
2747 raw_inode.mode = f->mode;
2748 raw_inode.uid = f->uid;
2749 raw_inode.gid = f->gid;
2750 raw_inode.atime = f->atime;
2751 raw_inode.mtime = f->mtime;
2752 raw_inode.ctime = f->ctime;
2753 raw_inode.offset = node->data_offset;
2754 raw_inode.dsize = size;
2755 raw_inode.rsize = size;
2756 raw_inode.nsize = f->nsize;
2757 raw_inode.nlink = f->nlink;
2758 raw_inode.spare = 0;
2759 raw_inode.rename = 0;
2760 raw_inode.deleted = f->deleted;
2761 raw_inode.accurate = 0xff;
2762 raw_inode.dchksum = 0;
2763 raw_inode.nchksum = 0;
2764
2765 pos = new_node->fm->offset;
2766 pos_dchksum = pos +JFFS_RAW_INODE_DCHKSUM_OFFSET;
2767
2768 D3(printk("jffs_rewrite_data(): Writing this raw inode "
2769 "to pos 0x%ul.\n", pos));
2770 D3(jffs_print_raw_inode(&raw_inode));
2771
2772 if ((err = flash_safe_write(fmc->mtd, pos,
2773 (u_char *) &raw_inode,
2774 sizeof(struct jffs_raw_inode)
2775 - sizeof(__u32)
2776 - sizeof(__u16) - sizeof(__u16))) < 0) {
2777 jffs_fmfree_partly(fmc, fm,
2778 total_name_size + total_data_size);
2779 jffs_fm_write_unlock(fmc);
2780 printk(KERN_ERR "JFFS: jffs_rewrite_data: Write error during "
2781 "rewrite. (raw inode)\n");
2782 printk(KERN_ERR "JFFS: jffs_rewrite_data: Now retrying "
2783 "rewrite. (raw inode)\n");
2784 goto retry;
2785 }
2786 pos += sizeof(struct jffs_raw_inode);
2787
2788 /* Write the name to the flash memory. */
2789 if (f->nsize) {
2790 D3(printk("jffs_rewrite_data(): Writing name \"%s\" to "
2791 "pos 0x%ul.\n", f->name, (unsigned int) pos));
2792 if ((err = flash_safe_write(fmc->mtd, pos,
2793 (u_char *)f->name,
2794 f->nsize)) < 0) {
2795 jffs_fmfree_partly(fmc, fm, total_data_size);
2796 jffs_fm_write_unlock(fmc);
2797 printk(KERN_ERR "JFFS: jffs_rewrite_data: Write "
2798 "error during rewrite. (name)\n");
2799 printk(KERN_ERR "JFFS: jffs_rewrite_data: Now retrying "
2800 "rewrite. (name)\n");
2801 goto retry;
2802 }
2803 pos += total_name_size;
2804 raw_inode.nchksum = jffs_checksum(f->name, f->nsize);
2805 }
2806
2807 /* Write the data. */
2808 if (size) {
2809 int r;
2810 unsigned char *page;
2811 __u32 offset = node->data_offset;
2812
2813 if (!(page = (unsigned char *)__get_free_page(GFP_KERNEL))) {
2814 jffs_fmfree_partly(fmc, fm, 0);
2815 return -1;
2816 }
2817
2818 while (size) {
2819 __u32 s = min(size, (__u32)PAGE_SIZE);
2820 if ((r = jffs_read_data(f, (char *)page,
2821 offset, s)) < s) {
2822 free_page((unsigned long)page);
2823 jffs_fmfree_partly(fmc, fm, 0);
2824 jffs_fm_write_unlock(fmc);
2825 printk(KERN_ERR "JFFS: jffs_rewrite_data: "
2826 "jffs_read_data() "
2827 "failed! (r = %d)\n", r);
2828 return -1;
2829 }
2830 if ((err = flash_safe_write(fmc->mtd,
2831 pos, page, r)) < 0) {
2832 free_page((unsigned long)page);
2833 jffs_fmfree_partly(fmc, fm, 0);
2834 jffs_fm_write_unlock(fmc);
2835 printk(KERN_ERR "JFFS: jffs_rewrite_data: "
2836 "Write error during rewrite. "
2837 "(data)\n");
2838 goto retry;
2839 }
2840 pos += r;
2841 size -= r;
2842 offset += r;
2843 raw_inode.dchksum += jffs_checksum(page, r);
2844 }
2845
2846 free_page((unsigned long)page);
2847 }
2848
2849 raw_inode.accurate = 0;
2850 raw_inode.chksum = jffs_checksum(&raw_inode,
2851 sizeof(struct jffs_raw_inode)
2852 - sizeof(__u16));
2853
2854 /* Add the checksum. */
2855 if ((err
2856 = flash_safe_write(fmc->mtd, pos_dchksum,
2857 &((u_char *)
2858 &raw_inode)[JFFS_RAW_INODE_DCHKSUM_OFFSET],
2859 sizeof(__u32) + sizeof(__u16)
2860 + sizeof(__u16))) < 0) {
2861 jffs_fmfree_partly(fmc, fm, 0);
2862 jffs_fm_write_unlock(fmc);
2863 printk(KERN_ERR "JFFS: jffs_rewrite_data: Write error during "
2864 "rewrite. (checksum)\n");
2865 goto retry;
2866 }
2867
2868 /* Now make the file system aware of the newly written node. */
2869 jffs_insert_node(c, f, &raw_inode, f->name, new_node);
2870 jffs_fm_write_unlock(fmc);
2871
2872 D3(printk("jffs_rewrite_data(): Leaving...\n"));
2873 return 0;
2874} /* jffs_rewrite_data() */
2875
2876
2877/* jffs_garbage_collect_next implements one step in the garbage collect
2878 process and is often called multiple times at each occasion of a
2879 garbage collect. */
2880
2881static int
2882jffs_garbage_collect_next(struct jffs_control *c)
2883{
2884 struct jffs_fmcontrol *fmc = c->fmc;
2885 struct jffs_node *node;
2886 struct jffs_file *f;
2887 int err = 0;
2888 __u32 size;
2889 __u32 data_size;
2890 __u32 total_name_size;
2891 __u32 extra_available;
2892 __u32 space_needed;
2893 __u32 free_chunk_size1 = jffs_free_size1(fmc);
2894 D2(__u32 free_chunk_size2 = jffs_free_size2(fmc));
2895
2896 /* Get the oldest node in the flash. */
2897 node = jffs_get_oldest_node(fmc);
2898 ASSERT(if (!node) {
2899 printk(KERN_ERR "JFFS: jffs_garbage_collect_next: "
2900 "No oldest node found!\n");
2901 err = -1;
2902 goto jffs_garbage_collect_next_end;
2903
2904
2905 });
2906
2907 /* Find its corresponding file too. */
2908 f = jffs_find_file(c, node->ino);
2909
2910 if (!f) {
2911 printk (KERN_ERR "JFFS: jffs_garbage_collect_next: "
2912 "No file to garbage collect! "
2913 "(ino = 0x%08x)\n", node->ino);
2914 /* FIXME: Free the offending node and recover. */
2915 err = -1;
2916 goto jffs_garbage_collect_next_end;
2917 }
2918
2919 /* We always write out the name. Theoretically, we don't need
2920 to, but for now it's easier - because otherwise we'd have
2921 to keep track of how many times the current name exists on
2922 the flash and make sure it never reaches zero.
2923
2924 The current approach means that would be possible to cause
2925 the GC to end up eating its tail by writing lots of nodes
2926 with no name for it to garbage-collect. Hence the change in
2927 inode.c to write names with _every_ node.
2928
2929 It sucks, but it _should_ work.
2930 */
2931 total_name_size = JFFS_PAD(f->nsize);
2932
2933 D1(printk("jffs_garbage_collect_next(): \"%s\", "
2934 "ino: %u, version: %u, location 0x%x, dsize %u\n",
2935 (f->name ? f->name : ""), node->ino, node->version,
2936 node->fm->offset, node->data_size));
2937
2938 /* Compute how many data it's possible to rewrite at the moment. */
2939 data_size = f->size - node->data_offset;
2940
2941 /* And from that, the total size of the chunk we want to write */
2942 size = sizeof(struct jffs_raw_inode) + total_name_size
2943 + data_size + JFFS_GET_PAD_BYTES(data_size);
2944
2945 /* If that's more than max_chunk_size, reduce it accordingly */
2946 if (size > fmc->max_chunk_size) {
2947 size = fmc->max_chunk_size;
2948 data_size = size - sizeof(struct jffs_raw_inode)
2949 - total_name_size;
2950 }
2951
2952 /* If we're asking to take up more space than free_chunk_size1
2953 but we _could_ fit in it, shrink accordingly.
2954 */
2955 if (size > free_chunk_size1) {
2956
2957 if (free_chunk_size1 <
2958 (sizeof(struct jffs_raw_inode) + total_name_size + BLOCK_SIZE)){
2959 /* The space left is too small to be of any
2960 use really. */
2961 struct jffs_fm *dirty_fm
2962 = jffs_fmalloced(fmc,
2963 fmc->tail->offset + fmc->tail->size,
2964 free_chunk_size1, NULL);
2965 if (!dirty_fm) {
2966 printk(KERN_ERR "JFFS: "
2967 "jffs_garbage_collect_next: "
2968 "Failed to allocate `dirty' "
2969 "flash memory!\n");
2970 err = -1;
2971 goto jffs_garbage_collect_next_end;
2972 }
2973 D1(printk("Dirtying end of flash - too small\n"));
2974 jffs_write_dummy_node(c, dirty_fm);
2975 err = 0;
2976 goto jffs_garbage_collect_next_end;
2977 }
2978 D1(printk("Reducing size of new node from %d to %d to avoid "
2979 " exceeding free_chunk_size1\n",
2980 size, free_chunk_size1));
2981
2982 size = free_chunk_size1;
2983 data_size = size - sizeof(struct jffs_raw_inode)
2984 - total_name_size;
2985 }
2986
2987
2988 /* Calculate the amount of space needed to hold the nodes
2989 which are remaining in the tail */
2990 space_needed = fmc->min_free_size - (node->fm->offset % fmc->sector_size);
2991
2992 /* From that, calculate how much 'extra' space we can use to
2993 increase the size of the node we're writing from the size
2994 of the node we're obsoleting
2995 */
2996 if (space_needed > fmc->free_size) {
2997 /* If we've gone below min_free_size for some reason,
2998 don't fuck up. This is why we have
2999 min_free_size > sector_size. Whinge about it though,
3000 just so I can convince myself my maths is right.
3001 */
3002 D1(printk(KERN_WARNING "jffs_garbage_collect_next(): "
3003 "space_needed %d exceeded free_size %d\n",
3004 space_needed, fmc->free_size));
3005 extra_available = 0;
3006 } else {
3007 extra_available = fmc->free_size - space_needed;
3008 }
3009
3010 /* Check that we don't use up any more 'extra' space than
3011 what's available */
3012 if (size > JFFS_PAD(node->data_size) + total_name_size +
3013 sizeof(struct jffs_raw_inode) + extra_available) {
3014 D1(printk("Reducing size of new node from %d to %ld to avoid "
3015 "catching our tail\n", size,
3016 (long) (JFFS_PAD(node->data_size) + JFFS_PAD(node->name_size) +
3017 sizeof(struct jffs_raw_inode) + extra_available)));
3018 D1(printk("space_needed = %d, extra_available = %d\n",
3019 space_needed, extra_available));
3020
3021 size = JFFS_PAD(node->data_size) + total_name_size +
3022 sizeof(struct jffs_raw_inode) + extra_available;
3023 data_size = size - sizeof(struct jffs_raw_inode)
3024 - total_name_size;
3025 };
3026
3027 D2(printk(" total_name_size: %u\n", total_name_size));
3028 D2(printk(" data_size: %u\n", data_size));
3029 D2(printk(" size: %u\n", size));
3030 D2(printk(" f->nsize: %u\n", f->nsize));
3031 D2(printk(" f->size: %u\n", f->size));
3032 D2(printk(" node->data_offset: %u\n", node->data_offset));
3033 D2(printk(" free_chunk_size1: %u\n", free_chunk_size1));
3034 D2(printk(" free_chunk_size2: %u\n", free_chunk_size2));
3035 D2(printk(" node->fm->offset: 0x%08x\n", node->fm->offset));
3036
3037 if ((err = jffs_rewrite_data(f, node, data_size))) {
3038 printk(KERN_WARNING "jffs_rewrite_data() failed: %d\n", err);
3039 return err;
3040 }
3041
3042jffs_garbage_collect_next_end:
3043 D3(printk("jffs_garbage_collect_next: Leaving...\n"));
3044 return err;
3045} /* jffs_garbage_collect_next */
3046
3047
3048/* If an obsolete node is partly going to be erased due to garbage
3049 collection, the part that isn't going to be erased must be filled
3050 with zeroes so that the scan of the flash will work smoothly next
3051 time. (The data in the file could for instance be a JFFS image
3052 which could cause enormous confusion during a scan of the flash
3053 device if we didn't do this.)
3054 There are two phases in this procedure: First, the clearing of
3055 the name and data parts of the node. Second, possibly also clearing
3056 a part of the raw inode as well. If the box is power cycled during
3057 the first phase, only the checksum of this node-to-be-cleared-at-
3058 the-end will be wrong. If the box is power cycled during, or after,
3059 the clearing of the raw inode, the information like the length of
3060 the name and data parts are zeroed. The next time the box is
3061 powered up, the scanning algorithm manages this faulty data too
3062 because:
3063
3064 - The checksum is invalid and thus the raw inode must be discarded
3065 in any case.
3066 - If the lengths of the data part or the name part are zeroed, the
3067 scanning just continues after the raw inode. But after the inode
3068 the scanning procedure just finds zeroes which is the same as
3069 dirt.
3070
3071 So, in the end, this could never fail. :-) Even if it does fail,
3072 the scanning algorithm should manage that too. */
3073
3074static int
3075jffs_clear_end_of_node(struct jffs_control *c, __u32 erase_size)
3076{
3077 struct jffs_fm *fm;
3078 struct jffs_fmcontrol *fmc = c->fmc;
3079 __u32 zero_offset;
3080 __u32 zero_size;
3081 __u32 zero_offset_data;
3082 __u32 zero_size_data;
3083 __u32 cutting_raw_inode = 0;
3084
3085 if (!(fm = jffs_cut_node(fmc, erase_size))) {
3086 D3(printk("jffs_clear_end_of_node(): fm == NULL\n"));
3087 return 0;
3088 }
3089
3090 /* Where and how much shall we clear? */
3091 zero_offset = fmc->head->offset + erase_size;
3092 zero_size = fm->offset + fm->size - zero_offset;
3093
3094 /* Do we have to clear the raw_inode explicitly? */
3095 if (fm->size - zero_size < sizeof(struct jffs_raw_inode)) {
3096 cutting_raw_inode = sizeof(struct jffs_raw_inode)
3097 - (fm->size - zero_size);
3098 }
3099
3100 /* First, clear the name and data fields. */
3101 zero_offset_data = zero_offset + cutting_raw_inode;
3102 zero_size_data = zero_size - cutting_raw_inode;
3103 flash_safe_acquire(fmc->mtd);
3104 flash_memset(fmc->mtd, zero_offset_data, 0, zero_size_data);
3105 flash_safe_release(fmc->mtd);
3106
3107 /* Should we clear a part of the raw inode? */
3108 if (cutting_raw_inode) {
3109 /* I guess it is ok to clear the raw inode in this order. */
3110 flash_safe_acquire(fmc->mtd);
3111 flash_memset(fmc->mtd, zero_offset, 0,
3112 cutting_raw_inode);
3113 flash_safe_release(fmc->mtd);
3114 }
3115
3116 return 0;
3117} /* jffs_clear_end_of_node() */
3118
3119/* Try to erase as much as possible of the dirt in the flash memory. */
3120static long
3121jffs_try_to_erase(struct jffs_control *c)
3122{
3123 struct jffs_fmcontrol *fmc = c->fmc;
3124 long erase_size;
3125 int err;
3126 __u32 offset;
3127
3128 D3(printk("jffs_try_to_erase()\n"));
3129
3130 erase_size = jffs_erasable_size(fmc);
3131
3132 D2(printk("jffs_try_to_erase(): erase_size = %ld\n", erase_size));
3133
3134 if (erase_size == 0) {
3135 return 0;
3136 }
3137 else if (erase_size < 0) {
3138 printk(KERN_ERR "JFFS: jffs_try_to_erase: "
3139 "jffs_erasable_size returned %ld.\n", erase_size);
3140 return erase_size;
3141 }
3142
3143 if ((err = jffs_clear_end_of_node(c, erase_size)) < 0) {
3144 printk(KERN_ERR "JFFS: jffs_try_to_erase: "
3145 "Clearing of node failed.\n");
3146 return err;
3147 }
3148
3149 offset = fmc->head->offset;
3150
3151 /* Now, let's try to do the erase. */
3152 if ((err = flash_erase_region(fmc->mtd,
3153 offset, erase_size)) < 0) {
3154 printk(KERN_ERR "JFFS: Erase of flash failed. "
3155 "offset = %u, erase_size = %ld\n",
3156 offset, erase_size);
3157 /* XXX: Here we should allocate this area as dirty
3158 with jffs_fmalloced or something similar. Now
3159 we just report the error. */
3160 return err;
3161 }
3162
3163#if 0
3164 /* Check if the erased sectors really got erased. */
3165 {
3166 __u32 pos;
3167 __u32 end;
3168
3169 pos = (__u32)flash_get_direct_pointer(to_kdev_t(c->sb->s_dev), offset);
3170 end = pos + erase_size;
3171
3172 D2(printk("JFFS: Checking erased sector(s)...\n"));
3173
3174 flash_safe_acquire(fmc->mtd);
3175
3176 for (; pos < end; pos += 4) {
3177 if (*(__u32 *)pos != JFFS_EMPTY_BITMASK) {
3178 printk("JFFS: Erase failed! pos = 0x%lx\n",
3179 (long)pos);
3180 jffs_hexdump(fmc->mtd, pos,
3181 jffs_min(256, end - pos));
3182 err = -1;
3183 break;
3184 }
3185 }
3186
3187 flash_safe_release(fmc->mtd);
3188
3189 if (!err) {
3190 D2(printk("JFFS: Erase succeeded.\n"));
3191 }
3192 else {
3193 /* XXX: Here we should allocate the memory
3194 with jffs_fmalloced() in order to prevent
3195 JFFS from using this area accidentally. */
3196 return err;
3197 }
3198 }
3199#endif
3200
3201 /* Update the flash memory data structures. */
3202 jffs_sync_erase(fmc, erase_size);
3203
3204 return erase_size;
3205}
3206
3207
3208/* There are different criteria that should trigger a garbage collect:
3209
3210 1. There is too much dirt in the memory.
3211 2. The free space is becoming small.
3212 3. There are many versions of a node.
3213
3214 The garbage collect should always be done in a manner that guarantees
3215 that future garbage collects cannot be locked. E.g. Rewritten chunks
3216 should not be too large (span more than one sector in the flash memory
3217 for exemple). Of course there is a limit on how intelligent this garbage
3218 collection can be. */
3219
3220
3221static int
3222jffs_garbage_collect_now(struct jffs_control *c)
3223{
3224 struct jffs_fmcontrol *fmc = c->fmc;
3225 long erased = 0;
3226 int result = 0;
3227 D1(int i = 1);
3228 D2(printk("***jffs_garbage_collect_now(): fmc->dirty_size = %u, fmc->free_size = 0x%x\n, fcs1=0x%x, fcs2=0x%x",
3229 fmc->dirty_size, fmc->free_size, jffs_free_size1(fmc), jffs_free_size2(fmc)));
3230 D2(jffs_print_fmcontrol(fmc));
3231
3232 // down(&fmc->gclock);
3233
3234 /* If it is possible to garbage collect, do so. */
3235
3236 while (erased == 0) {
3237 D1(printk("***jffs_garbage_collect_now(): round #%u, "
3238 "fmc->dirty_size = %u\n", i++, fmc->dirty_size));
3239 D2(jffs_print_fmcontrol(fmc));
3240
3241 if ((erased = jffs_try_to_erase(c)) < 0) {
3242 printk(KERN_WARNING "JFFS: Error in "
3243 "garbage collector.\n");
3244 result = erased;
3245 goto gc_end;
3246 }
3247 if (erased)
3248 break;
3249
3250 if (fmc->free_size == 0) {
3251 /* Argh */
3252 printk(KERN_ERR "jffs_garbage_collect_now(): free_size == 0. This is BAD.\n");
3253 result = -ENOSPC;
3254 break;
3255 }
3256
3257 if (fmc->dirty_size < fmc->sector_size) {
3258 /* Actually, we _may_ have been able to free some,
3259 * if there are many overlapping nodes which aren't
3260 * actually marked dirty because they still have
3261 * some valid data in each.
3262 */
3263 result = -ENOSPC;
3264 break;
3265 }
3266
3267 /* Let's dare to make a garbage collect. */
3268 if ((result = jffs_garbage_collect_next(c)) < 0) {
3269 printk(KERN_ERR "JFFS: Something "
3270 "has gone seriously wrong "
3271 "with a garbage collect.\n");
3272 goto gc_end;
3273 }
3274
3275 D1(printk(" jffs_garbage_collect_now(): erased: %ld\n", erased));
3276 DJM(jffs_print_memory_allocation_statistics());
3277 }
3278
3279gc_end:
3280 // up(&fmc->gclock);
3281
3282 D3(printk(" jffs_garbage_collect_now(): Leaving...\n"));
3283 D1(if (erased) {
3284 printk("jffs_g_c_now(): erased = %ld\n", erased);
3285 jffs_print_fmcontrol(fmc);
3286 });
3287
3288 if (!erased && !result)
3289 return -ENOSPC;
3290
3291 return result;
3292} /* jffs_garbage_collect_now() */
3293
3294
3295/* Determine if it is reasonable to start garbage collection.
3296 We start a gc pass if either:
3297 - The number of free bytes < MIN_FREE_BYTES && at least one
3298 block is dirty, OR
3299 - The number of dirty bytes > MAX_DIRTY_BYTES
3300*/
3301static inline int thread_should_wake (struct jffs_control *c)
3302{
3303 D1(printk (KERN_NOTICE "thread_should_wake(): free=%d, dirty=%d, blocksize=%d.\n",
3304 c->fmc->free_size, c->fmc->dirty_size, c->fmc->sector_size));
3305
3306 /* If there's not enough dirty space to free a block, there's no point. */
3307 if (c->fmc->dirty_size < c->fmc->sector_size) {
3308 D2(printk(KERN_NOTICE "thread_should_wake(): Not waking. Insufficient dirty space\n"));
3309 return 0;
3310 }
3311#if 1
3312 /* If there is too much RAM used by the various structures, GC */
3313 if (jffs_get_node_inuse() > (c->fmc->used_size/c->fmc->max_chunk_size * 5 + jffs_get_file_count() * 2 + 50)) {
3314 /* FIXME: Provide proof that this test can be satisfied. We
3315 don't want a filesystem doing endless GC just because this
3316 condition cannot ever be false.
3317 */
3318 D2(printk(KERN_NOTICE "thread_should_wake(): Waking due to number of nodes\n"));
3319 return 1;
3320 }
3321#endif
3322 /* If there are fewer free bytes than the threshold, GC */
3323 if (c->fmc->free_size < c->gc_minfree_threshold) {
3324 D2(printk(KERN_NOTICE "thread_should_wake(): Waking due to insufficent free space\n"));
3325 return 1;
3326 }
3327 /* If there are more dirty bytes than the threshold, GC */
3328 if (c->fmc->dirty_size > c->gc_maxdirty_threshold) {
3329 D2(printk(KERN_NOTICE "thread_should_wake(): Waking due to excessive dirty space\n"));
3330 return 1;
3331 }
3332 /* FIXME: What about the "There are many versions of a node" condition? */
3333
3334 return 0;
3335}
3336
3337
3338void jffs_garbage_collect_trigger(struct jffs_control *c)
3339{
3340 /* NOTE: We rely on the fact that we have the BKL here.
3341 * Otherwise, the gc_task could go away between the check
3342 * and the wake_up_process()
3343 */
3344 if (c->gc_task && thread_should_wake(c))
3345 send_sig(SIGHUP, c->gc_task, 1);
3346}
3347
3348
3349/* Kernel threads take (void *) as arguments. Thus we pass
3350 the jffs_control data as a (void *) and then cast it. */
3351int
3352jffs_garbage_collect_thread(void *ptr)
3353{
3354 struct jffs_control *c = (struct jffs_control *) ptr;
3355 struct jffs_fmcontrol *fmc = c->fmc;
3356 long erased;
3357 int result = 0;
3358 D1(int i = 1);
3359
3360 daemonize("jffs_gcd");
3361
3362 c->gc_task = current;
3363
3364 lock_kernel();
3365 init_completion(&c->gc_thread_comp); /* barrier */
3366 spin_lock_irq(&current->sighand->siglock);
3367 siginitsetinv (&current->blocked, sigmask(SIGHUP) | sigmask(SIGKILL) | sigmask(SIGSTOP) | sigmask(SIGCONT));
3368 recalc_sigpending();
3369 spin_unlock_irq(&current->sighand->siglock);
3370
3371 D1(printk (KERN_NOTICE "jffs_garbage_collect_thread(): Starting infinite loop.\n"));
3372
3373 for (;;) {
3374
3375 /* See if we need to start gc. If we don't, go to sleep.
3376
3377 Current implementation is a BAD THING(tm). If we try
3378 to unmount the FS, the unmount operation will sleep waiting
3379 for this thread to exit. We need to arrange to send it a
3380 sig before the umount process sleeps.
3381 */
3382
3383 if (!thread_should_wake(c))
3384 set_current_state (TASK_INTERRUPTIBLE);
3385
3386 schedule(); /* Yes, we do this even if we want to go
3387 on immediately - we're a low priority
3388 background task. */
3389
3390 /* Put_super will send a SIGKILL and then wait on the sem.
3391 */
3392 while (signal_pending(current)) {
3393 siginfo_t info;
3394 unsigned long signr = 0;
3395
ef2a701d
NC
3396 if (try_to_freeze())
3397 continue;
3398
1da177e4
LT
3399 spin_lock_irq(&current->sighand->siglock);
3400 signr = dequeue_signal(current, &current->blocked, &info);
3401 spin_unlock_irq(&current->sighand->siglock);
3402
3403 switch(signr) {
3404 case SIGSTOP:
3405 D1(printk("jffs_garbage_collect_thread(): SIGSTOP received.\n"));
3406 set_current_state(TASK_STOPPED);
3407 schedule();
3408 break;
3409
3410 case SIGKILL:
3411 D1(printk("jffs_garbage_collect_thread(): SIGKILL received.\n"));
3412 c->gc_task = NULL;
3413 complete_and_exit(&c->gc_thread_comp, 0);
3414 }
3415 }
3416
3417
3418 D1(printk (KERN_NOTICE "jffs_garbage_collect_thread(): collecting.\n"));
3419
3420 D3(printk (KERN_NOTICE "g_c_thread(): down biglock\n"));
3421 down(&fmc->biglock);
3422
3423 D1(printk("***jffs_garbage_collect_thread(): round #%u, "
3424 "fmc->dirty_size = %u\n", i++, fmc->dirty_size));
3425 D2(jffs_print_fmcontrol(fmc));
3426
3427 if ((erased = jffs_try_to_erase(c)) < 0) {
3428 printk(KERN_WARNING "JFFS: Error in "
3429 "garbage collector: %ld.\n", erased);
3430 }
3431
3432 if (erased)
3433 goto gc_end;
3434
3435 if (fmc->free_size == 0) {
3436 /* Argh. Might as well commit suicide. */
3437 printk(KERN_ERR "jffs_garbage_collect_thread(): free_size == 0. This is BAD.\n");
3438 send_sig(SIGQUIT, c->gc_task, 1);
3439 // panic()
3440 goto gc_end;
3441 }
3442
3443 /* Let's dare to make a garbage collect. */
3444 if ((result = jffs_garbage_collect_next(c)) < 0) {
3445 printk(KERN_ERR "JFFS: Something "
3446 "has gone seriously wrong "
3447 "with a garbage collect: %d\n", result);
3448 }
3449
3450 gc_end:
3451 D3(printk (KERN_NOTICE "g_c_thread(): up biglock\n"));
3452 up(&fmc->biglock);
3453 } /* for (;;) */
3454} /* jffs_garbage_collect_thread() */