kconfig/nconf: Fix hang when editing symbol with a long prompt
[linux/fpc-iii.git] / fs / jffs2 / build.c
blob99f0eaa7ab8283df625534f024c0a2586f909d3d
1 /*
2 * JFFS2 -- Journalling Flash File System, Version 2.
4 * Copyright © 2001-2007 Red Hat, Inc.
5 * Copyright © 2004-2010 David Woodhouse <dwmw2@infradead.org>
7 * Created by David Woodhouse <dwmw2@infradead.org>
9 * For licensing information, see the file 'LICENCE' in this directory.
13 #include <linux/kernel.h>
14 #include <linux/sched.h>
15 #include <linux/slab.h>
16 #include <linux/vmalloc.h>
17 #include <linux/mtd/mtd.h>
18 #include "nodelist.h"
20 static void jffs2_build_remove_unlinked_inode(struct jffs2_sb_info *,
21 struct jffs2_inode_cache *, struct jffs2_full_dirent **);
23 static inline struct jffs2_inode_cache *
24 first_inode_chain(int *i, struct jffs2_sb_info *c)
26 for (; *i < c->inocache_hashsize; (*i)++) {
27 if (c->inocache_list[*i])
28 return c->inocache_list[*i];
30 return NULL;
33 static inline struct jffs2_inode_cache *
34 next_inode(int *i, struct jffs2_inode_cache *ic, struct jffs2_sb_info *c)
36 /* More in this chain? */
37 if (ic->next)
38 return ic->next;
39 (*i)++;
40 return first_inode_chain(i, c);
43 #define for_each_inode(i, c, ic) \
44 for (i = 0, ic = first_inode_chain(&i, (c)); \
45 ic; \
46 ic = next_inode(&i, ic, (c)))
49 static void jffs2_build_inode_pass1(struct jffs2_sb_info *c,
50 struct jffs2_inode_cache *ic,
51 int *dir_hardlinks)
53 struct jffs2_full_dirent *fd;
55 dbg_fsbuild("building directory inode #%u\n", ic->ino);
57 /* For each child, increase nlink */
58 for(fd = ic->scan_dents; fd; fd = fd->next) {
59 struct jffs2_inode_cache *child_ic;
60 if (!fd->ino)
61 continue;
63 /* we can get high latency here with huge directories */
65 child_ic = jffs2_get_ino_cache(c, fd->ino);
66 if (!child_ic) {
67 dbg_fsbuild("child \"%s\" (ino #%u) of dir ino #%u doesn't exist!\n",
68 fd->name, fd->ino, ic->ino);
69 jffs2_mark_node_obsolete(c, fd->raw);
70 /* Clear the ic/raw union so it doesn't cause problems later. */
71 fd->ic = NULL;
72 continue;
75 /* From this point, fd->raw is no longer used so we can set fd->ic */
76 fd->ic = child_ic;
77 child_ic->pino_nlink++;
78 /* If we appear (at this stage) to have hard-linked directories,
79 * set a flag to trigger a scan later */
80 if (fd->type == DT_DIR) {
81 child_ic->flags |= INO_FLAGS_IS_DIR;
82 if (child_ic->pino_nlink > 1)
83 *dir_hardlinks = 1;
86 dbg_fsbuild("increased nlink for child \"%s\" (ino #%u)\n", fd->name, fd->ino);
87 /* Can't free scan_dents so far. We might need them in pass 2 */
91 /* Scan plan:
92 - Scan physical nodes. Build map of inodes/dirents. Allocate inocaches as we go
93 - Scan directory tree from top down, setting nlink in inocaches
94 - Scan inocaches for inodes with nlink==0
96 static int jffs2_build_filesystem(struct jffs2_sb_info *c)
98 int ret, i, dir_hardlinks = 0;
99 struct jffs2_inode_cache *ic;
100 struct jffs2_full_dirent *fd;
101 struct jffs2_full_dirent *dead_fds = NULL;
103 dbg_fsbuild("build FS data structures\n");
105 /* First, scan the medium and build all the inode caches with
106 lists of physical nodes */
108 c->flags |= JFFS2_SB_FLAG_SCANNING;
109 ret = jffs2_scan_medium(c);
110 c->flags &= ~JFFS2_SB_FLAG_SCANNING;
111 if (ret)
112 goto exit;
114 dbg_fsbuild("scanned flash completely\n");
115 jffs2_dbg_dump_block_lists_nolock(c);
117 dbg_fsbuild("pass 1 starting\n");
118 c->flags |= JFFS2_SB_FLAG_BUILDING;
119 /* Now scan the directory tree, increasing nlink according to every dirent found. */
120 for_each_inode(i, c, ic) {
121 if (ic->scan_dents) {
122 jffs2_build_inode_pass1(c, ic, &dir_hardlinks);
123 cond_resched();
127 dbg_fsbuild("pass 1 complete\n");
129 /* Next, scan for inodes with nlink == 0 and remove them. If
130 they were directories, then decrement the nlink of their
131 children too, and repeat the scan. As that's going to be
132 a fairly uncommon occurrence, it's not so evil to do it this
133 way. Recursion bad. */
134 dbg_fsbuild("pass 2 starting\n");
136 for_each_inode(i, c, ic) {
137 if (ic->pino_nlink)
138 continue;
140 jffs2_build_remove_unlinked_inode(c, ic, &dead_fds);
141 cond_resched();
144 dbg_fsbuild("pass 2a starting\n");
146 while (dead_fds) {
147 fd = dead_fds;
148 dead_fds = fd->next;
150 ic = jffs2_get_ino_cache(c, fd->ino);
152 if (ic)
153 jffs2_build_remove_unlinked_inode(c, ic, &dead_fds);
154 jffs2_free_full_dirent(fd);
157 dbg_fsbuild("pass 2a complete\n");
159 if (dir_hardlinks) {
160 /* If we detected directory hardlinks earlier, *hopefully*
161 * they are gone now because some of the links were from
162 * dead directories which still had some old dirents lying
163 * around and not yet garbage-collected, but which have
164 * been discarded above. So clear the pino_nlink field
165 * in each directory, so that the final scan below can
166 * print appropriate warnings. */
167 for_each_inode(i, c, ic) {
168 if (ic->flags & INO_FLAGS_IS_DIR)
169 ic->pino_nlink = 0;
172 dbg_fsbuild("freeing temporary data structures\n");
174 /* Finally, we can scan again and free the dirent structs */
175 for_each_inode(i, c, ic) {
176 while(ic->scan_dents) {
177 fd = ic->scan_dents;
178 ic->scan_dents = fd->next;
179 /* We do use the pino_nlink field to count nlink of
180 * directories during fs build, so set it to the
181 * parent ino# now. Now that there's hopefully only
182 * one. */
183 if (fd->type == DT_DIR) {
184 if (!fd->ic) {
185 /* We'll have complained about it and marked the coresponding
186 raw node obsolete already. Just skip it. */
187 continue;
190 /* We *have* to have set this in jffs2_build_inode_pass1() */
191 BUG_ON(!(fd->ic->flags & INO_FLAGS_IS_DIR));
193 /* We clear ic->pino_nlink ∀ directories' ic *only* if dir_hardlinks
194 * is set. Otherwise, we know this should never trigger anyway, so
195 * we don't do the check. And ic->pino_nlink still contains the nlink
196 * value (which is 1). */
197 if (dir_hardlinks && fd->ic->pino_nlink) {
198 JFFS2_ERROR("child dir \"%s\" (ino #%u) of dir ino #%u is also hard linked from dir ino #%u\n",
199 fd->name, fd->ino, ic->ino, fd->ic->pino_nlink);
200 /* Should we unlink it from its previous parent? */
203 /* For directories, ic->pino_nlink holds that parent inode # */
204 fd->ic->pino_nlink = ic->ino;
206 jffs2_free_full_dirent(fd);
208 ic->scan_dents = NULL;
209 cond_resched();
211 jffs2_build_xattr_subsystem(c);
212 c->flags &= ~JFFS2_SB_FLAG_BUILDING;
214 dbg_fsbuild("FS build complete\n");
216 /* Rotate the lists by some number to ensure wear levelling */
217 jffs2_rotate_lists(c);
219 ret = 0;
221 exit:
222 if (ret) {
223 for_each_inode(i, c, ic) {
224 while(ic->scan_dents) {
225 fd = ic->scan_dents;
226 ic->scan_dents = fd->next;
227 jffs2_free_full_dirent(fd);
230 jffs2_clear_xattr_subsystem(c);
233 return ret;
236 static void jffs2_build_remove_unlinked_inode(struct jffs2_sb_info *c,
237 struct jffs2_inode_cache *ic,
238 struct jffs2_full_dirent **dead_fds)
240 struct jffs2_raw_node_ref *raw;
241 struct jffs2_full_dirent *fd;
243 dbg_fsbuild("removing ino #%u with nlink == zero.\n", ic->ino);
245 raw = ic->nodes;
246 while (raw != (void *)ic) {
247 struct jffs2_raw_node_ref *next = raw->next_in_ino;
248 dbg_fsbuild("obsoleting node at 0x%08x\n", ref_offset(raw));
249 jffs2_mark_node_obsolete(c, raw);
250 raw = next;
253 if (ic->scan_dents) {
254 int whinged = 0;
255 dbg_fsbuild("inode #%u was a directory which may have children...\n", ic->ino);
257 while(ic->scan_dents) {
258 struct jffs2_inode_cache *child_ic;
260 fd = ic->scan_dents;
261 ic->scan_dents = fd->next;
263 if (!fd->ino) {
264 /* It's a deletion dirent. Ignore it */
265 dbg_fsbuild("child \"%s\" is a deletion dirent, skipping...\n", fd->name);
266 jffs2_free_full_dirent(fd);
267 continue;
269 if (!whinged)
270 whinged = 1;
272 dbg_fsbuild("removing child \"%s\", ino #%u\n", fd->name, fd->ino);
274 child_ic = jffs2_get_ino_cache(c, fd->ino);
275 if (!child_ic) {
276 dbg_fsbuild("cannot remove child \"%s\", ino #%u, because it doesn't exist\n",
277 fd->name, fd->ino);
278 jffs2_free_full_dirent(fd);
279 continue;
282 /* Reduce nlink of the child. If it's now zero, stick it on the
283 dead_fds list to be cleaned up later. Else just free the fd */
284 child_ic->pino_nlink--;
286 if (!child_ic->pino_nlink) {
287 dbg_fsbuild("inode #%u (\"%s\") now has no links; adding to dead_fds list.\n",
288 fd->ino, fd->name);
289 fd->next = *dead_fds;
290 *dead_fds = fd;
291 } else {
292 dbg_fsbuild("inode #%u (\"%s\") has now got nlink %d. Ignoring.\n",
293 fd->ino, fd->name, child_ic->pino_nlink);
294 jffs2_free_full_dirent(fd);
300 We don't delete the inocache from the hash list and free it yet.
301 The erase code will do that, when all the nodes are completely gone.
305 static void jffs2_calc_trigger_levels(struct jffs2_sb_info *c)
307 uint32_t size;
309 /* Deletion should almost _always_ be allowed. We're fairly
310 buggered once we stop allowing people to delete stuff
311 because there's not enough free space... */
312 c->resv_blocks_deletion = 2;
314 /* Be conservative about how much space we need before we allow writes.
315 On top of that which is required for deletia, require an extra 2%
316 of the medium to be available, for overhead caused by nodes being
317 split across blocks, etc. */
319 size = c->flash_size / 50; /* 2% of flash size */
320 size += c->nr_blocks * 100; /* And 100 bytes per eraseblock */
321 size += c->sector_size - 1; /* ... and round up */
323 c->resv_blocks_write = c->resv_blocks_deletion + (size / c->sector_size);
325 /* When do we let the GC thread run in the background */
327 c->resv_blocks_gctrigger = c->resv_blocks_write + 1;
329 /* When do we allow garbage collection to merge nodes to make
330 long-term progress at the expense of short-term space exhaustion? */
331 c->resv_blocks_gcmerge = c->resv_blocks_deletion + 1;
333 /* When do we allow garbage collection to eat from bad blocks rather
334 than actually making progress? */
335 c->resv_blocks_gcbad = 0;//c->resv_blocks_deletion + 2;
337 /* What number of 'very dirty' eraseblocks do we allow before we
338 trigger the GC thread even if we don't _need_ the space. When we
339 can't mark nodes obsolete on the medium, the old dirty nodes cause
340 performance problems because we have to inspect and discard them. */
341 c->vdirty_blocks_gctrigger = c->resv_blocks_gctrigger;
342 if (jffs2_can_mark_obsolete(c))
343 c->vdirty_blocks_gctrigger *= 10;
345 /* If there's less than this amount of dirty space, don't bother
346 trying to GC to make more space. It'll be a fruitless task */
347 c->nospc_dirty_size = c->sector_size + (c->flash_size / 100);
349 dbg_fsbuild("JFFS2 trigger levels (size %d KiB, block size %d KiB, %d blocks)\n",
350 c->flash_size / 1024, c->sector_size / 1024, c->nr_blocks);
351 dbg_fsbuild("Blocks required to allow deletion: %d (%d KiB)\n",
352 c->resv_blocks_deletion, c->resv_blocks_deletion*c->sector_size/1024);
353 dbg_fsbuild("Blocks required to allow writes: %d (%d KiB)\n",
354 c->resv_blocks_write, c->resv_blocks_write*c->sector_size/1024);
355 dbg_fsbuild("Blocks required to quiesce GC thread: %d (%d KiB)\n",
356 c->resv_blocks_gctrigger, c->resv_blocks_gctrigger*c->sector_size/1024);
357 dbg_fsbuild("Blocks required to allow GC merges: %d (%d KiB)\n",
358 c->resv_blocks_gcmerge, c->resv_blocks_gcmerge*c->sector_size/1024);
359 dbg_fsbuild("Blocks required to GC bad blocks: %d (%d KiB)\n",
360 c->resv_blocks_gcbad, c->resv_blocks_gcbad*c->sector_size/1024);
361 dbg_fsbuild("Amount of dirty space required to GC: %d bytes\n",
362 c->nospc_dirty_size);
363 dbg_fsbuild("Very dirty blocks before GC triggered: %d\n",
364 c->vdirty_blocks_gctrigger);
367 int jffs2_do_mount_fs(struct jffs2_sb_info *c)
369 int ret;
370 int i;
371 int size;
373 c->free_size = c->flash_size;
374 c->nr_blocks = c->flash_size / c->sector_size;
375 size = sizeof(struct jffs2_eraseblock) * c->nr_blocks;
376 #ifndef __ECOS
377 if (jffs2_blocks_use_vmalloc(c))
378 c->blocks = vzalloc(size);
379 else
380 #endif
381 c->blocks = kzalloc(size, GFP_KERNEL);
382 if (!c->blocks)
383 return -ENOMEM;
385 for (i=0; i<c->nr_blocks; i++) {
386 INIT_LIST_HEAD(&c->blocks[i].list);
387 c->blocks[i].offset = i * c->sector_size;
388 c->blocks[i].free_size = c->sector_size;
391 INIT_LIST_HEAD(&c->clean_list);
392 INIT_LIST_HEAD(&c->very_dirty_list);
393 INIT_LIST_HEAD(&c->dirty_list);
394 INIT_LIST_HEAD(&c->erasable_list);
395 INIT_LIST_HEAD(&c->erasing_list);
396 INIT_LIST_HEAD(&c->erase_checking_list);
397 INIT_LIST_HEAD(&c->erase_pending_list);
398 INIT_LIST_HEAD(&c->erasable_pending_wbuf_list);
399 INIT_LIST_HEAD(&c->erase_complete_list);
400 INIT_LIST_HEAD(&c->free_list);
401 INIT_LIST_HEAD(&c->bad_list);
402 INIT_LIST_HEAD(&c->bad_used_list);
403 c->highest_ino = 1;
404 c->summary = NULL;
406 ret = jffs2_sum_init(c);
407 if (ret)
408 goto out_free;
410 if (jffs2_build_filesystem(c)) {
411 dbg_fsbuild("build_fs failed\n");
412 jffs2_free_ino_caches(c);
413 jffs2_free_raw_node_refs(c);
414 ret = -EIO;
415 goto out_free;
418 jffs2_calc_trigger_levels(c);
420 return 0;
422 out_free:
423 #ifndef __ECOS
424 if (jffs2_blocks_use_vmalloc(c))
425 vfree(c->blocks);
426 else
427 #endif
428 kfree(c->blocks);
430 return ret;