annotate packages/fs/jffs2/current/src/build.c @ 1881:9558d3d305bf

Merge from public MTD repository
author asl
date Sat, 22 Jan 2005 17:14:48 +0000
parents 121da35df27b
children 5bcbb50b501e
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
1 /*
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
2 * JFFS2 -- Journalling Flash File System, Version 2.
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
3 *
1372
121121d3d18f Merge changes from David Woodhouse (bring up to date with MTD project)
gthomas
parents: 1118
diff changeset
4 * Copyright (C) 2001-2003 Red Hat, Inc.
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
5 *
1881
9558d3d305bf Merge from public MTD repository
asl
parents: 1834
diff changeset
6 * Created by David Woodhouse <dwmw2@infradead.org>
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
7 *
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
8 * For licensing information, see the file 'LICENCE' in this directory.
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
9 *
1881
9558d3d305bf Merge from public MTD repository
asl
parents: 1834
diff changeset
10 * $Id: build.c,v 1.69 2004/12/16 20:22:18 dmarlin Exp $
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
11 *
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
12 */
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
13
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
14 #include <linux/kernel.h>
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents: 208
diff changeset
15 #include <linux/sched.h>
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
16 #include <linux/slab.h>
1881
9558d3d305bf Merge from public MTD repository
asl
parents: 1834
diff changeset
17 #include <linux/vmalloc.h>
9558d3d305bf Merge from public MTD repository
asl
parents: 1834
diff changeset
18 #include <linux/mtd/mtd.h>
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
19 #include "nodelist.h"
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
20
1372
121121d3d18f Merge changes from David Woodhouse (bring up to date with MTD project)
gthomas
parents: 1118
diff changeset
21 static void jffs2_build_remove_unlinked_inode(struct jffs2_sb_info *, struct jffs2_inode_cache *, struct jffs2_full_dirent **);
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
22
1118
18f99a0f0059 Merge with latest CVS from infradead.org
gthomas
parents: 570
diff changeset
23 static inline struct jffs2_inode_cache *
18f99a0f0059 Merge with latest CVS from infradead.org
gthomas
parents: 570
diff changeset
24 first_inode_chain(int *i, struct jffs2_sb_info *c)
18f99a0f0059 Merge with latest CVS from infradead.org
gthomas
parents: 570
diff changeset
25 {
18f99a0f0059 Merge with latest CVS from infradead.org
gthomas
parents: 570
diff changeset
26 for (; *i < INOCACHE_HASHSIZE; (*i)++) {
18f99a0f0059 Merge with latest CVS from infradead.org
gthomas
parents: 570
diff changeset
27 if (c->inocache_list[*i])
18f99a0f0059 Merge with latest CVS from infradead.org
gthomas
parents: 570
diff changeset
28 return c->inocache_list[*i];
18f99a0f0059 Merge with latest CVS from infradead.org
gthomas
parents: 570
diff changeset
29 }
18f99a0f0059 Merge with latest CVS from infradead.org
gthomas
parents: 570
diff changeset
30 return NULL;
18f99a0f0059 Merge with latest CVS from infradead.org
gthomas
parents: 570
diff changeset
31 }
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
32
1118
18f99a0f0059 Merge with latest CVS from infradead.org
gthomas
parents: 570
diff changeset
33 static inline struct jffs2_inode_cache *
18f99a0f0059 Merge with latest CVS from infradead.org
gthomas
parents: 570
diff changeset
34 next_inode(int *i, struct jffs2_inode_cache *ic, struct jffs2_sb_info *c)
18f99a0f0059 Merge with latest CVS from infradead.org
gthomas
parents: 570
diff changeset
35 {
18f99a0f0059 Merge with latest CVS from infradead.org
gthomas
parents: 570
diff changeset
36 /* More in this chain? */
18f99a0f0059 Merge with latest CVS from infradead.org
gthomas
parents: 570
diff changeset
37 if (ic->next)
18f99a0f0059 Merge with latest CVS from infradead.org
gthomas
parents: 570
diff changeset
38 return ic->next;
18f99a0f0059 Merge with latest CVS from infradead.org
gthomas
parents: 570
diff changeset
39 (*i)++;
18f99a0f0059 Merge with latest CVS from infradead.org
gthomas
parents: 570
diff changeset
40 return first_inode_chain(i, c);
18f99a0f0059 Merge with latest CVS from infradead.org
gthomas
parents: 570
diff changeset
41 }
18f99a0f0059 Merge with latest CVS from infradead.org
gthomas
parents: 570
diff changeset
42
18f99a0f0059 Merge with latest CVS from infradead.org
gthomas
parents: 570
diff changeset
43 #define for_each_inode(i, c, ic) \
18f99a0f0059 Merge with latest CVS from infradead.org
gthomas
parents: 570
diff changeset
44 for (i = 0, ic = first_inode_chain(&i, (c)); \
18f99a0f0059 Merge with latest CVS from infradead.org
gthomas
parents: 570
diff changeset
45 ic; \
18f99a0f0059 Merge with latest CVS from infradead.org
gthomas
parents: 570
diff changeset
46 ic = next_inode(&i, ic, (c)))
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
47
1372
121121d3d18f Merge changes from David Woodhouse (bring up to date with MTD project)
gthomas
parents: 1118
diff changeset
48
121121d3d18f Merge changes from David Woodhouse (bring up to date with MTD project)
gthomas
parents: 1118
diff changeset
49 static inline void jffs2_build_inode_pass1(struct jffs2_sb_info *c, struct jffs2_inode_cache *ic)
121121d3d18f Merge changes from David Woodhouse (bring up to date with MTD project)
gthomas
parents: 1118
diff changeset
50 {
121121d3d18f Merge changes from David Woodhouse (bring up to date with MTD project)
gthomas
parents: 1118
diff changeset
51 struct jffs2_full_dirent *fd;
121121d3d18f Merge changes from David Woodhouse (bring up to date with MTD project)
gthomas
parents: 1118
diff changeset
52
121121d3d18f Merge changes from David Woodhouse (bring up to date with MTD project)
gthomas
parents: 1118
diff changeset
53 D1(printk(KERN_DEBUG "jffs2_build_inode building directory inode #%u\n", ic->ino));
121121d3d18f Merge changes from David Woodhouse (bring up to date with MTD project)
gthomas
parents: 1118
diff changeset
54
121121d3d18f Merge changes from David Woodhouse (bring up to date with MTD project)
gthomas
parents: 1118
diff changeset
55 /* For each child, increase nlink */
121121d3d18f Merge changes from David Woodhouse (bring up to date with MTD project)
gthomas
parents: 1118
diff changeset
56 for(fd = ic->scan_dents; fd; fd = fd->next) {
121121d3d18f Merge changes from David Woodhouse (bring up to date with MTD project)
gthomas
parents: 1118
diff changeset
57 struct jffs2_inode_cache *child_ic;
121121d3d18f Merge changes from David Woodhouse (bring up to date with MTD project)
gthomas
parents: 1118
diff changeset
58 if (!fd->ino)
121121d3d18f Merge changes from David Woodhouse (bring up to date with MTD project)
gthomas
parents: 1118
diff changeset
59 continue;
121121d3d18f Merge changes from David Woodhouse (bring up to date with MTD project)
gthomas
parents: 1118
diff changeset
60
121121d3d18f Merge changes from David Woodhouse (bring up to date with MTD project)
gthomas
parents: 1118
diff changeset
61 /* XXX: Can get high latency here with huge directories */
121121d3d18f Merge changes from David Woodhouse (bring up to date with MTD project)
gthomas
parents: 1118
diff changeset
62
121121d3d18f Merge changes from David Woodhouse (bring up to date with MTD project)
gthomas
parents: 1118
diff changeset
63 child_ic = jffs2_get_ino_cache(c, fd->ino);
121121d3d18f Merge changes from David Woodhouse (bring up to date with MTD project)
gthomas
parents: 1118
diff changeset
64 if (!child_ic) {
121121d3d18f Merge changes from David Woodhouse (bring up to date with MTD project)
gthomas
parents: 1118
diff changeset
65 printk(KERN_NOTICE "Eep. Child \"%s\" (ino #%u) of dir ino #%u doesn't exist!\n",
121121d3d18f Merge changes from David Woodhouse (bring up to date with MTD project)
gthomas
parents: 1118
diff changeset
66 fd->name, fd->ino, ic->ino);
1881
9558d3d305bf Merge from public MTD repository
asl
parents: 1834
diff changeset
67 jffs2_mark_node_obsolete(c, fd->raw);
1372
121121d3d18f Merge changes from David Woodhouse (bring up to date with MTD project)
gthomas
parents: 1118
diff changeset
68 continue;
121121d3d18f Merge changes from David Woodhouse (bring up to date with MTD project)
gthomas
parents: 1118
diff changeset
69 }
121121d3d18f Merge changes from David Woodhouse (bring up to date with MTD project)
gthomas
parents: 1118
diff changeset
70
121121d3d18f Merge changes from David Woodhouse (bring up to date with MTD project)
gthomas
parents: 1118
diff changeset
71 if (child_ic->nlink++ && fd->type == DT_DIR) {
121121d3d18f Merge changes from David Woodhouse (bring up to date with MTD project)
gthomas
parents: 1118
diff changeset
72 printk(KERN_NOTICE "Child dir \"%s\" (ino #%u) of dir ino #%u appears to be a hard link\n", fd->name, fd->ino, ic->ino);
121121d3d18f Merge changes from David Woodhouse (bring up to date with MTD project)
gthomas
parents: 1118
diff changeset
73 if (fd->ino == 1 && ic->ino == 1) {
121121d3d18f Merge changes from David Woodhouse (bring up to date with MTD project)
gthomas
parents: 1118
diff changeset
74 printk(KERN_NOTICE "This is mostly harmless, and probably caused by creating a JFFS2 image\n");
121121d3d18f Merge changes from David Woodhouse (bring up to date with MTD project)
gthomas
parents: 1118
diff changeset
75 printk(KERN_NOTICE "using a buggy version of mkfs.jffs2. Use at least v1.17.\n");
121121d3d18f Merge changes from David Woodhouse (bring up to date with MTD project)
gthomas
parents: 1118
diff changeset
76 }
121121d3d18f Merge changes from David Woodhouse (bring up to date with MTD project)
gthomas
parents: 1118
diff changeset
77 /* What do we do about it? */
121121d3d18f Merge changes from David Woodhouse (bring up to date with MTD project)
gthomas
parents: 1118
diff changeset
78 }
121121d3d18f Merge changes from David Woodhouse (bring up to date with MTD project)
gthomas
parents: 1118
diff changeset
79 D1(printk(KERN_DEBUG "Increased nlink for child \"%s\" (ino #%u)\n", fd->name, fd->ino));
121121d3d18f Merge changes from David Woodhouse (bring up to date with MTD project)
gthomas
parents: 1118
diff changeset
80 /* Can't free them. We might need them in pass 2 */
121121d3d18f Merge changes from David Woodhouse (bring up to date with MTD project)
gthomas
parents: 1118
diff changeset
81 }
121121d3d18f Merge changes from David Woodhouse (bring up to date with MTD project)
gthomas
parents: 1118
diff changeset
82 }
121121d3d18f Merge changes from David Woodhouse (bring up to date with MTD project)
gthomas
parents: 1118
diff changeset
83
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
84 /* Scan plan:
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
85 - Scan physical nodes. Build map of inodes/dirents. Allocate inocaches as we go
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
86 - Scan directory tree from top down, setting nlink in inocaches
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
87 - Scan inocaches for inodes with nlink==0
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
88 */
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
89 static int jffs2_build_filesystem(struct jffs2_sb_info *c)
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
90 {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
91 int ret;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
92 int i;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
93 struct jffs2_inode_cache *ic;
1881
9558d3d305bf Merge from public MTD repository
asl
parents: 1834
diff changeset
94 struct jffs2_full_dirent *fd;
1372
121121d3d18f Merge changes from David Woodhouse (bring up to date with MTD project)
gthomas
parents: 1118
diff changeset
95 struct jffs2_full_dirent *dead_fds = NULL;
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
96
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
97 /* First, scan the medium and build all the inode caches with
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
98 lists of physical nodes */
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents: 208
diff changeset
99
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents: 208
diff changeset
100 c->flags |= JFFS2_SB_FLAG_MOUNTING;
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
101 ret = jffs2_scan_medium(c);
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
102 if (ret)
1881
9558d3d305bf Merge from public MTD repository
asl
parents: 1834
diff changeset
103 goto exit;
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
104
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
105 D1(printk(KERN_DEBUG "Scanned flash completely\n"));
1881
9558d3d305bf Merge from public MTD repository
asl
parents: 1834
diff changeset
106 D2(jffs2_dump_block_lists(c));
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents: 208
diff changeset
107
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents: 208
diff changeset
108 /* Now scan the directory tree, increasing nlink according to every dirent found. */
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
109 for_each_inode(i, c, ic) {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
110 D1(printk(KERN_DEBUG "Pass 1: ino #%u\n", ic->ino));
1372
121121d3d18f Merge changes from David Woodhouse (bring up to date with MTD project)
gthomas
parents: 1118
diff changeset
111
121121d3d18f Merge changes from David Woodhouse (bring up to date with MTD project)
gthomas
parents: 1118
diff changeset
112 D1(BUG_ON(ic->ino > c->highest_ino));
121121d3d18f Merge changes from David Woodhouse (bring up to date with MTD project)
gthomas
parents: 1118
diff changeset
113
121121d3d18f Merge changes from David Woodhouse (bring up to date with MTD project)
gthomas
parents: 1118
diff changeset
114 if (ic->scan_dents) {
121121d3d18f Merge changes from David Woodhouse (bring up to date with MTD project)
gthomas
parents: 1118
diff changeset
115 jffs2_build_inode_pass1(c, ic);
121121d3d18f Merge changes from David Woodhouse (bring up to date with MTD project)
gthomas
parents: 1118
diff changeset
116 cond_resched();
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
117 }
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
118 }
1881
9558d3d305bf Merge from public MTD repository
asl
parents: 1834
diff changeset
119 c->flags &= ~JFFS2_SB_FLAG_MOUNTING;
9558d3d305bf Merge from public MTD repository
asl
parents: 1834
diff changeset
120
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
121 D1(printk(KERN_DEBUG "Pass 1 complete\n"));
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
122
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
123 /* Next, scan for inodes with nlink == 0 and remove them. If
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
124 they were directories, then decrement the nlink of their
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
125 children too, and repeat the scan. As that's going to be
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
126 a fairly uncommon occurrence, it's not so evil to do it this
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
127 way. Recursion bad. */
1372
121121d3d18f Merge changes from David Woodhouse (bring up to date with MTD project)
gthomas
parents: 1118
diff changeset
128 D1(printk(KERN_DEBUG "Pass 2 starting\n"));
121121d3d18f Merge changes from David Woodhouse (bring up to date with MTD project)
gthomas
parents: 1118
diff changeset
129
121121d3d18f Merge changes from David Woodhouse (bring up to date with MTD project)
gthomas
parents: 1118
diff changeset
130 for_each_inode(i, c, ic) {
121121d3d18f Merge changes from David Woodhouse (bring up to date with MTD project)
gthomas
parents: 1118
diff changeset
131 D1(printk(KERN_DEBUG "Pass 2: ino #%u, nlink %d, ic %p, nodes %p\n", ic->ino, ic->nlink, ic, ic->nodes));
121121d3d18f Merge changes from David Woodhouse (bring up to date with MTD project)
gthomas
parents: 1118
diff changeset
132 if (ic->nlink)
121121d3d18f Merge changes from David Woodhouse (bring up to date with MTD project)
gthomas
parents: 1118
diff changeset
133 continue;
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
134
1372
121121d3d18f Merge changes from David Woodhouse (bring up to date with MTD project)
gthomas
parents: 1118
diff changeset
135 jffs2_build_remove_unlinked_inode(c, ic, &dead_fds);
121121d3d18f Merge changes from David Woodhouse (bring up to date with MTD project)
gthomas
parents: 1118
diff changeset
136 cond_resched();
121121d3d18f Merge changes from David Woodhouse (bring up to date with MTD project)
gthomas
parents: 1118
diff changeset
137 }
121121d3d18f Merge changes from David Woodhouse (bring up to date with MTD project)
gthomas
parents: 1118
diff changeset
138
121121d3d18f Merge changes from David Woodhouse (bring up to date with MTD project)
gthomas
parents: 1118
diff changeset
139 D1(printk(KERN_DEBUG "Pass 2a starting\n"));
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents: 208
diff changeset
140
1372
121121d3d18f Merge changes from David Woodhouse (bring up to date with MTD project)
gthomas
parents: 1118
diff changeset
141 while (dead_fds) {
1881
9558d3d305bf Merge from public MTD repository
asl
parents: 1834
diff changeset
142 fd = dead_fds;
1372
121121d3d18f Merge changes from David Woodhouse (bring up to date with MTD project)
gthomas
parents: 1118
diff changeset
143 dead_fds = fd->next;
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents: 208
diff changeset
144
1372
121121d3d18f Merge changes from David Woodhouse (bring up to date with MTD project)
gthomas
parents: 1118
diff changeset
145 ic = jffs2_get_ino_cache(c, fd->ino);
121121d3d18f Merge changes from David Woodhouse (bring up to date with MTD project)
gthomas
parents: 1118
diff changeset
146 D1(printk(KERN_DEBUG "Removing dead_fd ino #%u (\"%s\"), ic at %p\n", fd->ino, fd->name, ic));
121121d3d18f Merge changes from David Woodhouse (bring up to date with MTD project)
gthomas
parents: 1118
diff changeset
147
121121d3d18f Merge changes from David Woodhouse (bring up to date with MTD project)
gthomas
parents: 1118
diff changeset
148 if (ic)
121121d3d18f Merge changes from David Woodhouse (bring up to date with MTD project)
gthomas
parents: 1118
diff changeset
149 jffs2_build_remove_unlinked_inode(c, ic, &dead_fds);
121121d3d18f Merge changes from David Woodhouse (bring up to date with MTD project)
gthomas
parents: 1118
diff changeset
150 jffs2_free_full_dirent(fd);
121121d3d18f Merge changes from David Woodhouse (bring up to date with MTD project)
gthomas
parents: 1118
diff changeset
151 }
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents: 208
diff changeset
152
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
153 D1(printk(KERN_DEBUG "Pass 2 complete\n"));
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
154
1372
121121d3d18f Merge changes from David Woodhouse (bring up to date with MTD project)
gthomas
parents: 1118
diff changeset
155 /* Finally, we can scan again and free the dirent structs */
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
156 for_each_inode(i, c, ic) {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
157 D1(printk(KERN_DEBUG "Pass 3: ino #%u, ic %p, nodes %p\n", ic->ino, ic, ic->nodes));
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents: 208
diff changeset
158
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents: 208
diff changeset
159 while(ic->scan_dents) {
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents: 208
diff changeset
160 fd = ic->scan_dents;
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents: 208
diff changeset
161 ic->scan_dents = fd->next;
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
162 jffs2_free_full_dirent(fd);
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
163 }
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents: 208
diff changeset
164 ic->scan_dents = NULL;
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents: 208
diff changeset
165 cond_resched();
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
166 }
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
167 D1(printk(KERN_DEBUG "Pass 3 complete\n"));
1881
9558d3d305bf Merge from public MTD repository
asl
parents: 1834
diff changeset
168 D2(jffs2_dump_block_lists(c));
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents: 208
diff changeset
169
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents: 208
diff changeset
170 /* Rotate the lists by some number to ensure wear levelling */
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents: 208
diff changeset
171 jffs2_rotate_lists(c);
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
172
1881
9558d3d305bf Merge from public MTD repository
asl
parents: 1834
diff changeset
173 ret = 0;
9558d3d305bf Merge from public MTD repository
asl
parents: 1834
diff changeset
174
9558d3d305bf Merge from public MTD repository
asl
parents: 1834
diff changeset
175 exit:
9558d3d305bf Merge from public MTD repository
asl
parents: 1834
diff changeset
176 if (ret) {
9558d3d305bf Merge from public MTD repository
asl
parents: 1834
diff changeset
177 for_each_inode(i, c, ic) {
9558d3d305bf Merge from public MTD repository
asl
parents: 1834
diff changeset
178 while(ic->scan_dents) {
9558d3d305bf Merge from public MTD repository
asl
parents: 1834
diff changeset
179 fd = ic->scan_dents;
9558d3d305bf Merge from public MTD repository
asl
parents: 1834
diff changeset
180 ic->scan_dents = fd->next;
9558d3d305bf Merge from public MTD repository
asl
parents: 1834
diff changeset
181 jffs2_free_full_dirent(fd);
9558d3d305bf Merge from public MTD repository
asl
parents: 1834
diff changeset
182 }
9558d3d305bf Merge from public MTD repository
asl
parents: 1834
diff changeset
183 }
9558d3d305bf Merge from public MTD repository
asl
parents: 1834
diff changeset
184 }
9558d3d305bf Merge from public MTD repository
asl
parents: 1834
diff changeset
185
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
186 return ret;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
187 }
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents: 208
diff changeset
188
1372
121121d3d18f Merge changes from David Woodhouse (bring up to date with MTD project)
gthomas
parents: 1118
diff changeset
189 static void jffs2_build_remove_unlinked_inode(struct jffs2_sb_info *c, struct jffs2_inode_cache *ic, struct jffs2_full_dirent **dead_fds)
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
190 {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
191 struct jffs2_raw_node_ref *raw;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
192 struct jffs2_full_dirent *fd;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
193
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
194 D1(printk(KERN_DEBUG "JFFS2: Removing ino #%u with nlink == zero.\n", ic->ino));
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
195
1881
9558d3d305bf Merge from public MTD repository
asl
parents: 1834
diff changeset
196 raw = ic->nodes;
9558d3d305bf Merge from public MTD repository
asl
parents: 1834
diff changeset
197 while (raw != (void *)ic) {
9558d3d305bf Merge from public MTD repository
asl
parents: 1834
diff changeset
198 struct jffs2_raw_node_ref *next = raw->next_in_ino;
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents: 208
diff changeset
199 D1(printk(KERN_DEBUG "obsoleting node at 0x%08x\n", ref_offset(raw)));
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
200 jffs2_mark_node_obsolete(c, raw);
1881
9558d3d305bf Merge from public MTD repository
asl
parents: 1834
diff changeset
201 raw = next;
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
202 }
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
203
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents: 208
diff changeset
204 if (ic->scan_dents) {
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents: 208
diff changeset
205 int whinged = 0;
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents: 208
diff changeset
206 D1(printk(KERN_DEBUG "Inode #%u was a directory which may have children...\n", ic->ino));
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents: 208
diff changeset
207
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents: 208
diff changeset
208 while(ic->scan_dents) {
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
209 struct jffs2_inode_cache *child_ic;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
210
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents: 208
diff changeset
211 fd = ic->scan_dents;
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents: 208
diff changeset
212 ic->scan_dents = fd->next;
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents: 208
diff changeset
213
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents: 208
diff changeset
214 if (!fd->ino) {
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents: 208
diff changeset
215 /* It's a deletion dirent. Ignore it */
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents: 208
diff changeset
216 D1(printk(KERN_DEBUG "Child \"%s\" is a deletion dirent, skipping...\n", fd->name));
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents: 208
diff changeset
217 jffs2_free_full_dirent(fd);
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents: 208
diff changeset
218 continue;
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents: 208
diff changeset
219 }
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents: 208
diff changeset
220 if (!whinged) {
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents: 208
diff changeset
221 whinged = 1;
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents: 208
diff changeset
222 printk(KERN_NOTICE "Inode #%u was a directory with children - removing those too...\n", ic->ino);
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents: 208
diff changeset
223 }
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
224
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
225 D1(printk(KERN_DEBUG "Removing child \"%s\", ino #%u\n",
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
226 fd->name, fd->ino));
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
227
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
228 child_ic = jffs2_get_ino_cache(c, fd->ino);
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
229 if (!child_ic) {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
230 printk(KERN_NOTICE "Cannot remove child \"%s\", ino #%u, because it doesn't exist\n", fd->name, fd->ino);
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents: 208
diff changeset
231 jffs2_free_full_dirent(fd);
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
232 continue;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
233 }
1372
121121d3d18f Merge changes from David Woodhouse (bring up to date with MTD project)
gthomas
parents: 1118
diff changeset
234
121121d3d18f Merge changes from David Woodhouse (bring up to date with MTD project)
gthomas
parents: 1118
diff changeset
235 /* Reduce nlink of the child. If it's now zero, stick it on the
121121d3d18f Merge changes from David Woodhouse (bring up to date with MTD project)
gthomas
parents: 1118
diff changeset
236 dead_fds list to be cleaned up later. Else just free the fd */
121121d3d18f Merge changes from David Woodhouse (bring up to date with MTD project)
gthomas
parents: 1118
diff changeset
237
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
238 child_ic->nlink--;
1372
121121d3d18f Merge changes from David Woodhouse (bring up to date with MTD project)
gthomas
parents: 1118
diff changeset
239
121121d3d18f Merge changes from David Woodhouse (bring up to date with MTD project)
gthomas
parents: 1118
diff changeset
240 if (!child_ic->nlink) {
121121d3d18f Merge changes from David Woodhouse (bring up to date with MTD project)
gthomas
parents: 1118
diff changeset
241 D1(printk(KERN_DEBUG "Inode #%u (\"%s\") has now got zero nlink. Adding to dead_fds list.\n",
121121d3d18f Merge changes from David Woodhouse (bring up to date with MTD project)
gthomas
parents: 1118
diff changeset
242 fd->ino, fd->name));
121121d3d18f Merge changes from David Woodhouse (bring up to date with MTD project)
gthomas
parents: 1118
diff changeset
243 fd->next = *dead_fds;
121121d3d18f Merge changes from David Woodhouse (bring up to date with MTD project)
gthomas
parents: 1118
diff changeset
244 *dead_fds = fd;
121121d3d18f Merge changes from David Woodhouse (bring up to date with MTD project)
gthomas
parents: 1118
diff changeset
245 } else {
121121d3d18f Merge changes from David Woodhouse (bring up to date with MTD project)
gthomas
parents: 1118
diff changeset
246 D1(printk(KERN_DEBUG "Inode #%u (\"%s\") has now got nlink %d. Ignoring.\n",
121121d3d18f Merge changes from David Woodhouse (bring up to date with MTD project)
gthomas
parents: 1118
diff changeset
247 fd->ino, fd->name, child_ic->nlink));
121121d3d18f Merge changes from David Woodhouse (bring up to date with MTD project)
gthomas
parents: 1118
diff changeset
248 jffs2_free_full_dirent(fd);
121121d3d18f Merge changes from David Woodhouse (bring up to date with MTD project)
gthomas
parents: 1118
diff changeset
249 }
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
250 }
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
251 }
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
252
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
253 /*
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
254 We don't delete the inocache from the hash list and free it yet.
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
255 The erase code will do that, when all the nodes are completely gone.
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
256 */
1372
121121d3d18f Merge changes from David Woodhouse (bring up to date with MTD project)
gthomas
parents: 1118
diff changeset
257 }
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
258
1372
121121d3d18f Merge changes from David Woodhouse (bring up to date with MTD project)
gthomas
parents: 1118
diff changeset
259 static void jffs2_calc_trigger_levels(struct jffs2_sb_info *c)
121121d3d18f Merge changes from David Woodhouse (bring up to date with MTD project)
gthomas
parents: 1118
diff changeset
260 {
121121d3d18f Merge changes from David Woodhouse (bring up to date with MTD project)
gthomas
parents: 1118
diff changeset
261 uint32_t size;
121121d3d18f Merge changes from David Woodhouse (bring up to date with MTD project)
gthomas
parents: 1118
diff changeset
262
121121d3d18f Merge changes from David Woodhouse (bring up to date with MTD project)
gthomas
parents: 1118
diff changeset
263 /* Deletion should almost _always_ be allowed. We're fairly
121121d3d18f Merge changes from David Woodhouse (bring up to date with MTD project)
gthomas
parents: 1118
diff changeset
264 buggered once we stop allowing people to delete stuff
121121d3d18f Merge changes from David Woodhouse (bring up to date with MTD project)
gthomas
parents: 1118
diff changeset
265 because there's not enough free space... */
121121d3d18f Merge changes from David Woodhouse (bring up to date with MTD project)
gthomas
parents: 1118
diff changeset
266 c->resv_blocks_deletion = 2;
121121d3d18f Merge changes from David Woodhouse (bring up to date with MTD project)
gthomas
parents: 1118
diff changeset
267
121121d3d18f Merge changes from David Woodhouse (bring up to date with MTD project)
gthomas
parents: 1118
diff changeset
268 /* Be conservative about how much space we need before we allow writes.
121121d3d18f Merge changes from David Woodhouse (bring up to date with MTD project)
gthomas
parents: 1118
diff changeset
269 On top of that which is required for deletia, require an extra 2%
121121d3d18f Merge changes from David Woodhouse (bring up to date with MTD project)
gthomas
parents: 1118
diff changeset
270 of the medium to be available, for overhead caused by nodes being
121121d3d18f Merge changes from David Woodhouse (bring up to date with MTD project)
gthomas
parents: 1118
diff changeset
271 split across blocks, etc. */
121121d3d18f Merge changes from David Woodhouse (bring up to date with MTD project)
gthomas
parents: 1118
diff changeset
272
121121d3d18f Merge changes from David Woodhouse (bring up to date with MTD project)
gthomas
parents: 1118
diff changeset
273 size = c->flash_size / 50; /* 2% of flash size */
121121d3d18f Merge changes from David Woodhouse (bring up to date with MTD project)
gthomas
parents: 1118
diff changeset
274 size += c->nr_blocks * 100; /* And 100 bytes per eraseblock */
121121d3d18f Merge changes from David Woodhouse (bring up to date with MTD project)
gthomas
parents: 1118
diff changeset
275 size += c->sector_size - 1; /* ... and round up */
121121d3d18f Merge changes from David Woodhouse (bring up to date with MTD project)
gthomas
parents: 1118
diff changeset
276
121121d3d18f Merge changes from David Woodhouse (bring up to date with MTD project)
gthomas
parents: 1118
diff changeset
277 c->resv_blocks_write = c->resv_blocks_deletion + (size / c->sector_size);
121121d3d18f Merge changes from David Woodhouse (bring up to date with MTD project)
gthomas
parents: 1118
diff changeset
278
121121d3d18f Merge changes from David Woodhouse (bring up to date with MTD project)
gthomas
parents: 1118
diff changeset
279 /* When do we let the GC thread run in the background */
121121d3d18f Merge changes from David Woodhouse (bring up to date with MTD project)
gthomas
parents: 1118
diff changeset
280
121121d3d18f Merge changes from David Woodhouse (bring up to date with MTD project)
gthomas
parents: 1118
diff changeset
281 c->resv_blocks_gctrigger = c->resv_blocks_write + 1;
121121d3d18f Merge changes from David Woodhouse (bring up to date with MTD project)
gthomas
parents: 1118
diff changeset
282
121121d3d18f Merge changes from David Woodhouse (bring up to date with MTD project)
gthomas
parents: 1118
diff changeset
283 /* When do we allow garbage collection to merge nodes to make
121121d3d18f Merge changes from David Woodhouse (bring up to date with MTD project)
gthomas
parents: 1118
diff changeset
284 long-term progress at the expense of short-term space exhaustion? */
121121d3d18f Merge changes from David Woodhouse (bring up to date with MTD project)
gthomas
parents: 1118
diff changeset
285 c->resv_blocks_gcmerge = c->resv_blocks_deletion + 1;
121121d3d18f Merge changes from David Woodhouse (bring up to date with MTD project)
gthomas
parents: 1118
diff changeset
286
121121d3d18f Merge changes from David Woodhouse (bring up to date with MTD project)
gthomas
parents: 1118
diff changeset
287 /* When do we allow garbage collection to eat from bad blocks rather
121121d3d18f Merge changes from David Woodhouse (bring up to date with MTD project)
gthomas
parents: 1118
diff changeset
288 than actually making progress? */
121121d3d18f Merge changes from David Woodhouse (bring up to date with MTD project)
gthomas
parents: 1118
diff changeset
289 c->resv_blocks_gcbad = 0;//c->resv_blocks_deletion + 2;
121121d3d18f Merge changes from David Woodhouse (bring up to date with MTD project)
gthomas
parents: 1118
diff changeset
290
121121d3d18f Merge changes from David Woodhouse (bring up to date with MTD project)
gthomas
parents: 1118
diff changeset
291 /* If there's less than this amount of dirty space, don't bother
121121d3d18f Merge changes from David Woodhouse (bring up to date with MTD project)
gthomas
parents: 1118
diff changeset
292 trying to GC to make more space. It'll be a fruitless task */
121121d3d18f Merge changes from David Woodhouse (bring up to date with MTD project)
gthomas
parents: 1118
diff changeset
293 c->nospc_dirty_size = c->sector_size + (c->flash_size / 100);
121121d3d18f Merge changes from David Woodhouse (bring up to date with MTD project)
gthomas
parents: 1118
diff changeset
294
121121d3d18f Merge changes from David Woodhouse (bring up to date with MTD project)
gthomas
parents: 1118
diff changeset
295 D1(printk(KERN_DEBUG "JFFS2 trigger levels (size %d KiB, block size %d KiB, %d blocks)\n",
121121d3d18f Merge changes from David Woodhouse (bring up to date with MTD project)
gthomas
parents: 1118
diff changeset
296 c->flash_size / 1024, c->sector_size / 1024, c->nr_blocks));
121121d3d18f Merge changes from David Woodhouse (bring up to date with MTD project)
gthomas
parents: 1118
diff changeset
297 D1(printk(KERN_DEBUG "Blocks required to allow deletion: %d (%d KiB)\n",
121121d3d18f Merge changes from David Woodhouse (bring up to date with MTD project)
gthomas
parents: 1118
diff changeset
298 c->resv_blocks_deletion, c->resv_blocks_deletion*c->sector_size/1024));
121121d3d18f Merge changes from David Woodhouse (bring up to date with MTD project)
gthomas
parents: 1118
diff changeset
299 D1(printk(KERN_DEBUG "Blocks required to allow writes: %d (%d KiB)\n",
121121d3d18f Merge changes from David Woodhouse (bring up to date with MTD project)
gthomas
parents: 1118
diff changeset
300 c->resv_blocks_write, c->resv_blocks_write*c->sector_size/1024));
121121d3d18f Merge changes from David Woodhouse (bring up to date with MTD project)
gthomas
parents: 1118
diff changeset
301 D1(printk(KERN_DEBUG "Blocks required to quiesce GC thread: %d (%d KiB)\n",
121121d3d18f Merge changes from David Woodhouse (bring up to date with MTD project)
gthomas
parents: 1118
diff changeset
302 c->resv_blocks_gctrigger, c->resv_blocks_gctrigger*c->sector_size/1024));
121121d3d18f Merge changes from David Woodhouse (bring up to date with MTD project)
gthomas
parents: 1118
diff changeset
303 D1(printk(KERN_DEBUG "Blocks required to allow GC merges: %d (%d KiB)\n",
121121d3d18f Merge changes from David Woodhouse (bring up to date with MTD project)
gthomas
parents: 1118
diff changeset
304 c->resv_blocks_gcmerge, c->resv_blocks_gcmerge*c->sector_size/1024));
121121d3d18f Merge changes from David Woodhouse (bring up to date with MTD project)
gthomas
parents: 1118
diff changeset
305 D1(printk(KERN_DEBUG "Blocks required to GC bad blocks: %d (%d KiB)\n",
121121d3d18f Merge changes from David Woodhouse (bring up to date with MTD project)
gthomas
parents: 1118
diff changeset
306 c->resv_blocks_gcbad, c->resv_blocks_gcbad*c->sector_size/1024));
121121d3d18f Merge changes from David Woodhouse (bring up to date with MTD project)
gthomas
parents: 1118
diff changeset
307 D1(printk(KERN_DEBUG "Amount of dirty space required to GC: %d bytes\n",
121121d3d18f Merge changes from David Woodhouse (bring up to date with MTD project)
gthomas
parents: 1118
diff changeset
308 c->nospc_dirty_size));
121121d3d18f Merge changes from David Woodhouse (bring up to date with MTD project)
gthomas
parents: 1118
diff changeset
309 }
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
310
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
311 int jffs2_do_mount_fs(struct jffs2_sb_info *c)
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
312 {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
313 int i;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
314
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
315 c->free_size = c->flash_size;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
316 c->nr_blocks = c->flash_size / c->sector_size;
1881
9558d3d305bf Merge from public MTD repository
asl
parents: 1834
diff changeset
317 #ifndef __ECOS
9558d3d305bf Merge from public MTD repository
asl
parents: 1834
diff changeset
318 if (c->mtd->flags & MTD_NO_VIRTBLOCKS)
9558d3d305bf Merge from public MTD repository
asl
parents: 1834
diff changeset
319 c->blocks = vmalloc(sizeof(struct jffs2_eraseblock) * c->nr_blocks);
9558d3d305bf Merge from public MTD repository
asl
parents: 1834
diff changeset
320 else
9558d3d305bf Merge from public MTD repository
asl
parents: 1834
diff changeset
321 #endif
9558d3d305bf Merge from public MTD repository
asl
parents: 1834
diff changeset
322 c->blocks = kmalloc(sizeof(struct jffs2_eraseblock) * c->nr_blocks, GFP_KERNEL);
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
323 if (!c->blocks)
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
324 return -ENOMEM;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
325 for (i=0; i<c->nr_blocks; i++) {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
326 INIT_LIST_HEAD(&c->blocks[i].list);
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
327 c->blocks[i].offset = i * c->sector_size;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
328 c->blocks[i].free_size = c->sector_size;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
329 c->blocks[i].dirty_size = 0;
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents: 208
diff changeset
330 c->blocks[i].wasted_size = 0;
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents: 208
diff changeset
331 c->blocks[i].unchecked_size = 0;
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
332 c->blocks[i].used_size = 0;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
333 c->blocks[i].first_node = NULL;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
334 c->blocks[i].last_node = NULL;
1881
9558d3d305bf Merge from public MTD repository
asl
parents: 1834
diff changeset
335 c->blocks[i].bad_count = 0;
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
336 }
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
337
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
338 init_MUTEX(&c->alloc_sem);
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents: 208
diff changeset
339 init_MUTEX(&c->erase_free_sem);
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
340 init_waitqueue_head(&c->erase_wait);
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents: 208
diff changeset
341 init_waitqueue_head(&c->inocache_wq);
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
342 spin_lock_init(&c->erase_completion_lock);
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
343 spin_lock_init(&c->inocache_lock);
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
344
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
345 INIT_LIST_HEAD(&c->clean_list);
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents: 208
diff changeset
346 INIT_LIST_HEAD(&c->very_dirty_list);
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
347 INIT_LIST_HEAD(&c->dirty_list);
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents: 208
diff changeset
348 INIT_LIST_HEAD(&c->erasable_list);
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
349 INIT_LIST_HEAD(&c->erasing_list);
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
350 INIT_LIST_HEAD(&c->erase_pending_list);
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents: 208
diff changeset
351 INIT_LIST_HEAD(&c->erasable_pending_wbuf_list);
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
352 INIT_LIST_HEAD(&c->erase_complete_list);
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
353 INIT_LIST_HEAD(&c->free_list);
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
354 INIT_LIST_HEAD(&c->bad_list);
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
355 INIT_LIST_HEAD(&c->bad_used_list);
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
356 c->highest_ino = 1;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
357
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
358 if (jffs2_build_filesystem(c)) {
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
359 D1(printk(KERN_DEBUG "build_fs failed\n"));
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
360 jffs2_free_ino_caches(c);
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
361 jffs2_free_raw_node_refs(c);
1881
9558d3d305bf Merge from public MTD repository
asl
parents: 1834
diff changeset
362 #ifndef __ECOS
9558d3d305bf Merge from public MTD repository
asl
parents: 1834
diff changeset
363 if (c->mtd->flags & MTD_NO_VIRTBLOCKS)
9558d3d305bf Merge from public MTD repository
asl
parents: 1834
diff changeset
364 vfree(c->blocks);
9558d3d305bf Merge from public MTD repository
asl
parents: 1834
diff changeset
365 else
9558d3d305bf Merge from public MTD repository
asl
parents: 1834
diff changeset
366 #endif
9558d3d305bf Merge from public MTD repository
asl
parents: 1834
diff changeset
367 kfree(c->blocks);
9558d3d305bf Merge from public MTD repository
asl
parents: 1834
diff changeset
368
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
369 return -EIO;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
370 }
1372
121121d3d18f Merge changes from David Woodhouse (bring up to date with MTD project)
gthomas
parents: 1118
diff changeset
371
121121d3d18f Merge changes from David Woodhouse (bring up to date with MTD project)
gthomas
parents: 1118
diff changeset
372 jffs2_calc_trigger_levels(c);
121121d3d18f Merge changes from David Woodhouse (bring up to date with MTD project)
gthomas
parents: 1118
diff changeset
373
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
374 return 0;
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
375 }