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