ACPI: handle battery notify event on broken BIOS
[linux-2.6/linux-acpi-2.6/ibm-acpi-2.6.git] / fs / jffs2 / build.c
blob02826967ab58918ac6fa6ec7723d5e81485c357e
1 /*
2 * JFFS2 -- Journalling Flash File System, Version 2.
4 * Copyright (C) 2001-2003 Red Hat, Inc.
6 * Created by David Woodhouse <dwmw2@infradead.org>
8 * For licensing information, see the file 'LICENCE' in this directory.
10 * $Id: build.c,v 1.85 2005/11/07 11:14:38 gleixner Exp $
14 #include <linux/kernel.h>
15 #include <linux/sched.h>
16 #include <linux/slab.h>
17 #include <linux/vmalloc.h>
18 #include <linux/mtd/mtd.h>
19 #include "nodelist.h"
21 static void jffs2_build_remove_unlinked_inode(struct jffs2_sb_info *,
22 struct jffs2_inode_cache *, struct jffs2_full_dirent **);
24 static inline struct jffs2_inode_cache *
25 first_inode_chain(int *i, struct jffs2_sb_info *c)
27 for (; *i < INOCACHE_HASHSIZE; (*i)++) {
28 if (c->inocache_list[*i])
29 return c->inocache_list[*i];
31 return NULL;
34 static inline struct jffs2_inode_cache *
35 next_inode(int *i, struct jffs2_inode_cache *ic, struct jffs2_sb_info *c)
37 /* More in this chain? */
38 if (ic->next)
39 return ic->next;
40 (*i)++;
41 return first_inode_chain(i, c);
44 #define for_each_inode(i, c, ic) \
45 for (i = 0, ic = first_inode_chain(&i, (c)); \
46 ic; \
47 ic = next_inode(&i, ic, (c)))
50 static void jffs2_build_inode_pass1(struct jffs2_sb_info *c,
51 struct jffs2_inode_cache *ic)
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 continue;
73 if (child_ic->nlink++ && fd->type == DT_DIR) {
74 JFFS2_ERROR("child dir \"%s\" (ino #%u) of dir ino #%u appears to be a hard link\n",
75 fd->name, fd->ino, ic->ino);
76 /* TODO: What do we do about it? */
78 dbg_fsbuild("increased nlink for child \"%s\" (ino #%u)\n", fd->name, fd->ino);
79 /* Can't free scan_dents so far. We might need them in pass 2 */
83 /* Scan plan:
84 - Scan physical nodes. Build map of inodes/dirents. Allocate inocaches as we go
85 - Scan directory tree from top down, setting nlink in inocaches
86 - Scan inocaches for inodes with nlink==0
88 static int jffs2_build_filesystem(struct jffs2_sb_info *c)
90 int ret;
91 int i;
92 struct jffs2_inode_cache *ic;
93 struct jffs2_full_dirent *fd;
94 struct jffs2_full_dirent *dead_fds = NULL;
96 dbg_fsbuild("build FS data structures\n");
98 /* First, scan the medium and build all the inode caches with
99 lists of physical nodes */
101 c->flags |= JFFS2_SB_FLAG_SCANNING;
102 ret = jffs2_scan_medium(c);
103 c->flags &= ~JFFS2_SB_FLAG_SCANNING;
104 if (ret)
105 goto exit;
107 dbg_fsbuild("scanned flash completely\n");
108 jffs2_dbg_dump_block_lists_nolock(c);
110 dbg_fsbuild("pass 1 starting\n");
111 c->flags |= JFFS2_SB_FLAG_BUILDING;
112 /* Now scan the directory tree, increasing nlink according to every dirent found. */
113 for_each_inode(i, c, ic) {
114 if (ic->scan_dents) {
115 jffs2_build_inode_pass1(c, ic);
116 cond_resched();
120 dbg_fsbuild("pass 1 complete\n");
122 /* Next, scan for inodes with nlink == 0 and remove them. If
123 they were directories, then decrement the nlink of their
124 children too, and repeat the scan. As that's going to be
125 a fairly uncommon occurrence, it's not so evil to do it this
126 way. Recursion bad. */
127 dbg_fsbuild("pass 2 starting\n");
129 for_each_inode(i, c, ic) {
130 if (ic->nlink)
131 continue;
133 jffs2_build_remove_unlinked_inode(c, ic, &dead_fds);
134 cond_resched();
137 dbg_fsbuild("pass 2a starting\n");
139 while (dead_fds) {
140 fd = dead_fds;
141 dead_fds = fd->next;
143 ic = jffs2_get_ino_cache(c, fd->ino);
145 if (ic)
146 jffs2_build_remove_unlinked_inode(c, ic, &dead_fds);
147 jffs2_free_full_dirent(fd);
150 dbg_fsbuild("pass 2a complete\n");
151 dbg_fsbuild("freeing temporary data structures\n");
153 /* Finally, we can scan again and free the dirent structs */
154 for_each_inode(i, c, ic) {
155 while(ic->scan_dents) {
156 fd = ic->scan_dents;
157 ic->scan_dents = fd->next;
158 jffs2_free_full_dirent(fd);
160 ic->scan_dents = NULL;
161 cond_resched();
163 jffs2_build_xattr_subsystem(c);
164 c->flags &= ~JFFS2_SB_FLAG_BUILDING;
166 dbg_fsbuild("FS build complete\n");
168 /* Rotate the lists by some number to ensure wear levelling */
169 jffs2_rotate_lists(c);
171 ret = 0;
173 exit:
174 if (ret) {
175 for_each_inode(i, c, ic) {
176 while(ic->scan_dents) {
177 fd = ic->scan_dents;
178 ic->scan_dents = fd->next;
179 jffs2_free_full_dirent(fd);
182 jffs2_clear_xattr_subsystem(c);
185 return ret;
188 static void jffs2_build_remove_unlinked_inode(struct jffs2_sb_info *c,
189 struct jffs2_inode_cache *ic,
190 struct jffs2_full_dirent **dead_fds)
192 struct jffs2_raw_node_ref *raw;
193 struct jffs2_full_dirent *fd;
195 dbg_fsbuild("removing ino #%u with nlink == zero.\n", ic->ino);
197 raw = ic->nodes;
198 while (raw != (void *)ic) {
199 struct jffs2_raw_node_ref *next = raw->next_in_ino;
200 dbg_fsbuild("obsoleting node at 0x%08x\n", ref_offset(raw));
201 jffs2_mark_node_obsolete(c, raw);
202 raw = next;
205 if (ic->scan_dents) {
206 int whinged = 0;
207 dbg_fsbuild("inode #%u was a directory which may have children...\n", ic->ino);
209 while(ic->scan_dents) {
210 struct jffs2_inode_cache *child_ic;
212 fd = ic->scan_dents;
213 ic->scan_dents = fd->next;
215 if (!fd->ino) {
216 /* It's a deletion dirent. Ignore it */
217 dbg_fsbuild("child \"%s\" is a deletion dirent, skipping...\n", fd->name);
218 jffs2_free_full_dirent(fd);
219 continue;
221 if (!whinged)
222 whinged = 1;
224 dbg_fsbuild("removing child \"%s\", ino #%u\n", fd->name, fd->ino);
226 child_ic = jffs2_get_ino_cache(c, fd->ino);
227 if (!child_ic) {
228 dbg_fsbuild("cannot remove child \"%s\", ino #%u, because it doesn't exist\n",
229 fd->name, fd->ino);
230 jffs2_free_full_dirent(fd);
231 continue;
234 /* Reduce nlink of the child. If it's now zero, stick it on the
235 dead_fds list to be cleaned up later. Else just free the fd */
237 child_ic->nlink--;
239 if (!child_ic->nlink) {
240 dbg_fsbuild("inode #%u (\"%s\") has now got zero nlink, adding to dead_fds list.\n",
241 fd->ino, fd->name);
242 fd->next = *dead_fds;
243 *dead_fds = fd;
244 } else {
245 dbg_fsbuild("inode #%u (\"%s\") has now got nlink %d. Ignoring.\n",
246 fd->ino, fd->name, child_ic->nlink);
247 jffs2_free_full_dirent(fd);
253 We don't delete the inocache from the hash list and free it yet.
254 The erase code will do that, when all the nodes are completely gone.
258 static void jffs2_calc_trigger_levels(struct jffs2_sb_info *c)
260 uint32_t size;
262 /* Deletion should almost _always_ be allowed. We're fairly
263 buggered once we stop allowing people to delete stuff
264 because there's not enough free space... */
265 c->resv_blocks_deletion = 2;
267 /* Be conservative about how much space we need before we allow writes.
268 On top of that which is required for deletia, require an extra 2%
269 of the medium to be available, for overhead caused by nodes being
270 split across blocks, etc. */
272 size = c->flash_size / 50; /* 2% of flash size */
273 size += c->nr_blocks * 100; /* And 100 bytes per eraseblock */
274 size += c->sector_size - 1; /* ... and round up */
276 c->resv_blocks_write = c->resv_blocks_deletion + (size / c->sector_size);
278 /* When do we let the GC thread run in the background */
280 c->resv_blocks_gctrigger = c->resv_blocks_write + 1;
282 /* When do we allow garbage collection to merge nodes to make
283 long-term progress at the expense of short-term space exhaustion? */
284 c->resv_blocks_gcmerge = c->resv_blocks_deletion + 1;
286 /* When do we allow garbage collection to eat from bad blocks rather
287 than actually making progress? */
288 c->resv_blocks_gcbad = 0;//c->resv_blocks_deletion + 2;
290 /* If there's less than this amount of dirty space, don't bother
291 trying to GC to make more space. It'll be a fruitless task */
292 c->nospc_dirty_size = c->sector_size + (c->flash_size / 100);
294 dbg_fsbuild("JFFS2 trigger levels (size %d KiB, block size %d KiB, %d blocks)\n",
295 c->flash_size / 1024, c->sector_size / 1024, c->nr_blocks);
296 dbg_fsbuild("Blocks required to allow deletion: %d (%d KiB)\n",
297 c->resv_blocks_deletion, c->resv_blocks_deletion*c->sector_size/1024);
298 dbg_fsbuild("Blocks required to allow writes: %d (%d KiB)\n",
299 c->resv_blocks_write, c->resv_blocks_write*c->sector_size/1024);
300 dbg_fsbuild("Blocks required to quiesce GC thread: %d (%d KiB)\n",
301 c->resv_blocks_gctrigger, c->resv_blocks_gctrigger*c->sector_size/1024);
302 dbg_fsbuild("Blocks required to allow GC merges: %d (%d KiB)\n",
303 c->resv_blocks_gcmerge, c->resv_blocks_gcmerge*c->sector_size/1024);
304 dbg_fsbuild("Blocks required to GC bad blocks: %d (%d KiB)\n",
305 c->resv_blocks_gcbad, c->resv_blocks_gcbad*c->sector_size/1024);
306 dbg_fsbuild("Amount of dirty space required to GC: %d bytes\n",
307 c->nospc_dirty_size);
310 int jffs2_do_mount_fs(struct jffs2_sb_info *c)
312 int ret;
313 int i;
314 int size;
316 c->free_size = c->flash_size;
317 c->nr_blocks = c->flash_size / c->sector_size;
318 size = sizeof(struct jffs2_eraseblock) * c->nr_blocks;
319 #ifndef __ECOS
320 if (jffs2_blocks_use_vmalloc(c))
321 c->blocks = vmalloc(size);
322 else
323 #endif
324 c->blocks = kmalloc(size, GFP_KERNEL);
325 if (!c->blocks)
326 return -ENOMEM;
328 memset(c->blocks, 0, size);
329 for (i=0; i<c->nr_blocks; i++) {
330 INIT_LIST_HEAD(&c->blocks[i].list);
331 c->blocks[i].offset = i * c->sector_size;
332 c->blocks[i].free_size = c->sector_size;
335 INIT_LIST_HEAD(&c->clean_list);
336 INIT_LIST_HEAD(&c->very_dirty_list);
337 INIT_LIST_HEAD(&c->dirty_list);
338 INIT_LIST_HEAD(&c->erasable_list);
339 INIT_LIST_HEAD(&c->erasing_list);
340 INIT_LIST_HEAD(&c->erase_pending_list);
341 INIT_LIST_HEAD(&c->erasable_pending_wbuf_list);
342 INIT_LIST_HEAD(&c->erase_complete_list);
343 INIT_LIST_HEAD(&c->free_list);
344 INIT_LIST_HEAD(&c->bad_list);
345 INIT_LIST_HEAD(&c->bad_used_list);
346 c->highest_ino = 1;
347 c->summary = NULL;
349 ret = jffs2_sum_init(c);
350 if (ret)
351 return ret;
353 if (jffs2_build_filesystem(c)) {
354 dbg_fsbuild("build_fs failed\n");
355 jffs2_free_ino_caches(c);
356 jffs2_free_raw_node_refs(c);
357 #ifndef __ECOS
358 if (jffs2_blocks_use_vmalloc(c))
359 vfree(c->blocks);
360 else
361 #endif
362 kfree(c->blocks);
364 return -EIO;
367 jffs2_calc_trigger_levels(c);
369 return 0;