Lines Matching +full:child +full:- +full:nodes
2 * JFFS2 -- Journalling Flash File System, Version 2.
4 * Copyright © 2001-2007 Red Hat, Inc.
5 * Copyright © 2004-2010 David Woodhouse <dwmw2@infradead.org>
29 for (; *i < c->inocache_hashsize; (*i)++) { in first_inode_chain()
30 if (c->inocache_list[*i]) in first_inode_chain()
31 return c->inocache_list[*i]; in first_inode_chain()
40 if (ic->next) in next_inode()
41 return ic->next; in next_inode()
58 dbg_fsbuild("building directory inode #%u\n", ic->ino); in jffs2_build_inode_pass1()
60 /* For each child, increase nlink */ in jffs2_build_inode_pass1()
61 for(fd = ic->scan_dents; fd; fd = fd->next) { in jffs2_build_inode_pass1()
63 if (!fd->ino) in jffs2_build_inode_pass1()
68 child_ic = jffs2_get_ino_cache(c, fd->ino); in jffs2_build_inode_pass1()
70 dbg_fsbuild("child \"%s\" (ino #%u) of dir ino #%u doesn't exist!\n", in jffs2_build_inode_pass1()
71 fd->name, fd->ino, ic->ino); in jffs2_build_inode_pass1()
72 jffs2_mark_node_obsolete(c, fd->raw); in jffs2_build_inode_pass1()
74 fd->ic = NULL; in jffs2_build_inode_pass1()
78 /* From this point, fd->raw is no longer used so we can set fd->ic */ in jffs2_build_inode_pass1()
79 fd->ic = child_ic; in jffs2_build_inode_pass1()
80 child_ic->pino_nlink++; in jffs2_build_inode_pass1()
81 /* If we appear (at this stage) to have hard-linked directories, in jffs2_build_inode_pass1()
83 if (fd->type == DT_DIR) { in jffs2_build_inode_pass1()
84 child_ic->flags |= INO_FLAGS_IS_DIR; in jffs2_build_inode_pass1()
85 if (child_ic->pino_nlink > 1) in jffs2_build_inode_pass1()
89 dbg_fsbuild("increased nlink for child \"%s\" (ino #%u)\n", fd->name, fd->ino); in jffs2_build_inode_pass1()
95 - Scan physical nodes. Build map of inodes/dirents. Allocate inocaches as we go
96 - Scan directory tree from top down, setting nlink in inocaches
97 - Scan inocaches for inodes with nlink==0
109 lists of physical nodes */ in jffs2_build_filesystem()
111 c->flags |= JFFS2_SB_FLAG_SCANNING; in jffs2_build_filesystem()
113 c->flags &= ~JFFS2_SB_FLAG_SCANNING; in jffs2_build_filesystem()
121 c->flags |= JFFS2_SB_FLAG_BUILDING; in jffs2_build_filesystem()
124 if (ic->scan_dents) { in jffs2_build_filesystem()
140 if (ic->pino_nlink) in jffs2_build_filesystem()
151 dead_fds = fd->next; in jffs2_build_filesystem()
153 ic = jffs2_get_ino_cache(c, fd->ino); in jffs2_build_filesystem()
166 * around and not yet garbage-collected, but which have in jffs2_build_filesystem()
171 if (ic->flags & INO_FLAGS_IS_DIR) in jffs2_build_filesystem()
172 ic->pino_nlink = 0; in jffs2_build_filesystem()
179 while(ic->scan_dents) { in jffs2_build_filesystem()
180 fd = ic->scan_dents; in jffs2_build_filesystem()
181 ic->scan_dents = fd->next; in jffs2_build_filesystem()
186 if (fd->type == DT_DIR) { in jffs2_build_filesystem()
187 if (!fd->ic) { in jffs2_build_filesystem()
194 BUG_ON(!(fd->ic->flags & INO_FLAGS_IS_DIR)); in jffs2_build_filesystem()
196 /* We clear ic->pino_nlink ∀ directories' ic *only* if dir_hardlinks in jffs2_build_filesystem()
198 * we don't do the check. And ic->pino_nlink still contains the nlink in jffs2_build_filesystem()
200 if (dir_hardlinks && fd->ic->pino_nlink) { in jffs2_build_filesystem()
201 JFFS2_ERROR("child dir \"%s\" (ino #%u) of dir ino #%u is also hard linked from dir ino #%u\n", in jffs2_build_filesystem()
202 fd->name, fd->ino, ic->ino, fd->ic->pino_nlink); in jffs2_build_filesystem()
206 /* For directories, ic->pino_nlink holds that parent inode # */ in jffs2_build_filesystem()
207 fd->ic->pino_nlink = ic->ino; in jffs2_build_filesystem()
211 ic->scan_dents = NULL; in jffs2_build_filesystem()
218 c->flags &= ~JFFS2_SB_FLAG_BUILDING; in jffs2_build_filesystem()
230 while(ic->scan_dents) { in jffs2_build_filesystem()
231 fd = ic->scan_dents; in jffs2_build_filesystem()
232 ic->scan_dents = fd->next; in jffs2_build_filesystem()
249 dbg_fsbuild("removing ino #%u with nlink == zero.\n", ic->ino); in jffs2_build_remove_unlinked_inode()
251 raw = ic->nodes; in jffs2_build_remove_unlinked_inode()
253 struct jffs2_raw_node_ref *next = raw->next_in_ino; in jffs2_build_remove_unlinked_inode()
259 if (ic->scan_dents) { in jffs2_build_remove_unlinked_inode()
261 dbg_fsbuild("inode #%u was a directory which may have children...\n", ic->ino); in jffs2_build_remove_unlinked_inode()
263 while(ic->scan_dents) { in jffs2_build_remove_unlinked_inode()
266 fd = ic->scan_dents; in jffs2_build_remove_unlinked_inode()
267 ic->scan_dents = fd->next; in jffs2_build_remove_unlinked_inode()
269 if (!fd->ino) { in jffs2_build_remove_unlinked_inode()
271 dbg_fsbuild("child \"%s\" is a deletion dirent, skipping...\n", fd->name); in jffs2_build_remove_unlinked_inode()
278 dbg_fsbuild("removing child \"%s\", ino #%u\n", fd->name, fd->ino); in jffs2_build_remove_unlinked_inode()
280 child_ic = jffs2_get_ino_cache(c, fd->ino); in jffs2_build_remove_unlinked_inode()
282 dbg_fsbuild("cannot remove child \"%s\", ino #%u, because it doesn't exist\n", in jffs2_build_remove_unlinked_inode()
283 fd->name, fd->ino); in jffs2_build_remove_unlinked_inode()
288 /* Reduce nlink of the child. If it's now zero, stick it on the in jffs2_build_remove_unlinked_inode()
290 child_ic->pino_nlink--; in jffs2_build_remove_unlinked_inode()
292 if (!child_ic->pino_nlink) { in jffs2_build_remove_unlinked_inode()
294 fd->ino, fd->name); in jffs2_build_remove_unlinked_inode()
295 fd->next = *dead_fds; in jffs2_build_remove_unlinked_inode()
299 fd->ino, fd->name, child_ic->pino_nlink); in jffs2_build_remove_unlinked_inode()
307 The erase code will do that, when all the nodes are completely gone. in jffs2_build_remove_unlinked_inode()
318 c->resv_blocks_deletion = 2; in jffs2_calc_trigger_levels()
322 of the medium to be available, for overhead caused by nodes being in jffs2_calc_trigger_levels()
325 size = c->flash_size / 50; /* 2% of flash size */ in jffs2_calc_trigger_levels()
326 size += c->nr_blocks * 100; /* And 100 bytes per eraseblock */ in jffs2_calc_trigger_levels()
327 size += c->sector_size - 1; /* ... and round up */ in jffs2_calc_trigger_levels()
329 c->resv_blocks_write = c->resv_blocks_deletion + (size / c->sector_size); in jffs2_calc_trigger_levels()
333 c->resv_blocks_gctrigger = c->resv_blocks_write + 1; in jffs2_calc_trigger_levels()
335 /* When do we allow garbage collection to merge nodes to make in jffs2_calc_trigger_levels()
336 long-term progress at the expense of short-term space exhaustion? */ in jffs2_calc_trigger_levels()
337 c->resv_blocks_gcmerge = c->resv_blocks_deletion + 1; in jffs2_calc_trigger_levels()
341 c->resv_blocks_gcbad = 0;//c->resv_blocks_deletion + 2; in jffs2_calc_trigger_levels()
345 can't mark nodes obsolete on the medium, the old dirty nodes cause in jffs2_calc_trigger_levels()
347 c->vdirty_blocks_gctrigger = c->resv_blocks_gctrigger; in jffs2_calc_trigger_levels()
349 c->vdirty_blocks_gctrigger *= 10; in jffs2_calc_trigger_levels()
353 c->nospc_dirty_size = c->sector_size + (c->flash_size / 100); in jffs2_calc_trigger_levels()
356 c->flash_size / 1024, c->sector_size / 1024, c->nr_blocks); in jffs2_calc_trigger_levels()
358 c->resv_blocks_deletion, c->resv_blocks_deletion*c->sector_size/1024); in jffs2_calc_trigger_levels()
360 c->resv_blocks_write, c->resv_blocks_write*c->sector_size/1024); in jffs2_calc_trigger_levels()
362 c->resv_blocks_gctrigger, c->resv_blocks_gctrigger*c->sector_size/1024); in jffs2_calc_trigger_levels()
364 c->resv_blocks_gcmerge, c->resv_blocks_gcmerge*c->sector_size/1024); in jffs2_calc_trigger_levels()
366 c->resv_blocks_gcbad, c->resv_blocks_gcbad*c->sector_size/1024); in jffs2_calc_trigger_levels()
368 c->nospc_dirty_size); in jffs2_calc_trigger_levels()
370 c->vdirty_blocks_gctrigger); in jffs2_calc_trigger_levels()
379 c->free_size = c->flash_size; in jffs2_do_mount_fs()
380 c->nr_blocks = c->flash_size / c->sector_size; in jffs2_do_mount_fs()
381 size = sizeof(struct jffs2_eraseblock) * c->nr_blocks; in jffs2_do_mount_fs()
384 c->blocks = vzalloc(size); in jffs2_do_mount_fs()
387 c->blocks = kzalloc(size, GFP_KERNEL); in jffs2_do_mount_fs()
388 if (!c->blocks) in jffs2_do_mount_fs()
389 return -ENOMEM; in jffs2_do_mount_fs()
391 for (i=0; i<c->nr_blocks; i++) { in jffs2_do_mount_fs()
392 INIT_LIST_HEAD(&c->blocks[i].list); in jffs2_do_mount_fs()
393 c->blocks[i].offset = i * c->sector_size; in jffs2_do_mount_fs()
394 c->blocks[i].free_size = c->sector_size; in jffs2_do_mount_fs()
397 INIT_LIST_HEAD(&c->clean_list); in jffs2_do_mount_fs()
398 INIT_LIST_HEAD(&c->very_dirty_list); in jffs2_do_mount_fs()
399 INIT_LIST_HEAD(&c->dirty_list); in jffs2_do_mount_fs()
400 INIT_LIST_HEAD(&c->erasable_list); in jffs2_do_mount_fs()
401 INIT_LIST_HEAD(&c->erasing_list); in jffs2_do_mount_fs()
402 INIT_LIST_HEAD(&c->erase_checking_list); in jffs2_do_mount_fs()
403 INIT_LIST_HEAD(&c->erase_pending_list); in jffs2_do_mount_fs()
404 INIT_LIST_HEAD(&c->erasable_pending_wbuf_list); in jffs2_do_mount_fs()
405 INIT_LIST_HEAD(&c->erase_complete_list); in jffs2_do_mount_fs()
406 INIT_LIST_HEAD(&c->free_list); in jffs2_do_mount_fs()
407 INIT_LIST_HEAD(&c->bad_list); in jffs2_do_mount_fs()
408 INIT_LIST_HEAD(&c->bad_used_list); in jffs2_do_mount_fs()
409 c->highest_ino = 1; in jffs2_do_mount_fs()
410 c->summary = NULL; in jffs2_do_mount_fs()
420 ret = -EIO; in jffs2_do_mount_fs()
431 kvfree(c->blocks); in jffs2_do_mount_fs()