Searched refs:znode (Results 1 - 11 of 11) sorted by relevance

/linux-4.4.14/fs/ubifs/
H A Dtnc_misc.c35 * @znode: previous znode
38 * Returns the next element or %NULL if @znode is already the last one.
41 struct ubifs_znode *znode) ubifs_tnc_levelorder_next()
48 if (unlikely(!znode)) ubifs_tnc_levelorder_next()
51 if (unlikely(znode == zr)) { ubifs_tnc_levelorder_next()
52 if (znode->level == 0) ubifs_tnc_levelorder_next()
57 level = znode->level; ubifs_tnc_levelorder_next()
59 iip = znode->iip; ubifs_tnc_levelorder_next()
61 ubifs_assert(znode->level <= zr->level); ubifs_tnc_levelorder_next()
64 * First walk up until there is a znode with next branch to ubifs_tnc_levelorder_next()
67 while (znode->parent != zr && iip >= znode->parent->child_cnt) { ubifs_tnc_levelorder_next()
68 znode = znode->parent; ubifs_tnc_levelorder_next()
69 iip = znode->iip; ubifs_tnc_levelorder_next()
72 if (unlikely(znode->parent == zr && ubifs_tnc_levelorder_next()
73 iip >= znode->parent->child_cnt)) { ubifs_tnc_levelorder_next()
78 * We were already looking for znode at lower ubifs_tnc_levelorder_next()
87 znode = ubifs_tnc_find_child(zr, 0); ubifs_tnc_levelorder_next()
88 ubifs_assert(znode); ubifs_tnc_levelorder_next()
92 zn = ubifs_tnc_find_child(znode->parent, iip + 1); ubifs_tnc_levelorder_next()
95 iip = znode->parent->child_cnt; ubifs_tnc_levelorder_next()
101 znode = zn; ubifs_tnc_levelorder_next()
108 iip = znode->iip; ubifs_tnc_levelorder_next()
121 * ubifs_search_zbranch - search znode branch.
123 * @znode: znode to search in
125 * @n: znode branch slot number is returned here
127 * This is a helper function which search branch with key @key in @znode using
132 * closest branch is returned in @n; the slot if all keys in this znode are
136 const struct ubifs_znode *znode, ubifs_search_zbranch()
139 int beg = 0, end = znode->child_cnt, uninitialized_var(mid); ubifs_search_zbranch()
141 const struct ubifs_zbranch *zbr = &znode->zbranch[0]; ubifs_search_zbranch()
161 ubifs_assert(*n >= -1 && *n < znode->child_cnt); ubifs_search_zbranch()
166 if (*n + 1 < znode->child_cnt) ubifs_search_zbranch()
173 * ubifs_tnc_postorder_first - find first znode to do postorder tree traversal.
174 * @znode: znode to start at (root of the sub-tree to traverse)
176 * Find the lowest leftmost znode in a subtree of the TNC tree. The LNC is
179 struct ubifs_znode *ubifs_tnc_postorder_first(struct ubifs_znode *znode) ubifs_tnc_postorder_first() argument
181 if (unlikely(!znode)) ubifs_tnc_postorder_first()
184 while (znode->level > 0) { ubifs_tnc_postorder_first()
187 child = ubifs_tnc_find_child(znode, 0); ubifs_tnc_postorder_first()
189 return znode; ubifs_tnc_postorder_first()
190 znode = child; ubifs_tnc_postorder_first()
193 return znode; ubifs_tnc_postorder_first()
198 * @znode: previous znode
201 * Returns the next element or %NULL if @znode is already the last one.
203 struct ubifs_znode *ubifs_tnc_postorder_next(struct ubifs_znode *znode) ubifs_tnc_postorder_next() argument
207 ubifs_assert(znode); ubifs_tnc_postorder_next()
208 if (unlikely(!znode->parent)) ubifs_tnc_postorder_next()
212 zn = ubifs_tnc_find_child(znode->parent, znode->iip + 1); ubifs_tnc_postorder_next()
215 return znode->parent; ubifs_tnc_postorder_next()
217 /* Go to the first znode in this new subtree */ ubifs_tnc_postorder_next()
223 * @znode: znode defining subtree to destroy
228 long ubifs_destroy_tnc_subtree(struct ubifs_znode *znode) ubifs_destroy_tnc_subtree() argument
230 struct ubifs_znode *zn = ubifs_tnc_postorder_first(znode); ubifs_destroy_tnc_subtree()
237 if (!zn->zbranch[n].znode) ubifs_destroy_tnc_subtree()
241 !ubifs_zn_dirty(zn->zbranch[n].znode)) ubifs_destroy_tnc_subtree()
245 kfree(zn->zbranch[n].znode); ubifs_destroy_tnc_subtree()
248 if (zn == znode) { ubifs_destroy_tnc_subtree()
260 * read_znode - read an indexing node from flash and fill znode.
265 * @znode: znode to read to
267 * This function reads an indexing node from the flash media and fills znode
274 struct ubifs_znode *znode) read_znode()
289 znode->child_cnt = le16_to_cpu(idx->child_cnt); read_znode()
290 znode->level = le16_to_cpu(idx->level); read_znode()
293 lnum, offs, znode->level, znode->child_cnt); read_znode()
295 if (znode->child_cnt > c->fanout || znode->level > UBIFS_MAX_LEVELS) { read_znode()
297 c->fanout, znode->child_cnt); read_znode()
298 ubifs_err(c, "max levels %d, znode level %d", read_znode()
299 UBIFS_MAX_LEVELS, znode->level); read_znode()
304 for (i = 0; i < znode->child_cnt; i++) { read_znode()
306 struct ubifs_zbranch *zbr = &znode->zbranch[i]; read_znode()
312 zbr->znode = NULL; read_znode()
337 if (znode->level) read_znode()
365 for (i = 0; i < znode->child_cnt - 1; i++) { read_znode()
368 key1 = &znode->zbranch[i].key; read_znode()
369 key2 = &znode->zbranch[i + 1].key; read_znode()
396 * ubifs_load_znode - load znode to TNC cache.
398 * @zbr: znode branch
399 * @parent: znode's parent
402 * This function loads znode pointed to by @zbr into the TNC cache and
411 struct ubifs_znode *znode; ubifs_load_znode() local
413 ubifs_assert(!zbr->znode); ubifs_load_znode()
415 * A slab cache is not presently used for znodes because the znode size ubifs_load_znode()
418 znode = kzalloc(c->max_znode_sz, GFP_NOFS); ubifs_load_znode()
419 if (!znode) ubifs_load_znode()
422 err = read_znode(c, zbr->lnum, zbr->offs, zbr->len, znode); ubifs_load_znode()
429 * Increment the global clean znode counter as well. It is OK that ubifs_load_znode()
430 * global and per-FS clean znode counters may be inconsistent for some ubifs_load_znode()
436 zbr->znode = znode; ubifs_load_znode()
437 znode->parent = parent; ubifs_load_znode()
438 znode->time = get_seconds(); ubifs_load_znode()
439 znode->iip = iip; ubifs_load_znode()
441 return znode; ubifs_load_znode()
444 kfree(znode); ubifs_load_znode()
40 ubifs_tnc_levelorder_next(struct ubifs_znode *zr, struct ubifs_znode *znode) ubifs_tnc_levelorder_next() argument
135 ubifs_search_zbranch(const struct ubifs_info *c, const struct ubifs_znode *znode, const union ubifs_key *key, int *n) ubifs_search_zbranch() argument
273 read_znode(struct ubifs_info *c, int lnum, int offs, int len, struct ubifs_znode *znode) read_znode() argument
H A Dtnc.c29 * tree. If a znode is not in memory, we read it from flash while still having
112 * insert_old_idx_znode - record a znode obsoleted since last commit start.
114 * @znode: znode of obsoleted index node
118 int insert_old_idx_znode(struct ubifs_info *c, struct ubifs_znode *znode) insert_old_idx_znode() argument
120 if (znode->parent) { insert_old_idx_znode()
123 zbr = &znode->parent->zbranch[znode->iip]; insert_old_idx_znode()
134 * ins_clr_old_idx_znode - record a znode obsoleted since last commit start.
136 * @znode: znode of obsoleted index node
141 struct ubifs_znode *znode) ins_clr_old_idx_znode()
145 if (znode->parent) { ins_clr_old_idx_znode()
148 zbr = &znode->parent->zbranch[znode->iip]; ins_clr_old_idx_znode()
190 * copy_znode - copy a dirty znode.
192 * @znode: znode to copy
194 * A dirty znode being committed may not be changed, so it is copied.
197 struct ubifs_znode *znode) copy_znode()
201 zn = kmemdup(znode, c->max_znode_sz, GFP_NOFS); copy_znode()
209 ubifs_assert(!ubifs_zn_obsolete(znode)); copy_znode()
210 __set_bit(OBSOLETE_ZNODE, &znode->flags); copy_znode()
212 if (znode->level != 0) { copy_znode()
220 if (zbr->znode) copy_znode()
221 zbr->znode->parent = zn; copy_znode()
230 * add_idx_dirt - add dirt due to a dirty znode.
244 * dirty_cow_znode - ensure a znode is not being committed.
246 * @zbr: branch of znode to check
248 * Returns dirtied znode on success or negative error code on failure.
253 struct ubifs_znode *znode = zbr->znode; dirty_cow_znode() local
257 if (!ubifs_zn_cow(znode)) { dirty_cow_znode()
258 /* znode is not being committed */ dirty_cow_znode()
259 if (!test_and_set_bit(DIRTY_ZNODE, &znode->flags)) { dirty_cow_znode()
267 return znode; dirty_cow_znode()
270 zn = copy_znode(c, znode); dirty_cow_znode()
282 zbr->znode = zn; dirty_cow_znode()
564 * get_znode - get a TNC znode that may not be loaded yet.
566 * @znode: parent znode
567 * @n: znode branch slot number
569 * This function returns the znode or a negative error code.
572 struct ubifs_znode *znode, int n) get_znode()
576 zbr = &znode->zbranch[n]; get_znode()
577 if (zbr->znode) get_znode()
578 znode = zbr->znode; get_znode()
580 znode = ubifs_load_znode(c, zbr, znode, n); get_znode()
581 return znode; get_znode()
587 * @zn: znode is passed and returned here
588 * @n: znode branch slot number is passed and returned here
595 struct ubifs_znode *znode = *zn; tnc_next() local
599 if (nn < znode->child_cnt) { tnc_next()
606 zp = znode->parent; tnc_next()
609 nn = znode->iip + 1; tnc_next()
610 znode = zp; tnc_next()
611 if (nn < znode->child_cnt) { tnc_next()
612 znode = get_znode(c, znode, nn); tnc_next()
613 if (IS_ERR(znode)) tnc_next()
614 return PTR_ERR(znode); tnc_next()
615 while (znode->level != 0) { tnc_next()
616 znode = get_znode(c, znode, 0); tnc_next()
617 if (IS_ERR(znode)) tnc_next()
618 return PTR_ERR(znode); tnc_next()
624 *zn = znode; tnc_next()
632 * @zn: znode is returned here
633 * @n: znode branch slot number is passed and returned here
640 struct ubifs_znode *znode = *zn; tnc_prev() local
650 zp = znode->parent; tnc_prev()
653 nn = znode->iip - 1; tnc_prev()
654 znode = zp; tnc_prev()
656 znode = get_znode(c, znode, nn); tnc_prev()
657 if (IS_ERR(znode)) tnc_prev()
658 return PTR_ERR(znode); tnc_prev()
659 while (znode->level != 0) { tnc_prev()
660 nn = znode->child_cnt - 1; tnc_prev()
661 znode = get_znode(c, znode, nn); tnc_prev()
662 if (IS_ERR(znode)) tnc_prev()
663 return PTR_ERR(znode); tnc_prev()
665 nn = znode->child_cnt - 1; tnc_prev()
669 *zn = znode; tnc_prev()
678 * @zn: znode is returned here
716 * like to insert, but inserting in this znode resolve_collision()
721 * znode zp resolve_collision()
726 * znode za | | znode zb resolve_collision()
731 * The lookup finds Key2 in znode zb. Lets say resolve_collision()
735 * znode za at slot n = 1. But that is invalid resolve_collision()
737 * be inserted into znode zb. resolve_collision()
768 struct ubifs_znode *znode = *zn; resolve_collision() local
772 err = tnc_next(c, &znode, &nn); resolve_collision()
777 if (keys_cmp(c, &znode->zbranch[nn].key, key)) resolve_collision()
779 err = matches_name(c, &znode->zbranch[nn], nm); resolve_collision()
784 *zn = znode; resolve_collision()
860 * @zn: znode is returned here
883 struct ubifs_znode *o_znode = NULL, *znode = *zn; fallible_resolve_collision() local
886 cmp = fallible_matches_name(c, &znode->zbranch[nn], nm); fallible_resolve_collision()
892 o_znode = znode; fallible_resolve_collision()
951 *zn = znode; fallible_resolve_collision()
954 err = tnc_next(c, &znode, &nn); fallible_resolve_collision()
959 if (keys_cmp(c, &znode->zbranch[nn].key, key)) fallible_resolve_collision()
961 err = fallible_matches_name(c, &znode->zbranch[nn], nm); fallible_resolve_collision()
966 *zn = znode; fallible_resolve_collision()
971 o_znode = znode; fallible_resolve_collision()
1009 * @zn: znode is passed and returned here
1027 struct ubifs_znode *znode; resolve_collision_directly() local
1030 znode = *zn; resolve_collision_directly()
1032 if (matches_position(&znode->zbranch[nn], lnum, offs)) resolve_collision_directly()
1037 err = tnc_prev(c, &znode, &nn); resolve_collision_directly()
1042 if (keys_cmp(c, &znode->zbranch[nn].key, key)) resolve_collision_directly()
1044 if (matches_position(&znode->zbranch[nn], lnum, offs)) { resolve_collision_directly()
1045 *zn = znode; resolve_collision_directly()
1052 znode = *zn; resolve_collision_directly()
1055 err = tnc_next(c, &znode, &nn); resolve_collision_directly()
1060 if (keys_cmp(c, &znode->zbranch[nn].key, key)) resolve_collision_directly()
1062 *zn = znode; resolve_collision_directly()
1064 if (matches_position(&znode->zbranch[nn], lnum, offs)) resolve_collision_directly()
1070 * dirty_cow_bottom_up - dirty a znode and its ancestors.
1072 * @znode: znode to dirty
1074 * If we do not have a unique key that resides in a znode, then we cannot
1075 * dirty that znode from the top down (i.e. by using lookup_level0_dirty)
1080 struct ubifs_znode *znode) dirty_cow_bottom_up()
1085 ubifs_assert(c->zroot.znode); dirty_cow_bottom_up()
1086 ubifs_assert(znode); dirty_cow_bottom_up()
1087 if (c->zroot.znode->level > BOTTOM_UP_HEIGHT) { dirty_cow_bottom_up()
1089 c->bottom_up_buf = kmalloc(c->zroot.znode->level * sizeof(int), dirty_cow_bottom_up()
1095 if (c->zroot.znode->level) { dirty_cow_bottom_up()
1100 zp = znode->parent; dirty_cow_bottom_up()
1103 n = znode->iip; dirty_cow_bottom_up()
1104 ubifs_assert(p < c->zroot.znode->level); dirty_cow_bottom_up()
1106 if (!zp->cnext && ubifs_zn_dirty(znode)) dirty_cow_bottom_up()
1108 znode = zp; dirty_cow_bottom_up()
1116 zp = znode->parent; dirty_cow_bottom_up()
1121 znode = dirty_cow_znode(c, zbr); dirty_cow_bottom_up()
1123 ubifs_assert(znode == c->zroot.znode); dirty_cow_bottom_up()
1124 znode = dirty_cow_znode(c, &c->zroot); dirty_cow_bottom_up()
1126 if (IS_ERR(znode) || !p) dirty_cow_bottom_up()
1129 ubifs_assert(path[p - 1] < znode->child_cnt); dirty_cow_bottom_up()
1130 znode = znode->zbranch[path[p - 1]].znode; dirty_cow_bottom_up()
1133 return znode; dirty_cow_bottom_up()
1137 * ubifs_lookup_level0 - search for zero-level znode.
1140 * @zn: znode is returned here
1141 * @n: znode branch slot number is returned here
1143 * This function looks up the TNC tree and search for zero-level znode which
1144 * refers key @key. The found zero-level znode is returned in @zn. There are 3
1146 * o exact match, i.e. the found zero-level znode contains key @key, then %1
1148 * o not exact match, which means that zero-level znode does not contain
1162 struct ubifs_znode *znode; ubifs_lookup_level0() local
1168 znode = c->zroot.znode; ubifs_lookup_level0()
1169 if (unlikely(!znode)) { ubifs_lookup_level0()
1170 znode = ubifs_load_znode(c, &c->zroot, NULL, 0); ubifs_lookup_level0()
1171 if (IS_ERR(znode)) ubifs_lookup_level0()
1172 return PTR_ERR(znode); ubifs_lookup_level0()
1175 znode->time = time; ubifs_lookup_level0()
1180 exact = ubifs_search_zbranch(c, znode, key, n); ubifs_lookup_level0()
1182 if (znode->level == 0) ubifs_lookup_level0()
1187 zbr = &znode->zbranch[*n]; ubifs_lookup_level0()
1189 if (zbr->znode) { ubifs_lookup_level0()
1190 znode->time = time; ubifs_lookup_level0()
1191 znode = zbr->znode; ubifs_lookup_level0()
1195 /* znode is not in TNC cache, load it from the media */ ubifs_lookup_level0()
1196 znode = ubifs_load_znode(c, zbr, znode, *n); ubifs_lookup_level0()
1197 if (IS_ERR(znode)) ubifs_lookup_level0()
1198 return PTR_ERR(znode); ubifs_lookup_level0()
1201 *zn = znode; ubifs_lookup_level0()
1203 dbg_tnc("found %d, lvl %d, n %d", exact, znode->level, *n); ubifs_lookup_level0()
1231 * children of current znode. For example, this happens if we split a ubifs_lookup_level0()
1232 * znode like this: | 3 | 5 | 5 | 6 | 7 |, which results in something ubifs_lookup_level0()
1243 * if we changed the leftmost key of the parent znode, the garbage ubifs_lookup_level0()
1250 err = tnc_prev(c, &znode, n); ubifs_lookup_level0()
1252 dbg_tnc("found 0, lvl %d, n -1", znode->level); ubifs_lookup_level0()
1258 if (keys_cmp(c, key, &znode->zbranch[*n].key)) { ubifs_lookup_level0()
1259 dbg_tnc("found 0, lvl %d, n -1", znode->level); ubifs_lookup_level0()
1264 dbg_tnc("found 1, lvl %d, n %d", znode->level, *n); ubifs_lookup_level0()
1265 *zn = znode; ubifs_lookup_level0()
1270 * lookup_level0_dirty - search for zero-level znode dirtying.
1273 * @zn: znode is returned here
1274 * @n: znode branch slot number is returned here
1276 * This function looks up the TNC tree and search for zero-level znode which
1277 * refers key @key. The found zero-level znode is returned in @zn. There are 3
1279 * o exact match, i.e. the found zero-level znode contains key @key, then %1
1281 * o not exact match, which means that zero-level znode does not contain @key
1288 * znode are marked as dirty.
1298 struct ubifs_znode *znode; lookup_level0_dirty() local
1303 znode = c->zroot.znode; lookup_level0_dirty()
1304 if (unlikely(!znode)) { lookup_level0_dirty()
1305 znode = ubifs_load_znode(c, &c->zroot, NULL, 0); lookup_level0_dirty()
1306 if (IS_ERR(znode)) lookup_level0_dirty()
1307 return PTR_ERR(znode); lookup_level0_dirty()
1310 znode = dirty_cow_znode(c, &c->zroot); lookup_level0_dirty()
1311 if (IS_ERR(znode)) lookup_level0_dirty()
1312 return PTR_ERR(znode); lookup_level0_dirty()
1314 znode->time = time; lookup_level0_dirty()
1319 exact = ubifs_search_zbranch(c, znode, key, n); lookup_level0_dirty()
1321 if (znode->level == 0) lookup_level0_dirty()
1326 zbr = &znode->zbranch[*n]; lookup_level0_dirty()
1328 if (zbr->znode) { lookup_level0_dirty()
1329 znode->time = time; lookup_level0_dirty()
1330 znode = dirty_cow_znode(c, zbr); lookup_level0_dirty()
1331 if (IS_ERR(znode)) lookup_level0_dirty()
1332 return PTR_ERR(znode); lookup_level0_dirty()
1336 /* znode is not in TNC cache, load it from the media */ lookup_level0_dirty()
1337 znode = ubifs_load_znode(c, zbr, znode, *n); lookup_level0_dirty()
1338 if (IS_ERR(znode)) lookup_level0_dirty()
1339 return PTR_ERR(znode); lookup_level0_dirty()
1340 znode = dirty_cow_znode(c, zbr); lookup_level0_dirty()
1341 if (IS_ERR(znode)) lookup_level0_dirty()
1342 return PTR_ERR(znode); lookup_level0_dirty()
1345 *zn = znode; lookup_level0_dirty()
1347 dbg_tnc("found %d, lvl %d, n %d", exact, znode->level, *n); lookup_level0_dirty()
1355 err = tnc_prev(c, &znode, n); lookup_level0_dirty()
1358 dbg_tnc("found 0, lvl %d, n -1", znode->level); lookup_level0_dirty()
1363 if (keys_cmp(c, key, &znode->zbranch[*n].key)) { lookup_level0_dirty()
1365 dbg_tnc("found 0, lvl %d, n -1", znode->level); lookup_level0_dirty()
1369 if (znode->cnext || !ubifs_zn_dirty(znode)) { lookup_level0_dirty()
1370 znode = dirty_cow_bottom_up(c, znode); lookup_level0_dirty()
1371 if (IS_ERR(znode)) lookup_level0_dirty()
1372 return PTR_ERR(znode); lookup_level0_dirty()
1375 dbg_tnc("found 1, lvl %d, n %d", znode->level, *n); lookup_level0_dirty()
1376 *zn = znode; lookup_level0_dirty()
1433 struct ubifs_znode *znode; ubifs_tnc_locate() local
1438 found = ubifs_lookup_level0(c, key, &znode, &n); ubifs_tnc_locate()
1446 zt = &znode->zbranch[n]; ubifs_tnc_locate()
1464 zbr = znode->zbranch[n]; ubifs_tnc_locate()
1508 struct ubifs_znode *znode; ubifs_tnc_get_bu_keys() local
1516 err = ubifs_lookup_level0(c, &bu->key, &znode, &n); ubifs_tnc_get_bu_keys()
1521 len = znode->zbranch[n].len; ubifs_tnc_get_bu_keys()
1528 bu->zbranch[bu->cnt++] = znode->zbranch[n]; ubifs_tnc_get_bu_keys()
1530 lnum = znode->zbranch[n].lnum; ubifs_tnc_get_bu_keys()
1531 offs = ALIGN(znode->zbranch[n].offs + len, 8); ubifs_tnc_get_bu_keys()
1539 err = tnc_next(c, &znode, &n); ubifs_tnc_get_bu_keys()
1542 zbr = &znode->zbranch[n]; ubifs_tnc_get_bu_keys()
1795 struct ubifs_znode *znode; do_lookup_nm() local
1799 found = ubifs_lookup_level0(c, key, &znode, &n); do_lookup_nm()
1810 err = resolve_collision(c, key, &znode, &n, nm); do_lookup_nm()
1811 dbg_tnc("rc returned %d, znode %p, n %d", err, znode, n); do_lookup_nm()
1819 err = tnc_read_node_nm(c, &znode->zbranch[n], node); do_lookup_nm()
1867 * @znode: znode to correct parent znodes for
1874 struct ubifs_znode *znode) correct_parent_keys()
1878 ubifs_assert(znode->parent); correct_parent_keys()
1879 ubifs_assert(znode->iip == 0); correct_parent_keys()
1881 key = &znode->zbranch[0].key; correct_parent_keys()
1882 key1 = &znode->parent->zbranch[0].key; correct_parent_keys()
1886 znode = znode->parent; correct_parent_keys()
1887 znode->alt = 1; correct_parent_keys()
1888 if (!znode->parent || znode->iip) correct_parent_keys()
1890 key1 = &znode->parent->zbranch[0].key; correct_parent_keys()
1895 * insert_zbranch - insert a zbranch into a znode.
1896 * @znode: znode into which to insert
1901 * znode's array of zbranches and keeps zbranches consolidated, so when a new
1902 * zbranch has to be inserted to the @znode->zbranches[]' array at the @n-th
1905 static void insert_zbranch(struct ubifs_znode *znode, insert_zbranch() argument
1910 ubifs_assert(ubifs_zn_dirty(znode)); insert_zbranch()
1912 if (znode->level) { insert_zbranch()
1913 for (i = znode->child_cnt; i > n; i--) { insert_zbranch()
1914 znode->zbranch[i] = znode->zbranch[i - 1]; insert_zbranch()
1915 if (znode->zbranch[i].znode) insert_zbranch()
1916 znode->zbranch[i].znode->iip = i; insert_zbranch()
1918 if (zbr->znode) insert_zbranch()
1919 zbr->znode->iip = n; insert_zbranch()
1921 for (i = znode->child_cnt; i > n; i--) insert_zbranch()
1922 znode->zbranch[i] = znode->zbranch[i - 1]; insert_zbranch()
1924 znode->zbranch[n] = *zbr; insert_zbranch()
1925 znode->child_cnt += 1; insert_zbranch()
1929 * this znode may have changed. If this znode is subsequently split insert_zbranch()
1932 * happens, then it will no longer be possible to find this znode in the insert_zbranch()
1942 znode->alt = 1; insert_zbranch()
1948 * @znode: znode to insert into
1952 * This function inserts a new node described by @zbr into znode @znode. If
1953 * znode does not have a free slot for new zbranch, it is split. Parent znodes
1957 static int tnc_insert(struct ubifs_info *c, struct ubifs_znode *znode, tnc_insert() argument
1968 zp = znode->parent; tnc_insert()
1969 if (znode->child_cnt < c->fanout) { tnc_insert()
1971 dbg_tnck(key, "inserted at %d level %d, key ", n, znode->level); tnc_insert()
1973 insert_zbranch(znode, zbr, n); tnc_insert()
1976 if (n == 0 && zp && znode->iip == 0) tnc_insert()
1977 correct_parent_keys(c, znode); tnc_insert()
1983 * Unfortunately, @znode does not have more empty slots and we have to tnc_insert()
1986 dbg_tnck(key, "splitting level %d, key ", znode->level); tnc_insert()
1988 if (znode->alt) tnc_insert()
1990 * We can no longer be sure of finding this znode by key, so we tnc_insert()
1993 ins_clr_old_idx_znode(c, znode); tnc_insert()
1999 zn->level = znode->level; tnc_insert()
2002 if (znode->level == 0 && key_type(c, key) == UBIFS_DATA_KEY) { tnc_insert()
2005 key1 = &znode->zbranch[n - 1].key; tnc_insert()
2016 key1 = &znode->zbranch[0].key; tnc_insert()
2019 key1 = &znode->zbranch[n].key; tnc_insert()
2024 zi = znode; tnc_insert()
2045 /* Insert into existing znode */ tnc_insert()
2046 zi = znode; tnc_insert()
2050 /* Insert into new znode */ tnc_insert()
2055 zbr->znode->parent = zn; tnc_insert()
2064 znode->child_cnt = keep; tnc_insert()
2070 zn->zbranch[i] = znode->zbranch[keep + i]; tnc_insert()
2073 if (zn->zbranch[i].znode) { tnc_insert()
2074 zn->zbranch[i].znode->parent = zn; tnc_insert()
2075 zn->zbranch[i].znode->iip = i; tnc_insert()
2084 /* Insert new znode (produced by spitting) into the parent */ tnc_insert()
2086 if (n == 0 && zi == znode && znode->iip == 0) tnc_insert()
2087 correct_parent_keys(c, znode); tnc_insert()
2090 n = znode->iip + 1; tnc_insert()
2094 zbr->znode = zn; tnc_insert()
2098 znode = zp; tnc_insert()
2103 /* We have to split root znode */ tnc_insert()
2104 dbg_tnc("creating new zroot at level %d", znode->level + 1); tnc_insert()
2111 zi->level = znode->level + 1; tnc_insert()
2116 zi->zbranch[0].key = znode->zbranch[0].key; tnc_insert()
2117 zi->zbranch[0].znode = znode; tnc_insert()
2122 zi->zbranch[1].znode = zn; tnc_insert()
2127 c->zroot.znode = zi; tnc_insert()
2131 znode->parent = zi; tnc_insert()
2132 znode->iip = 0; tnc_insert()
2153 struct ubifs_znode *znode; ubifs_tnc_add() local
2157 found = lookup_level0_dirty(c, key, &znode, &n); ubifs_tnc_add()
2161 zbr.znode = NULL; ubifs_tnc_add()
2166 err = tnc_insert(c, znode, &zbr, n + 1); ubifs_tnc_add()
2168 struct ubifs_zbranch *zbr = &znode->zbranch[n]; ubifs_tnc_add()
2202 struct ubifs_znode *znode; ubifs_tnc_replace() local
2207 found = lookup_level0_dirty(c, key, &znode, &n); ubifs_tnc_replace()
2214 struct ubifs_zbranch *zbr = &znode->zbranch[n]; ubifs_tnc_replace()
2227 found = resolve_collision_directly(c, key, &znode, &n, ubifs_tnc_replace()
2229 dbg_tnc("rc returned %d, znode %p, n %d, LEB %d:%d", ubifs_tnc_replace()
2230 found, znode, n, old_lnum, old_offs); ubifs_tnc_replace()
2237 /* Ensure the znode is dirtied */ ubifs_tnc_replace()
2238 if (znode->cnext || !ubifs_zn_dirty(znode)) { ubifs_tnc_replace()
2239 znode = dirty_cow_bottom_up(c, znode); ubifs_tnc_replace()
2240 if (IS_ERR(znode)) { ubifs_tnc_replace()
2241 err = PTR_ERR(znode); ubifs_tnc_replace()
2245 zbr = &znode->zbranch[n]; ubifs_tnc_replace()
2285 struct ubifs_znode *znode; ubifs_tnc_add_nm() local
2290 found = lookup_level0_dirty(c, key, &znode, &n); ubifs_tnc_add_nm()
2298 found = fallible_resolve_collision(c, key, &znode, &n, ubifs_tnc_add_nm()
2301 found = resolve_collision(c, key, &znode, &n, nm); ubifs_tnc_add_nm()
2302 dbg_tnc("rc returned %d, znode %p, n %d", found, znode, n); ubifs_tnc_add_nm()
2308 /* Ensure the znode is dirtied */ ubifs_tnc_add_nm()
2309 if (znode->cnext || !ubifs_zn_dirty(znode)) { ubifs_tnc_add_nm()
2310 znode = dirty_cow_bottom_up(c, znode); ubifs_tnc_add_nm()
2311 if (IS_ERR(znode)) { ubifs_tnc_add_nm()
2312 err = PTR_ERR(znode); ubifs_tnc_add_nm()
2318 struct ubifs_zbranch *zbr = &znode->zbranch[n]; ubifs_tnc_add_nm()
2332 zbr.znode = NULL; ubifs_tnc_add_nm()
2337 err = tnc_insert(c, znode, &zbr, n + 1); ubifs_tnc_add_nm()
2365 * tnc_delete - delete a znode form TNC.
2367 * @znode: znode to delete from
2370 * This function deletes a leaf node from @n-th slot of @znode. Returns zero in
2373 static int tnc_delete(struct ubifs_info *c, struct ubifs_znode *znode, int n) tnc_delete() argument
2380 ubifs_assert(znode->level == 0); tnc_delete()
2382 dbg_tnck(&znode->zbranch[n].key, "deleting key "); tnc_delete()
2384 zbr = &znode->zbranch[n]; tnc_delete()
2389 ubifs_dump_znode(c, znode); tnc_delete()
2394 for (i = n; i < znode->child_cnt - 1; i++) tnc_delete()
2395 znode->zbranch[i] = znode->zbranch[i + 1]; tnc_delete()
2396 znode->child_cnt -= 1; tnc_delete()
2398 if (znode->child_cnt > 0) tnc_delete()
2402 * This was the last zbranch, we have to delete this znode from the tnc_delete()
2407 ubifs_assert(!ubifs_zn_obsolete(znode)); tnc_delete()
2408 ubifs_assert(ubifs_zn_dirty(znode)); tnc_delete()
2410 zp = znode->parent; tnc_delete()
2411 n = znode->iip; tnc_delete()
2415 err = insert_old_idx_znode(c, znode); tnc_delete()
2419 if (znode->cnext) { tnc_delete()
2420 __set_bit(OBSOLETE_ZNODE, &znode->flags); tnc_delete()
2424 kfree(znode); tnc_delete()
2425 znode = zp; tnc_delete()
2426 } while (znode->child_cnt == 1); /* while removing last child */ tnc_delete()
2428 /* Remove from znode, entry n - 1 */ tnc_delete()
2429 znode->child_cnt -= 1; tnc_delete()
2430 ubifs_assert(znode->level != 0); tnc_delete()
2431 for (i = n; i < znode->child_cnt; i++) { tnc_delete()
2432 znode->zbranch[i] = znode->zbranch[i + 1]; tnc_delete()
2433 if (znode->zbranch[i].znode) tnc_delete()
2434 znode->zbranch[i].znode->iip = i; tnc_delete()
2441 if (!znode->parent) { tnc_delete()
2442 while (znode->child_cnt == 1 && znode->level != 0) { tnc_delete()
2443 zp = znode; tnc_delete()
2444 zbr = &znode->zbranch[0]; tnc_delete()
2445 znode = get_znode(c, znode, 0); tnc_delete()
2446 if (IS_ERR(znode)) tnc_delete()
2447 return PTR_ERR(znode); tnc_delete()
2448 znode = dirty_cow_znode(c, zbr); tnc_delete()
2449 if (IS_ERR(znode)) tnc_delete()
2450 return PTR_ERR(znode); tnc_delete()
2451 znode->parent = NULL; tnc_delete()
2452 znode->iip = 0; tnc_delete()
2462 c->zroot.znode = znode; tnc_delete()
2489 struct ubifs_znode *znode; ubifs_tnc_remove() local
2493 found = lookup_level0_dirty(c, key, &znode, &n); ubifs_tnc_remove()
2499 err = tnc_delete(c, znode, n); ubifs_tnc_remove()
2520 struct ubifs_znode *znode; ubifs_tnc_remove_nm() local
2524 err = lookup_level0_dirty(c, key, &znode, &n); ubifs_tnc_remove_nm()
2530 err = fallible_resolve_collision(c, key, &znode, &n, ubifs_tnc_remove_nm()
2533 err = resolve_collision(c, key, &znode, &n, nm); ubifs_tnc_remove_nm()
2534 dbg_tnc("rc returned %d, znode %p, n %d", err, znode, n); ubifs_tnc_remove_nm()
2538 /* Ensure the znode is dirtied */ ubifs_tnc_remove_nm()
2539 if (znode->cnext || !ubifs_zn_dirty(znode)) { ubifs_tnc_remove_nm()
2540 znode = dirty_cow_bottom_up(c, znode); ubifs_tnc_remove_nm()
2541 if (IS_ERR(znode)) { ubifs_tnc_remove_nm()
2542 err = PTR_ERR(znode); ubifs_tnc_remove_nm()
2546 err = tnc_delete(c, znode, n); ubifs_tnc_remove_nm()
2590 struct ubifs_znode *znode; ubifs_tnc_remove_range() local
2595 /* Find first level 0 znode that contains keys to remove */ ubifs_tnc_remove_range()
2596 err = ubifs_lookup_level0(c, from_key, &znode, &n); ubifs_tnc_remove_range()
2603 err = tnc_next(c, &znode, &n); ubifs_tnc_remove_range()
2610 key = &znode->zbranch[n].key; ubifs_tnc_remove_range()
2617 /* Ensure the znode is dirtied */ ubifs_tnc_remove_range()
2618 if (znode->cnext || !ubifs_zn_dirty(znode)) { ubifs_tnc_remove_range()
2619 znode = dirty_cow_bottom_up(c, znode); ubifs_tnc_remove_range()
2620 if (IS_ERR(znode)) { ubifs_tnc_remove_range()
2621 err = PTR_ERR(znode); ubifs_tnc_remove_range()
2627 for (i = n + 1, k = 0; i < znode->child_cnt; i++, k++) { ubifs_tnc_remove_range()
2628 key = &znode->zbranch[i].key; ubifs_tnc_remove_range()
2631 lnc_free(&znode->zbranch[i]); ubifs_tnc_remove_range()
2632 err = ubifs_add_dirt(c, znode->zbranch[i].lnum, ubifs_tnc_remove_range()
2633 znode->zbranch[i].len); ubifs_tnc_remove_range()
2635 ubifs_dump_znode(c, znode); ubifs_tnc_remove_range()
2641 for (i = n + 1 + k; i < znode->child_cnt; i++) ubifs_tnc_remove_range()
2642 znode->zbranch[i - k] = znode->zbranch[i]; ubifs_tnc_remove_range()
2643 znode->child_cnt -= k; ubifs_tnc_remove_range()
2647 err = tnc_delete(c, znode, n); ubifs_tnc_remove_range()
2753 struct ubifs_znode *znode; ubifs_tnc_next_ent() local
2762 err = ubifs_lookup_level0(c, key, &znode, &n); ubifs_tnc_next_ent()
2769 err = resolve_collision(c, key, &znode, &n, nm); ubifs_tnc_next_ent()
2770 dbg_tnc("rc returned %d, znode %p, n %d", ubifs_tnc_next_ent()
2771 err, znode, n); ubifs_tnc_next_ent()
2777 err = tnc_next(c, &znode, &n); ubifs_tnc_next_ent()
2789 * tree and @znode/@n variables contain the closest ubifs_tnc_next_ent()
2792 err = tnc_next(c, &znode, &n); ubifs_tnc_next_ent()
2798 zbr = &znode->zbranch[n]; ubifs_tnc_next_ent()
2845 struct ubifs_znode *znode = cnext; tnc_destroy_cnext() local
2848 if (ubifs_zn_obsolete(znode)) tnc_destroy_cnext()
2849 kfree(znode); tnc_destroy_cnext()
2860 if (c->zroot.znode) { ubifs_tnc_close()
2864 freed = ubifs_destroy_tnc_subtree(c->zroot.znode); ubifs_tnc_close()
2874 * left_znode - get the znode to the left.
2876 * @znode: znode
2878 * This function returns a pointer to the znode to the left of @znode or NULL if
2882 struct ubifs_znode *znode) left_znode()
2884 int level = znode->level; left_znode()
2887 int n = znode->iip - 1; left_znode()
2890 znode = znode->parent; left_znode()
2891 if (!znode) left_znode()
2895 znode = get_znode(c, znode, n); left_znode()
2896 if (IS_ERR(znode)) left_znode()
2897 return znode; left_znode()
2898 while (znode->level != level) { left_znode()
2899 n = znode->child_cnt - 1; left_znode()
2900 znode = get_znode(c, znode, n); left_znode()
2901 if (IS_ERR(znode)) left_znode()
2902 return znode; left_znode()
2907 return znode; left_znode()
2911 * right_znode - get the znode to the right.
2913 * @znode: znode
2915 * This function returns a pointer to the znode to the right of @znode or NULL
2919 struct ubifs_znode *znode) right_znode()
2921 int level = znode->level; right_znode()
2924 int n = znode->iip + 1; right_znode()
2927 znode = znode->parent; right_znode()
2928 if (!znode) right_znode()
2930 if (n < znode->child_cnt) { right_znode()
2932 znode = get_znode(c, znode, n); right_znode()
2933 if (IS_ERR(znode)) right_znode()
2934 return znode; right_znode()
2935 while (znode->level != level) { right_znode()
2936 znode = get_znode(c, znode, 0); right_znode()
2937 if (IS_ERR(znode)) right_znode()
2938 return znode; right_znode()
2943 return znode; right_znode()
2961 * dirty znode which still refers the same @lnum:@offs. This function is clever
2964 * Note, if a znode was deleted or changed too much, then this function will
2968 * This function returns a pointer to the znode found or %NULL if it is not
2975 struct ubifs_znode *znode, *zn; lookup_znode() local
2987 /* Get the root znode */ lookup_znode()
2988 znode = c->zroot.znode; lookup_znode()
2989 if (!znode) { lookup_znode()
2990 znode = ubifs_load_znode(c, &c->zroot, NULL, 0); lookup_znode()
2991 if (IS_ERR(znode)) lookup_znode()
2992 return znode; lookup_znode()
2996 return znode; lookup_znode()
2998 if (level >= znode->level) lookup_znode()
3001 ubifs_search_zbranch(c, znode, key, &n); lookup_znode()
3004 * We reached a znode where the leftmost key is greater lookup_znode()
3011 znode = left_znode(c, znode); lookup_znode()
3012 if (!znode) lookup_znode()
3014 if (IS_ERR(znode)) lookup_znode()
3015 return znode; lookup_znode()
3016 ubifs_search_zbranch(c, znode, key, &n); lookup_znode()
3019 if (znode->level == level + 1) lookup_znode()
3021 znode = get_znode(c, znode, n); lookup_znode()
3022 if (IS_ERR(znode)) lookup_znode()
3023 return znode; lookup_znode()
3026 if (znode->zbranch[n].lnum == lnum && znode->zbranch[n].offs == offs) lookup_znode()
3027 return get_znode(c, znode, n); lookup_znode()
3035 zn = znode; lookup_znode()
3043 znode = left_znode(c, znode); lookup_znode()
3044 if (!znode) lookup_znode()
3046 if (IS_ERR(znode)) lookup_znode()
3047 return znode; lookup_znode()
3048 n = znode->child_cnt - 1; lookup_znode()
3051 if (znode->zbranch[n].lnum == lnum && lookup_znode()
3052 znode->zbranch[n].offs == offs) lookup_znode()
3053 return get_znode(c, znode, n); lookup_znode()
3055 if (keys_cmp(c, &znode->zbranch[n].key, key) < 0) lookup_znode()
3059 znode = zn; lookup_znode()
3064 if (++n >= znode->child_cnt) { lookup_znode()
3065 znode = right_znode(c, znode); lookup_znode()
3066 if (!znode) lookup_znode()
3068 if (IS_ERR(znode)) lookup_znode()
3069 return znode; lookup_znode()
3073 if (znode->zbranch[n].lnum == lnum && lookup_znode()
3074 znode->zbranch[n].offs == offs) lookup_znode()
3075 return get_znode(c, znode, n); lookup_znode()
3077 if (keys_cmp(c, &znode->zbranch[n].key, key) > 0) lookup_znode()
3092 * if the index node is referred to in the TNC and the corresponding znode is
3094 * znode is clean, and a negative error code in case of failure.
3103 struct ubifs_znode *znode; is_idx_node_in_tnc() local
3105 znode = lookup_znode(c, key, level, lnum, offs); is_idx_node_in_tnc()
3106 if (!znode) is_idx_node_in_tnc()
3108 if (IS_ERR(znode)) is_idx_node_in_tnc()
3109 return PTR_ERR(znode); is_idx_node_in_tnc()
3111 return ubifs_zn_dirty(znode) ? 1 : 2; is_idx_node_in_tnc()
3131 struct ubifs_znode *znode, *zn; is_leaf_node_in_tnc() local
3135 found = ubifs_lookup_level0(c, key, &znode, &n); is_leaf_node_in_tnc()
3140 zbr = &znode->zbranch[n]; is_leaf_node_in_tnc()
3149 zn = znode; is_leaf_node_in_tnc()
3153 err = tnc_prev(c, &znode, &n); is_leaf_node_in_tnc()
3158 if (keys_cmp(c, key, &znode->zbranch[n].key)) is_leaf_node_in_tnc()
3160 zbr = &znode->zbranch[n]; is_leaf_node_in_tnc()
3165 znode = zn; is_leaf_node_in_tnc()
3168 err = tnc_next(c, &znode, &n); is_leaf_node_in_tnc()
3174 if (keys_cmp(c, key, &znode->zbranch[n].key)) is_leaf_node_in_tnc()
3176 zbr = &znode->zbranch[n]; is_leaf_node_in_tnc()
3195 * the corresponding znode is clean or has not been loaded.
3240 struct ubifs_znode *znode; ubifs_dirty_idx_node() local
3244 znode = lookup_znode(c, key, level, lnum, offs); ubifs_dirty_idx_node()
3245 if (!znode) ubifs_dirty_idx_node()
3247 if (IS_ERR(znode)) { ubifs_dirty_idx_node()
3248 err = PTR_ERR(znode); ubifs_dirty_idx_node()
3251 znode = dirty_cow_bottom_up(c, znode); ubifs_dirty_idx_node()
3252 if (IS_ERR(znode)) { ubifs_dirty_idx_node()
3253 err = PTR_ERR(znode); ubifs_dirty_idx_node()
3278 struct ubifs_znode *znode; dbg_check_inode_size() local
3291 err = ubifs_lookup_level0(c, &from_key, &znode, &n); dbg_check_inode_size()
3300 err = tnc_next(c, &znode, &n); dbg_check_inode_size()
3309 key = &znode->zbranch[n].key; dbg_check_inode_size()
140 ins_clr_old_idx_znode(struct ubifs_info *c, struct ubifs_znode *znode) ins_clr_old_idx_znode() argument
196 copy_znode(struct ubifs_info *c, struct ubifs_znode *znode) copy_znode() argument
571 get_znode(struct ubifs_info *c, struct ubifs_znode *znode, int n) get_znode() argument
1079 dirty_cow_bottom_up(struct ubifs_info *c, struct ubifs_znode *znode) dirty_cow_bottom_up() argument
1873 correct_parent_keys(const struct ubifs_info *c, struct ubifs_znode *znode) correct_parent_keys() argument
2881 left_znode(struct ubifs_info *c, struct ubifs_znode *znode) left_znode() argument
2918 right_znode(struct ubifs_info *c, struct ubifs_znode *znode) right_znode() argument
H A Dmisc.h31 * ubifs_zn_dirty - check if znode is dirty.
32 * @znode: znode to check
34 * This helper function returns %1 if @znode is dirty and %0 otherwise.
36 static inline int ubifs_zn_dirty(const struct ubifs_znode *znode) ubifs_zn_dirty() argument
38 return !!test_bit(DIRTY_ZNODE, &znode->flags); ubifs_zn_dirty()
42 * ubifs_zn_obsolete - check if znode is obsolete.
43 * @znode: znode to check
45 * This helper function returns %1 if @znode is obsolete and %0 otherwise.
47 static inline int ubifs_zn_obsolete(const struct ubifs_znode *znode) ubifs_zn_obsolete() argument
49 return !!test_bit(OBSOLETE_ZNODE, &znode->flags); ubifs_zn_obsolete()
53 * ubifs_zn_cow - check if znode has to be copied on write.
54 * @znode: znode to check
56 * This helper function returns %1 if @znode is has COW flag set and %0
59 static inline int ubifs_zn_cow(const struct ubifs_znode *znode) ubifs_zn_cow() argument
61 return !!test_bit(COW_ZNODE, &znode->flags); ubifs_zn_cow()
77 * ubifs_tnc_find_child - find next child in znode.
78 * @znode: znode to search at
81 * This helper function looks for znode child starting at index @start. Returns
85 ubifs_tnc_find_child(struct ubifs_znode *znode, int start) ubifs_tnc_find_child() argument
87 while (start < znode->child_cnt) { ubifs_tnc_find_child()
88 if (znode->zbranch[start].znode) ubifs_tnc_find_child()
89 return znode->zbranch[start].znode; ubifs_tnc_find_child()
H A Dtnc_commit.c32 * @znode: znode from which to make new index node
38 struct ubifs_znode *znode, int lnum, int offs, int len) make_idx_node()
45 idx->child_cnt = cpu_to_le16(znode->child_cnt); make_idx_node()
46 idx->level = cpu_to_le16(znode->level); make_idx_node()
47 for (i = 0; i < znode->child_cnt; i++) { make_idx_node()
49 struct ubifs_zbranch *zbr = &znode->zbranch[i]; make_idx_node()
56 ubifs_err(c, "bad ref in znode"); make_idx_node()
57 ubifs_dump_znode(c, znode); make_idx_node()
58 if (zbr->znode) make_idx_node()
59 ubifs_dump_znode(c, zbr->znode); make_idx_node()
64 znode->lnum = lnum; make_idx_node()
65 znode->offs = offs; make_idx_node()
66 znode->len = len; make_idx_node()
68 err = insert_old_idx_znode(c, znode); make_idx_node()
71 zp = znode->parent; make_idx_node()
75 zbr = &zp->zbranch[znode->iip]; make_idx_node()
88 ubifs_assert(ubifs_zn_dirty(znode)); make_idx_node()
89 ubifs_assert(ubifs_zn_cow(znode)); make_idx_node()
95 __clear_bit(DIRTY_ZNODE, &znode->flags); make_idx_node()
96 __clear_bit(COW_ZNODE, &znode->flags); make_idx_node()
128 struct ubifs_znode *znode = c->enext; fill_gap() local
133 err = make_idx_node(c, c->ileb_buf + gap_pos, znode, fill_gap()
139 c->enext = znode->cnext; fill_gap()
224 * This function merely puts the next znode into the next gap, making no attempt
415 struct ubifs_znode *znode, *cnext, *zp; layout_in_empty_space() local
437 znode = cnext; layout_in_empty_space()
439 len = ubifs_idx_node_sz(c, znode->child_cnt); layout_in_empty_space()
455 znode->lnum = lnum; layout_in_empty_space()
456 znode->offs = offs; layout_in_empty_space()
457 znode->len = len; layout_in_empty_space()
460 zp = znode->parent; layout_in_empty_space()
465 i = znode->iip; layout_in_empty_space()
478 * Once lprops is updated, we can decrease the dirty znode count layout_in_empty_space()
487 cnext = znode->cnext; layout_in_empty_space()
566 * find_first_dirty - find first dirty znode.
567 * @znode: znode to begin searching from
569 static struct ubifs_znode *find_first_dirty(struct ubifs_znode *znode) find_first_dirty() argument
573 if (!znode) find_first_dirty()
577 if (znode->level == 0) { find_first_dirty()
578 if (ubifs_zn_dirty(znode)) find_first_dirty()
579 return znode; find_first_dirty()
583 for (i = 0; i < znode->child_cnt; i++) { find_first_dirty()
584 struct ubifs_zbranch *zbr = &znode->zbranch[i]; find_first_dirty()
586 if (zbr->znode && ubifs_zn_dirty(zbr->znode)) { find_first_dirty()
587 znode = zbr->znode; find_first_dirty()
593 if (ubifs_zn_dirty(znode)) find_first_dirty()
594 return znode; find_first_dirty()
601 * find_next_dirty - find next dirty znode.
602 * @znode: znode to begin searching from
604 static struct ubifs_znode *find_next_dirty(struct ubifs_znode *znode) find_next_dirty() argument
606 int n = znode->iip + 1; find_next_dirty()
608 znode = znode->parent; find_next_dirty()
609 if (!znode) find_next_dirty()
611 for (; n < znode->child_cnt; n++) { find_next_dirty()
612 struct ubifs_zbranch *zbr = &znode->zbranch[n]; find_next_dirty()
614 if (zbr->znode && ubifs_zn_dirty(zbr->znode)) find_next_dirty()
615 return find_first_dirty(zbr->znode); find_next_dirty()
617 return znode; find_next_dirty()
628 struct ubifs_znode *znode, *cnext; get_znodes_to_commit() local
631 c->cnext = find_first_dirty(c->zroot.znode); get_znodes_to_commit()
632 znode = c->enext = c->cnext; get_znodes_to_commit()
633 if (!znode) { get_znodes_to_commit()
639 ubifs_assert(!ubifs_zn_cow(znode)); get_znodes_to_commit()
640 __set_bit(COW_ZNODE, &znode->flags); get_znodes_to_commit()
641 znode->alt = 0; get_znodes_to_commit()
642 cnext = find_next_dirty(znode); get_znodes_to_commit()
644 znode->cnext = c->cnext; get_znodes_to_commit()
647 znode->cnext = cnext; get_znodes_to_commit()
648 znode = cnext; get_znodes_to_commit()
809 struct ubifs_znode *znode, *cnext; write_index() local
842 znode = cnext; write_index()
847 idx->child_cnt = cpu_to_le16(znode->child_cnt); write_index()
848 idx->level = cpu_to_le16(znode->level); write_index()
849 for (i = 0; i < znode->child_cnt; i++) { write_index()
851 struct ubifs_zbranch *zbr = &znode->zbranch[i]; write_index()
858 ubifs_err(c, "bad ref in znode"); write_index()
859 ubifs_dump_znode(c, znode); write_index()
860 if (zbr->znode) write_index()
861 ubifs_dump_znode(c, zbr->znode); write_index()
864 len = ubifs_idx_node_sz(c, znode->child_cnt); write_index()
876 if (lnum != znode->lnum || offs != znode->offs || write_index()
877 len != znode->len) { write_index()
878 ubifs_err(c, "inconsistent znode posn"); write_index()
882 /* Grab some stuff from znode while we still can */ write_index()
883 cnext = znode->cnext; write_index()
885 ubifs_assert(ubifs_zn_dirty(znode)); write_index()
886 ubifs_assert(ubifs_zn_cow(znode)); write_index()
896 clear_bit(DIRTY_ZNODE, &znode->flags); write_index()
898 clear_bit(COW_ZNODE, &znode->flags); write_index()
902 * We have marked the znode as clean but have not updated the write_index()
903 * @c->clean_zn_cnt counter. If this znode becomes dirty again write_index()
906 * incremented (resulting in 2 decrements for the same znode). write_index()
914 * if (!ubifs_zn_obsolete(znode)) { write_index()
923 /* Do not access znode from this point on */ write_index()
994 struct ubifs_znode *znode, *cnext; free_obsolete_znodes() local
998 znode = cnext; free_obsolete_znodes()
999 cnext = znode->cnext; free_obsolete_znodes()
1000 if (ubifs_zn_obsolete(znode)) free_obsolete_znodes()
1001 kfree(znode); free_obsolete_znodes()
1003 znode->cnext = NULL; free_obsolete_znodes()
1060 dbg_cmt("TNC height is %d", c->zroot.znode->level + 1); ubifs_tnc_end_commit()
37 make_idx_node(struct ubifs_info *c, struct ubifs_idx_node *idx, struct ubifs_znode *znode, int lnum, int offs, int len) make_idx_node() argument
H A Dshrinker.c57 /* Global clean znode counter (for all mounted UBIFS instances) */
73 struct ubifs_znode *znode, *zprev; shrink_tnc() local
79 if (!c->zroot.znode || atomic_long_read(&c->clean_zn_cnt) == 0) shrink_tnc()
84 * to destroy large sub-trees. Indeed, if a znode is old, then all its shrink_tnc()
92 znode = ubifs_tnc_levelorder_next(c->zroot.znode, NULL); shrink_tnc()
93 while (znode && total_freed < nr && shrink_tnc()
98 * If the znode is clean, but it is in the 'c->cnext' list, this shrink_tnc()
99 * means that this znode has just been written to flash as a shrink_tnc()
115 if (znode->cnext) { shrink_tnc()
121 } else if (!ubifs_zn_dirty(znode) && shrink_tnc()
122 abs(time - znode->time) >= age) { shrink_tnc()
123 if (znode->parent) shrink_tnc()
124 znode->parent->zbranch[znode->iip].znode = NULL; shrink_tnc()
126 c->zroot.znode = NULL; shrink_tnc()
128 freed = ubifs_destroy_tnc_subtree(znode); shrink_tnc()
132 znode = zprev; shrink_tnc()
135 if (unlikely(!c->zroot.znode)) shrink_tnc()
138 zprev = znode; shrink_tnc()
139 znode = ubifs_tnc_levelorder_next(c->zroot.znode, znode); shrink_tnc()
285 * Due to the way UBIFS updates the clean znode counter it may ubifs_shrink_count()
H A Ddebug.c851 const struct ubifs_znode *znode) ubifs_dump_znode()
858 if (znode->parent) ubifs_dump_znode()
859 zbr = &znode->parent->zbranch[znode->iip]; ubifs_dump_znode()
863 pr_err("znode %p, LEB %d:%d len %d parent %p iip %d level %d child_cnt %d flags %lx\n", ubifs_dump_znode()
864 znode, zbr->lnum, zbr->offs, zbr->len, znode->parent, znode->iip, ubifs_dump_znode()
865 znode->level, znode->child_cnt, znode->flags); ubifs_dump_znode()
867 if (znode->child_cnt <= 0 || znode->child_cnt > c->fanout) { ubifs_dump_znode()
873 for (n = 0; n < znode->child_cnt; n++) { ubifs_dump_znode()
874 zbr = &znode->zbranch[n]; ubifs_dump_znode()
875 if (znode->level > 0) ubifs_dump_znode()
876 pr_err("\t%d: znode %p LEB %d:%d len %d key %s\n", ubifs_dump_znode()
877 n, zbr->znode, zbr->lnum, zbr->offs, zbr->len, ubifs_dump_znode()
882 n, zbr->znode, zbr->lnum, zbr->offs, zbr->len, ubifs_dump_znode()
925 struct ubifs_znode *znode; ubifs_dump_tnc() local
930 znode = ubifs_tnc_levelorder_next(c->zroot.znode, NULL); ubifs_dump_tnc()
931 level = znode->level; ubifs_dump_tnc()
933 while (znode) { ubifs_dump_tnc()
934 if (level != znode->level) { ubifs_dump_tnc()
935 level = znode->level; ubifs_dump_tnc()
938 ubifs_dump_znode(c, znode); ubifs_dump_tnc()
939 znode = ubifs_tnc_levelorder_next(c->zroot.znode, znode); ubifs_dump_tnc()
944 static int dump_znode(struct ubifs_info *c, struct ubifs_znode *znode, dump_znode() argument
947 ubifs_dump_znode(c, znode); dump_znode()
1258 * dbg_check_znode - check if znode is all right.
1260 * @zbr: zbranch which points to this znode
1262 * This function makes sure that znode referred to by @zbr is all right.
1267 struct ubifs_znode *znode = zbr->znode; dbg_check_znode() local
1268 struct ubifs_znode *zp = znode->parent; dbg_check_znode()
1271 if (znode->child_cnt <= 0 || znode->child_cnt > c->fanout) { dbg_check_znode()
1275 if (znode->level < 0) { dbg_check_znode()
1279 if (znode->iip < 0 || znode->iip >= c->fanout) { dbg_check_znode()
1286 if (!ubifs_zn_dirty(znode)) { dbg_check_znode()
1291 if (ubifs_zn_dirty(znode)) { dbg_check_znode()
1293 * If znode is dirty, its parent has to be dirty as well. The dbg_check_znode()
1301 * TNC mutex, so znode's dirty flag may now have dbg_check_znode()
1306 if (ubifs_zn_dirty(znode)) { dbg_check_znode()
1316 if (znode->level != zp->level - 1) { dbg_check_znode()
1321 /* Make sure the 'parent' pointer in our znode is correct */ dbg_check_znode()
1329 if (znode->iip >= zp->child_cnt) { dbg_check_znode()
1334 if (znode->iip != n) { dbg_check_znode()
1337 &zp->zbranch[znode->iip].key)) { dbg_check_znode()
1341 n = znode->iip; dbg_check_znode()
1345 * Make sure that the first key in our znode is greater than or dbg_check_znode()
1349 cmp = keys_cmp(c, min, &znode->zbranch[0].key); dbg_check_znode()
1359 * Make sure the last key in our znode is less or dbg_check_znode()
1364 &znode->zbranch[znode->child_cnt - 1].key); dbg_check_znode()
1371 /* This may only be root znode */ dbg_check_znode()
1382 for (n = 1; n < znode->child_cnt; n++) { dbg_check_znode()
1383 cmp = keys_cmp(c, &znode->zbranch[n - 1].key, dbg_check_znode()
1384 &znode->zbranch[n].key); dbg_check_znode()
1391 if (!is_hash_key(c, &znode->zbranch[n].key)) { dbg_check_znode()
1396 if (znode->level != 0 || c->replaying) dbg_check_znode()
1403 err = dbg_check_key_order(c, &znode->zbranch[n - 1], dbg_check_znode()
1404 &znode->zbranch[n]); dbg_check_znode()
1414 for (n = 0; n < znode->child_cnt; n++) { dbg_check_znode()
1415 if (!znode->zbranch[n].znode && dbg_check_znode()
1416 (znode->zbranch[n].lnum == 0 || dbg_check_znode()
1417 znode->zbranch[n].len == 0)) { dbg_check_znode()
1422 if (znode->zbranch[n].lnum != 0 && dbg_check_znode()
1423 znode->zbranch[n].len == 0) { dbg_check_znode()
1428 if (znode->zbranch[n].lnum == 0 && dbg_check_znode()
1429 znode->zbranch[n].len != 0) { dbg_check_znode()
1434 if (znode->zbranch[n].lnum == 0 && dbg_check_znode()
1435 znode->zbranch[n].offs != 0) { dbg_check_znode()
1440 if (znode->level != 0 && znode->zbranch[n].znode) dbg_check_znode()
1441 if (znode->zbranch[n].znode->parent != znode) { dbg_check_znode()
1451 ubifs_msg(c, "dump of the znode"); dbg_check_znode()
1452 ubifs_dump_znode(c, znode); dbg_check_znode()
1454 ubifs_msg(c, "dump of the parent znode"); dbg_check_znode()
1466 * This function traverses whole TNC tree and checks every znode. Returns zero
1471 struct ubifs_znode *znode; dbg_check_tnc() local
1479 if (!c->zroot.znode) dbg_check_tnc()
1482 znode = ubifs_tnc_postorder_first(c->zroot.znode); dbg_check_tnc()
1487 if (!znode->parent) dbg_check_tnc()
1490 zbr = &znode->parent->zbranch[znode->iip]; dbg_check_tnc()
1497 if (ubifs_zn_dirty(znode)) dbg_check_tnc()
1503 prev = znode; dbg_check_tnc()
1504 znode = ubifs_tnc_postorder_next(znode); dbg_check_tnc()
1505 if (!znode) dbg_check_tnc()
1509 * If the last key of this znode is equivalent to the first key dbg_check_tnc()
1510 * of the next znode (collision), then check order of the keys. dbg_check_tnc()
1513 if (prev->level == 0 && znode->level == 0 && !c->replaying && dbg_check_tnc()
1515 &znode->zbranch[0].key)) { dbg_check_tnc()
1517 &znode->zbranch[0]); dbg_check_tnc()
1521 ubifs_msg(c, "first znode"); dbg_check_tnc()
1523 ubifs_msg(c, "second znode"); dbg_check_tnc()
1524 ubifs_dump_znode(c, znode); dbg_check_tnc()
1559 * It would be better if this function removed every znode it pulled to into
1568 struct ubifs_znode *znode, *child; dbg_walk_index() local
1572 if (!c->zroot.znode) { dbg_walk_index()
1573 c->zroot.znode = ubifs_load_znode(c, &c->zroot, NULL, 0); dbg_walk_index()
1574 if (IS_ERR(c->zroot.znode)) { dbg_walk_index()
1575 err = PTR_ERR(c->zroot.znode); dbg_walk_index()
1576 c->zroot.znode = NULL; dbg_walk_index()
1586 znode = c->zroot.znode; dbg_walk_index()
1587 while (znode->level > 0) { dbg_walk_index()
1588 zbr = &znode->zbranch[0]; dbg_walk_index()
1589 child = zbr->znode; dbg_walk_index()
1591 child = ubifs_load_znode(c, zbr, znode, 0); dbg_walk_index()
1596 zbr->znode = child; dbg_walk_index()
1599 znode = child; dbg_walk_index()
1609 err = znode_cb(c, znode, priv); dbg_walk_index()
1611 ubifs_err(c, "znode checking function returned error %d", dbg_walk_index()
1613 ubifs_dump_znode(c, znode); dbg_walk_index()
1617 if (leaf_cb && znode->level == 0) { dbg_walk_index()
1618 for (idx = 0; idx < znode->child_cnt; idx++) { dbg_walk_index()
1619 zbr = &znode->zbranch[idx]; dbg_walk_index()
1629 if (!znode->parent) dbg_walk_index()
1632 idx = znode->iip + 1; dbg_walk_index()
1633 znode = znode->parent; dbg_walk_index()
1634 if (idx < znode->child_cnt) { dbg_walk_index()
1636 zbr = &znode->zbranch[idx]; dbg_walk_index()
1637 child = zbr->znode; dbg_walk_index()
1639 child = ubifs_load_znode(c, zbr, znode, idx); dbg_walk_index()
1644 zbr->znode = child; dbg_walk_index()
1646 znode = child; dbg_walk_index()
1654 /* Go to the lowest leftmost znode in the new sub-tree */ dbg_walk_index()
1655 while (znode->level > 0) { dbg_walk_index()
1656 zbr = &znode->zbranch[0]; dbg_walk_index()
1657 child = zbr->znode; dbg_walk_index()
1659 child = ubifs_load_znode(c, zbr, znode, 0); dbg_walk_index()
1664 zbr->znode = child; dbg_walk_index()
1666 znode = child; dbg_walk_index()
1674 if (znode->parent) dbg_walk_index()
1675 zbr = &znode->parent->zbranch[znode->iip]; dbg_walk_index()
1678 ubifs_msg(c, "dump of znode at LEB %d:%d", zbr->lnum, zbr->offs); dbg_walk_index()
1679 ubifs_dump_znode(c, znode); dbg_walk_index()
1686 * add_size - add znode size to partially calculated index size.
1688 * @znode: znode to add size for
1695 static int add_size(struct ubifs_info *c, struct ubifs_znode *znode, void *priv) add_size() argument
1700 add = ubifs_idx_node_sz(c, znode->child_cnt); add_size()
1912 struct ubifs_znode *znode; read_add_inode() local
1922 err = ubifs_lookup_level0(c, &key, &znode, &n); read_add_inode()
1932 zbr = &znode->zbranch[n]; read_add_inode()
2147 struct ubifs_znode *znode; check_inodes() local
2222 err = ubifs_lookup_level0(c, &key, &znode, &n); check_inodes()
2233 zbr = &znode->zbranch[n]; check_inodes()
850 ubifs_dump_znode(const struct ubifs_info *c, const struct ubifs_znode *znode) ubifs_dump_znode() argument
H A Dubifs.h150 * "old", and znode which were touched last 'YOUNG_ZNODE_AGE' seconds ago are
151 * considered "young". This is used by shrinker when selecting znode to trim
188 * DIRTY_ZNODE: znode is dirty
189 * COW_ZNODE: znode is being committed and a new instance of this znode has to
190 * be created before changing this znode
191 * OBSOLETE_ZNODE: znode is obsolete, which means it was deleted, but it is
193 * will commit it, and delete this znode after it is done
743 * @znode: znode address in memory
751 struct ubifs_znode *znode; member in union:ubifs_zbranch::__anon11944
761 * @parent: parent znode or NULL if it is the root
762 * @cnext: next znode to commit
763 * @flags: znode flags (%DIRTY_ZNODE, %COW_ZNODE or %OBSOLETE_ZNODE)
772 * @zbranch: array of znode branches (@c->fanout elements)
1040 * @zroot: zbranch which points to the root index node and znode
1041 * @cnext: next znode to commit
1042 * @enext: next znode to commit to empty space
1120 * @max_znode_sz: size of znode in bytes
1615 int insert_old_idx_znode(struct ubifs_info *c, struct ubifs_znode *znode);
1621 struct ubifs_znode *znode);
1623 const struct ubifs_znode *znode,
1625 struct ubifs_znode *ubifs_tnc_postorder_first(struct ubifs_znode *znode);
1626 struct ubifs_znode *ubifs_tnc_postorder_next(struct ubifs_znode *znode);
H A Ddebug.h30 struct ubifs_znode *znode, void *priv);
267 const struct ubifs_znode *znode);
H A Dcommit.c81 if (c->zroot.znode && ubifs_zn_dirty(c->zroot.znode)) nothing_to_commit()
H A Dbudget.c371 * For now we assume each new node adds one znode. But this is rather poor
H A Dsuper.c1441 dbg_gen("max. znode size %d", c->max_znode_sz); mount_ubifs()

Completed in 212 milliseconds