Lines Matching refs:c

49 static int try_read_node(const struct ubifs_info *c, void *buf, int type,
51 static int fallible_read_node(struct ubifs_info *c, const union ubifs_key *key,
77 static int insert_old_idx(struct ubifs_info *c, int lnum, int offs) in insert_old_idx() argument
88 p = &c->old_idx.rb_node; in insert_old_idx()
101 ubifs_err(c, "old idx added twice!"); in insert_old_idx()
107 rb_insert_color(&old_idx->rb, &c->old_idx); in insert_old_idx()
118 int insert_old_idx_znode(struct ubifs_info *c, struct ubifs_znode *znode) in insert_old_idx_znode() argument
125 return insert_old_idx(c, zbr->lnum, zbr->offs); in insert_old_idx_znode()
127 if (c->zroot.len) in insert_old_idx_znode()
128 return insert_old_idx(c, c->zroot.lnum, in insert_old_idx_znode()
129 c->zroot.offs); in insert_old_idx_znode()
140 static int ins_clr_old_idx_znode(struct ubifs_info *c, in ins_clr_old_idx_znode() argument
150 err = insert_old_idx(c, zbr->lnum, zbr->offs); in ins_clr_old_idx_znode()
158 if (c->zroot.len) { in ins_clr_old_idx_znode()
159 err = insert_old_idx(c, c->zroot.lnum, c->zroot.offs); in ins_clr_old_idx_znode()
162 c->zroot.lnum = 0; in ins_clr_old_idx_znode()
163 c->zroot.offs = 0; in ins_clr_old_idx_znode()
164 c->zroot.len = 0; in ins_clr_old_idx_znode()
179 void destroy_old_idx(struct ubifs_info *c) in destroy_old_idx() argument
183 rbtree_postorder_for_each_entry_safe(old_idx, n, &c->old_idx, rb) in destroy_old_idx()
186 c->old_idx = RB_ROOT; in destroy_old_idx()
196 static struct ubifs_znode *copy_znode(struct ubifs_info *c, in copy_znode() argument
201 zn = kmalloc(c->max_znode_sz, GFP_NOFS); in copy_znode()
205 memcpy(zn, znode, c->max_znode_sz); in copy_znode()
226 atomic_long_inc(&c->dirty_zn_cnt); in copy_znode()
238 static int add_idx_dirt(struct ubifs_info *c, int lnum, int dirt) in add_idx_dirt() argument
240 c->calc_idx_sz -= ALIGN(dirt, 8); in add_idx_dirt()
241 return ubifs_add_dirt(c, lnum, dirt); in add_idx_dirt()
251 static struct ubifs_znode *dirty_cow_znode(struct ubifs_info *c, in dirty_cow_znode() argument
261 atomic_long_inc(&c->dirty_zn_cnt); in dirty_cow_znode()
262 atomic_long_dec(&c->clean_zn_cnt); in dirty_cow_znode()
264 err = add_idx_dirt(c, zbr->lnum, zbr->len); in dirty_cow_znode()
271 zn = copy_znode(c, znode); in dirty_cow_znode()
276 err = insert_old_idx(c, zbr->lnum, zbr->offs); in dirty_cow_znode()
279 err = add_idx_dirt(c, zbr->lnum, zbr->len); in dirty_cow_znode()
313 static int lnc_add(struct ubifs_info *c, struct ubifs_zbranch *zbr, in lnc_add() argument
322 ubifs_assert(is_hash_key(c, &zbr->key)); in lnc_add()
324 err = ubifs_validate_entry(c, dent); in lnc_add()
327 ubifs_dump_node(c, dent); in lnc_add()
349 static int lnc_add_directly(struct ubifs_info *c, struct ubifs_zbranch *zbr, in lnc_add_directly() argument
357 err = ubifs_validate_entry(c, node); in lnc_add_directly()
360 ubifs_dump_node(c, node); in lnc_add_directly()
392 static int tnc_read_node_nm(struct ubifs_info *c, struct ubifs_zbranch *zbr, in tnc_read_node_nm() argument
397 ubifs_assert(is_hash_key(c, &zbr->key)); in tnc_read_node_nm()
406 if (c->replaying) { in tnc_read_node_nm()
407 err = fallible_read_node(c, &zbr->key, zbr, node); in tnc_read_node_nm()
417 err = ubifs_tnc_read_node(c, zbr, node); in tnc_read_node_nm()
423 err = lnc_add(c, zbr, node); in tnc_read_node_nm()
451 static int try_read_node(const struct ubifs_info *c, void *buf, int type, in try_read_node() argument
460 err = ubifs_leb_read(c, lnum, buf, offs, len, 1); in try_read_node()
462 ubifs_err(c, "cannot read node type %d from LEB %d:%d, error %d", in try_read_node()
477 if (type == UBIFS_DATA_NODE && c->no_chk_data_crc && !c->mounting && in try_read_node()
478 !c->remounting_rw) in try_read_node()
499 static int fallible_read_node(struct ubifs_info *c, const union ubifs_key *key, in fallible_read_node() argument
506 ret = try_read_node(c, node, key_type(c, key), zbr->len, zbr->lnum, in fallible_read_node()
513 key_read(c, &dent->key, &node_key); in fallible_read_node()
514 if (keys_cmp(c, key, &node_key) != 0) in fallible_read_node()
517 if (ret == 0 && c->replaying) in fallible_read_node()
534 static int matches_name(struct ubifs_info *c, struct ubifs_zbranch *zbr, in matches_name() argument
546 err = ubifs_tnc_read_node(c, zbr, dent); in matches_name()
551 err = lnc_add_directly(c, zbr, dent); in matches_name()
584 static struct ubifs_znode *get_znode(struct ubifs_info *c, in get_znode() argument
593 znode = ubifs_load_znode(c, zbr, znode, n); in get_znode()
606 static int tnc_next(struct ubifs_info *c, struct ubifs_znode **zn, int *n) in tnc_next() argument
625 znode = get_znode(c, znode, nn); in tnc_next()
629 znode = get_znode(c, znode, 0); in tnc_next()
651 static int tnc_prev(struct ubifs_info *c, struct ubifs_znode **zn, int *n) in tnc_prev() argument
669 znode = get_znode(c, znode, nn); in tnc_prev()
674 znode = get_znode(c, znode, nn); in tnc_prev()
703 static int resolve_collision(struct ubifs_info *c, const union ubifs_key *key, in resolve_collision() argument
709 err = matches_name(c, &(*zn)->zbranch[*n], nm); in resolve_collision()
718 err = tnc_prev(c, zn, n); in resolve_collision()
726 if (keys_cmp(c, &(*zn)->zbranch[*n].key, key)) { in resolve_collision()
757 err = tnc_next(c, zn, n); in resolve_collision()
770 err = matches_name(c, &(*zn)->zbranch[*n], nm); in resolve_collision()
785 err = tnc_next(c, &znode, &nn); in resolve_collision()
790 if (keys_cmp(c, &znode->zbranch[nn].key, key)) in resolve_collision()
792 err = matches_name(c, &znode->zbranch[nn], nm); in resolve_collision()
821 static int fallible_matches_name(struct ubifs_info *c, in fallible_matches_name() argument
834 err = fallible_read_node(c, &zbr->key, zbr, dent); in fallible_matches_name()
844 err = lnc_add_directly(c, zbr, dent); in fallible_matches_name()
891 static int fallible_resolve_collision(struct ubifs_info *c, in fallible_resolve_collision() argument
899 cmp = fallible_matches_name(c, &znode->zbranch[nn], nm); in fallible_resolve_collision()
919 err = tnc_prev(c, zn, n); in fallible_resolve_collision()
927 if (keys_cmp(c, &(*zn)->zbranch[*n].key, key)) { in fallible_resolve_collision()
930 err = tnc_next(c, zn, n); in fallible_resolve_collision()
943 err = fallible_matches_name(c, &(*zn)->zbranch[*n], nm); in fallible_resolve_collision()
967 err = tnc_next(c, &znode, &nn); in fallible_resolve_collision()
972 if (keys_cmp(c, &znode->zbranch[nn].key, key)) in fallible_resolve_collision()
974 err = fallible_matches_name(c, &znode->zbranch[nn], nm); in fallible_resolve_collision()
1035 static int resolve_collision_directly(struct ubifs_info *c, in resolve_collision_directly() argument
1050 err = tnc_prev(c, &znode, &nn); in resolve_collision_directly()
1055 if (keys_cmp(c, &znode->zbranch[nn].key, key)) in resolve_collision_directly()
1068 err = tnc_next(c, &znode, &nn); in resolve_collision_directly()
1073 if (keys_cmp(c, &znode->zbranch[nn].key, key)) in resolve_collision_directly()
1092 static struct ubifs_znode *dirty_cow_bottom_up(struct ubifs_info *c, in dirty_cow_bottom_up() argument
1096 int *path = c->bottom_up_buf, p = 0; in dirty_cow_bottom_up()
1098 ubifs_assert(c->zroot.znode); in dirty_cow_bottom_up()
1100 if (c->zroot.znode->level > BOTTOM_UP_HEIGHT) { in dirty_cow_bottom_up()
1101 kfree(c->bottom_up_buf); in dirty_cow_bottom_up()
1102 c->bottom_up_buf = kmalloc(c->zroot.znode->level * sizeof(int), in dirty_cow_bottom_up()
1104 if (!c->bottom_up_buf) in dirty_cow_bottom_up()
1106 path = c->bottom_up_buf; in dirty_cow_bottom_up()
1108 if (c->zroot.znode->level) { in dirty_cow_bottom_up()
1117 ubifs_assert(p < c->zroot.znode->level); in dirty_cow_bottom_up()
1134 znode = dirty_cow_znode(c, zbr); in dirty_cow_bottom_up()
1136 ubifs_assert(znode == c->zroot.znode); in dirty_cow_bottom_up()
1137 znode = dirty_cow_znode(c, &c->zroot); in dirty_cow_bottom_up()
1171 int ubifs_lookup_level0(struct ubifs_info *c, const union ubifs_key *key, in ubifs_lookup_level0() argument
1179 ubifs_assert(key_type(c, key) < UBIFS_INVALID_KEY); in ubifs_lookup_level0()
1181 znode = c->zroot.znode; in ubifs_lookup_level0()
1183 znode = ubifs_load_znode(c, &c->zroot, NULL, 0); in ubifs_lookup_level0()
1193 exact = ubifs_search_zbranch(c, znode, key, n); in ubifs_lookup_level0()
1209 znode = ubifs_load_znode(c, zbr, znode, *n); in ubifs_lookup_level0()
1215 if (exact || !is_hash_key(c, key) || *n != -1) { in ubifs_lookup_level0()
1263 err = tnc_prev(c, &znode, n); in ubifs_lookup_level0()
1271 if (keys_cmp(c, key, &znode->zbranch[*n].key)) { in ubifs_lookup_level0()
1307 static int lookup_level0_dirty(struct ubifs_info *c, const union ubifs_key *key, in lookup_level0_dirty() argument
1316 znode = c->zroot.znode; in lookup_level0_dirty()
1318 znode = ubifs_load_znode(c, &c->zroot, NULL, 0); in lookup_level0_dirty()
1323 znode = dirty_cow_znode(c, &c->zroot); in lookup_level0_dirty()
1332 exact = ubifs_search_zbranch(c, znode, key, n); in lookup_level0_dirty()
1343 znode = dirty_cow_znode(c, zbr); in lookup_level0_dirty()
1350 znode = ubifs_load_znode(c, zbr, znode, *n); in lookup_level0_dirty()
1353 znode = dirty_cow_znode(c, zbr); in lookup_level0_dirty()
1359 if (exact || !is_hash_key(c, key) || *n != -1) { in lookup_level0_dirty()
1368 err = tnc_prev(c, &znode, n); in lookup_level0_dirty()
1376 if (keys_cmp(c, key, &znode->zbranch[*n].key)) { in lookup_level0_dirty()
1383 znode = dirty_cow_bottom_up(c, znode); in lookup_level0_dirty()
1403 static int maybe_leb_gced(struct ubifs_info *c, int lnum, int gc_seq1) in maybe_leb_gced() argument
1408 gced_lnum = c->gced_lnum; in maybe_leb_gced()
1410 gc_seq2 = c->gc_seq; in maybe_leb_gced()
1422 if (gced_lnum != c->gced_lnum) in maybe_leb_gced()
1446 int ubifs_tnc_locate(struct ubifs_info *c, const union ubifs_key *key, in ubifs_tnc_locate() argument
1454 mutex_lock(&c->tnc_mutex); in ubifs_tnc_locate()
1455 found = ubifs_lookup_level0(c, key, &znode, &n); in ubifs_tnc_locate()
1468 if (is_hash_key(c, key)) { in ubifs_tnc_locate()
1473 err = tnc_read_node_nm(c, zt, node); in ubifs_tnc_locate()
1477 err = ubifs_tnc_read_node(c, zt, node); in ubifs_tnc_locate()
1482 gc_seq1 = c->gc_seq; in ubifs_tnc_locate()
1483 mutex_unlock(&c->tnc_mutex); in ubifs_tnc_locate()
1485 if (ubifs_get_wbuf(c, zbr.lnum)) { in ubifs_tnc_locate()
1487 err = ubifs_tnc_read_node(c, &zbr, node); in ubifs_tnc_locate()
1491 err = fallible_read_node(c, key, &zbr, node); in ubifs_tnc_locate()
1492 if (err <= 0 || maybe_leb_gced(c, zbr.lnum, gc_seq1)) { in ubifs_tnc_locate()
1503 mutex_unlock(&c->tnc_mutex); in ubifs_tnc_locate()
1520 int ubifs_tnc_get_bu_keys(struct ubifs_info *c, struct bu_info *bu) in ubifs_tnc_get_bu_keys() argument
1524 unsigned int block = key_block(c, &bu->key); in ubifs_tnc_get_bu_keys()
1531 mutex_lock(&c->tnc_mutex); in ubifs_tnc_get_bu_keys()
1533 err = ubifs_lookup_level0(c, &bu->key, &znode, &n); in ubifs_tnc_get_bu_keys()
1556 err = tnc_next(c, &znode, &n); in ubifs_tnc_get_bu_keys()
1562 if (key_inum(c, key) != key_inum(c, &bu->key) || in ubifs_tnc_get_bu_keys()
1563 key_type(c, key) != UBIFS_DATA_KEY) { in ubifs_tnc_get_bu_keys()
1590 next_block = key_block(c, key); in ubifs_tnc_get_bu_keys()
1609 bu->gc_seq = c->gc_seq; in ubifs_tnc_get_bu_keys()
1610 mutex_unlock(&c->tnc_mutex); in ubifs_tnc_get_bu_keys()
1632 block = key_block(c, &bu->key) + bu->blk_cnt; in ubifs_tnc_get_bu_keys()
1635 if (key_block(c, &bu->zbranch[bu->cnt - 1].key) < block) in ubifs_tnc_get_bu_keys()
1655 const struct ubifs_info *c = wbuf->c; in read_wbuf() local
1659 ubifs_assert(wbuf && lnum >= 0 && lnum < c->leb_cnt && offs >= 0); in read_wbuf()
1660 ubifs_assert(!(offs & 7) && offs < c->leb_size); in read_wbuf()
1661 ubifs_assert(offs + len <= c->leb_size); in read_wbuf()
1668 return ubifs_leb_read(c, lnum, buf, offs, len, 0); in read_wbuf()
1682 return ubifs_leb_read(c, lnum, buf, offs, rlen, 0); in read_wbuf()
1695 static int validate_data_node(struct ubifs_info *c, void *buf, in validate_data_node() argument
1703 ubifs_err(c, "bad node type (%d but expected %d)", in validate_data_node()
1708 err = ubifs_check_node(c, buf, zbr->lnum, zbr->offs, 0, 0); in validate_data_node()
1710 ubifs_err(c, "expected node type %d", UBIFS_DATA_NODE); in validate_data_node()
1716 ubifs_err(c, "bad node length %d, expected %d", len, zbr->len); in validate_data_node()
1721 key_read(c, buf + UBIFS_KEY_OFFSET, &key1); in validate_data_node()
1722 if (!keys_eq(c, &zbr->key, &key1)) { in validate_data_node()
1723 ubifs_err(c, "bad key in node at LEB %d:%d", in validate_data_node()
1735 ubifs_err(c, "bad node at LEB %d:%d", zbr->lnum, zbr->offs); in validate_data_node()
1736 ubifs_dump_node(c, buf); in validate_data_node()
1751 int ubifs_tnc_bulk_read(struct ubifs_info *c, struct bu_info *bu) in ubifs_tnc_bulk_read() argument
1760 ubifs_err(c, "buffer too small %d vs %d", bu->buf_len, len); in ubifs_tnc_bulk_read()
1765 wbuf = ubifs_get_wbuf(c, lnum); in ubifs_tnc_bulk_read()
1769 err = ubifs_leb_read(c, lnum, bu->buf, offs, len, 0); in ubifs_tnc_bulk_read()
1772 if (maybe_leb_gced(c, lnum, bu->gc_seq)) in ubifs_tnc_bulk_read()
1776 ubifs_err(c, "failed to read from LEB %d:%d, error %d", in ubifs_tnc_bulk_read()
1786 err = validate_data_node(c, buf, &bu->zbranch[i]); in ubifs_tnc_bulk_read()
1808 static int do_lookup_nm(struct ubifs_info *c, const union ubifs_key *key, in do_lookup_nm() argument
1815 mutex_lock(&c->tnc_mutex); in do_lookup_nm()
1816 found = ubifs_lookup_level0(c, key, &znode, &n); in do_lookup_nm()
1827 err = resolve_collision(c, key, &znode, &n, nm); in do_lookup_nm()
1836 err = tnc_read_node_nm(c, &znode->zbranch[n], node); in do_lookup_nm()
1839 mutex_unlock(&c->tnc_mutex); in do_lookup_nm()
1856 int ubifs_tnc_lookup_nm(struct ubifs_info *c, const union ubifs_key *key, in ubifs_tnc_lookup_nm() argument
1866 err = ubifs_tnc_lookup(c, key, node); in ubifs_tnc_lookup_nm()
1878 return do_lookup_nm(c, key, node, nm); in ubifs_tnc_lookup_nm()
1890 static void correct_parent_keys(const struct ubifs_info *c, in correct_parent_keys() argument
1901 while (keys_cmp(c, key, key1) < 0) { in correct_parent_keys()
1902 key_copy(c, key, key1); in correct_parent_keys()
1974 static int tnc_insert(struct ubifs_info *c, struct ubifs_znode *znode, in tnc_insert() argument
1981 ubifs_assert(n >= 0 && n <= c->fanout); in tnc_insert()
1986 if (znode->child_cnt < c->fanout) { in tnc_insert()
1987 ubifs_assert(n != c->fanout); in tnc_insert()
1994 correct_parent_keys(c, znode); in tnc_insert()
2010 ins_clr_old_idx_znode(c, znode); in tnc_insert()
2012 zn = kzalloc(c->max_znode_sz, GFP_NOFS); in tnc_insert()
2019 if (znode->level == 0 && key_type(c, key) == UBIFS_DATA_KEY) { in tnc_insert()
2021 if (n == c->fanout) { in tnc_insert()
2023 if (key_inum(c, key1) == key_inum(c, key) && in tnc_insert()
2024 key_type(c, key1) == UBIFS_DATA_KEY) in tnc_insert()
2028 } else if (appending && n != c->fanout) { in tnc_insert()
2032 if (n >= (c->fanout + 1) / 2) { in tnc_insert()
2034 if (key_inum(c, key1) == key_inum(c, key) && in tnc_insert()
2035 key_type(c, key1) == UBIFS_DATA_KEY) { in tnc_insert()
2037 if (key_inum(c, key1) != key_inum(c, key) || in tnc_insert()
2038 key_type(c, key1) != UBIFS_DATA_KEY) { in tnc_insert()
2040 move = c->fanout - keep; in tnc_insert()
2049 keep = c->fanout; in tnc_insert()
2052 keep = (c->fanout + 1) / 2; in tnc_insert()
2053 move = c->fanout - keep; in tnc_insert()
2078 atomic_long_inc(&c->dirty_zn_cnt); in tnc_insert()
2104 correct_parent_keys(c, znode); in tnc_insert()
2123 zi = kzalloc(c->max_znode_sz, GFP_NOFS); in tnc_insert()
2131 atomic_long_inc(&c->dirty_zn_cnt); in tnc_insert()
2135 zi->zbranch[0].lnum = c->zroot.lnum; in tnc_insert()
2136 zi->zbranch[0].offs = c->zroot.offs; in tnc_insert()
2137 zi->zbranch[0].len = c->zroot.len; in tnc_insert()
2141 c->zroot.lnum = 0; in tnc_insert()
2142 c->zroot.offs = 0; in tnc_insert()
2143 c->zroot.len = 0; in tnc_insert()
2144 c->zroot.znode = zi; in tnc_insert()
2166 int ubifs_tnc_add(struct ubifs_info *c, const union ubifs_key *key, int lnum, in ubifs_tnc_add() argument
2172 mutex_lock(&c->tnc_mutex); in ubifs_tnc_add()
2174 found = lookup_level0_dirty(c, key, &znode, &n); in ubifs_tnc_add()
2182 key_copy(c, key, &zbr.key); in ubifs_tnc_add()
2183 err = tnc_insert(c, znode, &zbr, n + 1); in ubifs_tnc_add()
2188 err = ubifs_add_dirt(c, zbr->lnum, zbr->len); in ubifs_tnc_add()
2195 err = dbg_check_tnc(c, 0); in ubifs_tnc_add()
2196 mutex_unlock(&c->tnc_mutex); in ubifs_tnc_add()
2215 int ubifs_tnc_replace(struct ubifs_info *c, const union ubifs_key *key, in ubifs_tnc_replace() argument
2221 mutex_lock(&c->tnc_mutex); in ubifs_tnc_replace()
2224 found = lookup_level0_dirty(c, key, &znode, &n); in ubifs_tnc_replace()
2236 err = ubifs_add_dirt(c, zbr->lnum, zbr->len); in ubifs_tnc_replace()
2243 } else if (is_hash_key(c, key)) { in ubifs_tnc_replace()
2244 found = resolve_collision_directly(c, key, &znode, &n, in ubifs_tnc_replace()
2256 znode = dirty_cow_bottom_up(c, znode); in ubifs_tnc_replace()
2264 err = ubifs_add_dirt(c, zbr->lnum, in ubifs_tnc_replace()
2276 err = ubifs_add_dirt(c, lnum, len); in ubifs_tnc_replace()
2279 err = dbg_check_tnc(c, 0); in ubifs_tnc_replace()
2282 mutex_unlock(&c->tnc_mutex); in ubifs_tnc_replace()
2298 int ubifs_tnc_add_nm(struct ubifs_info *c, const union ubifs_key *key, in ubifs_tnc_add_nm() argument
2304 mutex_lock(&c->tnc_mutex); in ubifs_tnc_add_nm()
2307 found = lookup_level0_dirty(c, key, &znode, &n); in ubifs_tnc_add_nm()
2314 if (c->replaying) in ubifs_tnc_add_nm()
2315 found = fallible_resolve_collision(c, key, &znode, &n, in ubifs_tnc_add_nm()
2318 found = resolve_collision(c, key, &znode, &n, nm); in ubifs_tnc_add_nm()
2327 znode = dirty_cow_bottom_up(c, znode); in ubifs_tnc_add_nm()
2338 err = ubifs_add_dirt(c, zbr->lnum, zbr->len); in ubifs_tnc_add_nm()
2353 key_copy(c, key, &zbr.key); in ubifs_tnc_add_nm()
2354 err = tnc_insert(c, znode, &zbr, n + 1); in ubifs_tnc_add_nm()
2357 if (c->replaying) { in ubifs_tnc_add_nm()
2366 err = dbg_check_tnc(c, 0); in ubifs_tnc_add_nm()
2367 mutex_unlock(&c->tnc_mutex); in ubifs_tnc_add_nm()
2370 return ubifs_tnc_remove_nm(c, key, &noname); in ubifs_tnc_add_nm()
2376 err = dbg_check_tnc(c, 0); in ubifs_tnc_add_nm()
2377 mutex_unlock(&c->tnc_mutex); in ubifs_tnc_add_nm()
2390 static int tnc_delete(struct ubifs_info *c, struct ubifs_znode *znode, int n) in tnc_delete() argument
2398 ubifs_assert(n >= 0 && n < c->fanout); in tnc_delete()
2404 err = ubifs_add_dirt(c, zbr->lnum, zbr->len); in tnc_delete()
2406 ubifs_dump_znode(c, znode); in tnc_delete()
2430 atomic_long_dec(&c->dirty_zn_cnt); in tnc_delete()
2432 err = insert_old_idx_znode(c, znode); in tnc_delete()
2438 atomic_long_inc(&c->clean_zn_cnt); in tnc_delete()
2462 znode = get_znode(c, znode, 0); in tnc_delete()
2465 znode = dirty_cow_znode(c, zbr); in tnc_delete()
2470 if (c->zroot.len) { in tnc_delete()
2471 err = insert_old_idx(c, c->zroot.lnum, in tnc_delete()
2472 c->zroot.offs); in tnc_delete()
2476 c->zroot.lnum = zbr->lnum; in tnc_delete()
2477 c->zroot.offs = zbr->offs; in tnc_delete()
2478 c->zroot.len = zbr->len; in tnc_delete()
2479 c->zroot.znode = znode; in tnc_delete()
2482 atomic_long_dec(&c->dirty_zn_cnt); in tnc_delete()
2486 atomic_long_inc(&c->clean_zn_cnt); in tnc_delete()
2503 int ubifs_tnc_remove(struct ubifs_info *c, const union ubifs_key *key) in ubifs_tnc_remove() argument
2508 mutex_lock(&c->tnc_mutex); in ubifs_tnc_remove()
2510 found = lookup_level0_dirty(c, key, &znode, &n); in ubifs_tnc_remove()
2516 err = tnc_delete(c, znode, n); in ubifs_tnc_remove()
2518 err = dbg_check_tnc(c, 0); in ubifs_tnc_remove()
2521 mutex_unlock(&c->tnc_mutex); in ubifs_tnc_remove()
2533 int ubifs_tnc_remove_nm(struct ubifs_info *c, const union ubifs_key *key, in ubifs_tnc_remove_nm() argument
2539 mutex_lock(&c->tnc_mutex); in ubifs_tnc_remove_nm()
2541 err = lookup_level0_dirty(c, key, &znode, &n); in ubifs_tnc_remove_nm()
2546 if (c->replaying) in ubifs_tnc_remove_nm()
2547 err = fallible_resolve_collision(c, key, &znode, &n, in ubifs_tnc_remove_nm()
2550 err = resolve_collision(c, key, &znode, &n, nm); in ubifs_tnc_remove_nm()
2557 znode = dirty_cow_bottom_up(c, znode); in ubifs_tnc_remove_nm()
2563 err = tnc_delete(c, znode, n); in ubifs_tnc_remove_nm()
2569 err = dbg_check_tnc(c, 0); in ubifs_tnc_remove_nm()
2570 mutex_unlock(&c->tnc_mutex); in ubifs_tnc_remove_nm()
2583 static int key_in_range(struct ubifs_info *c, union ubifs_key *key, in key_in_range() argument
2586 if (keys_cmp(c, key, from_key) < 0) in key_in_range()
2588 if (keys_cmp(c, key, to_key) > 0) in key_in_range()
2603 int ubifs_tnc_remove_range(struct ubifs_info *c, union ubifs_key *from_key, in ubifs_tnc_remove_range() argument
2610 mutex_lock(&c->tnc_mutex); in ubifs_tnc_remove_range()
2613 err = ubifs_lookup_level0(c, from_key, &znode, &n); in ubifs_tnc_remove_range()
2620 err = tnc_next(c, &znode, &n); in ubifs_tnc_remove_range()
2628 if (!key_in_range(c, key, from_key, to_key)) { in ubifs_tnc_remove_range()
2636 znode = dirty_cow_bottom_up(c, znode); in ubifs_tnc_remove_range()
2646 if (!key_in_range(c, key, from_key, to_key)) in ubifs_tnc_remove_range()
2649 err = ubifs_add_dirt(c, znode->zbranch[i].lnum, in ubifs_tnc_remove_range()
2652 ubifs_dump_znode(c, znode); in ubifs_tnc_remove_range()
2664 err = tnc_delete(c, znode, n); in ubifs_tnc_remove_range()
2671 err = dbg_check_tnc(c, 0); in ubifs_tnc_remove_range()
2672 mutex_unlock(&c->tnc_mutex); in ubifs_tnc_remove_range()
2685 int ubifs_tnc_remove_ino(struct ubifs_info *c, ino_t inum) in ubifs_tnc_remove_ino() argument
2697 lowest_xent_key(c, &key1, inum); in ubifs_tnc_remove_ino()
2702 xent = ubifs_tnc_next_ent(c, &key1, &nm); in ubifs_tnc_remove_ino()
2716 err = ubifs_tnc_remove_nm(c, &key1, &nm); in ubifs_tnc_remove_ino()
2722 lowest_ino_key(c, &key1, xattr_inum); in ubifs_tnc_remove_ino()
2723 highest_ino_key(c, &key2, xattr_inum); in ubifs_tnc_remove_ino()
2724 err = ubifs_tnc_remove_range(c, &key1, &key2); in ubifs_tnc_remove_ino()
2732 key_read(c, &xent->key, &key1); in ubifs_tnc_remove_ino()
2736 lowest_ino_key(c, &key1, inum); in ubifs_tnc_remove_ino()
2737 highest_ino_key(c, &key2, inum); in ubifs_tnc_remove_ino()
2739 return ubifs_tnc_remove_range(c, &key1, &key2); in ubifs_tnc_remove_ino()
2765 struct ubifs_dent_node *ubifs_tnc_next_ent(struct ubifs_info *c, in ubifs_tnc_next_ent() argument
2769 int n, err, type = key_type(c, key); in ubifs_tnc_next_ent()
2776 ubifs_assert(is_hash_key(c, key)); in ubifs_tnc_next_ent()
2778 mutex_lock(&c->tnc_mutex); in ubifs_tnc_next_ent()
2779 err = ubifs_lookup_level0(c, key, &znode, &n); in ubifs_tnc_next_ent()
2786 if (c->replaying) in ubifs_tnc_next_ent()
2787 err = fallible_resolve_collision(c, key, &znode, &n, in ubifs_tnc_next_ent()
2790 err = resolve_collision(c, key, &znode, &n, nm); in ubifs_tnc_next_ent()
2798 err = tnc_next(c, &znode, &n); in ubifs_tnc_next_ent()
2813 err = tnc_next(c, &znode, &n); in ubifs_tnc_next_ent()
2831 if (key_inum(c, dkey) != key_inum(c, key) || in ubifs_tnc_next_ent()
2832 key_type(c, dkey) != type) { in ubifs_tnc_next_ent()
2837 err = tnc_read_node_nm(c, zbr, dent); in ubifs_tnc_next_ent()
2841 mutex_unlock(&c->tnc_mutex); in ubifs_tnc_next_ent()
2847 mutex_unlock(&c->tnc_mutex); in ubifs_tnc_next_ent()
2857 static void tnc_destroy_cnext(struct ubifs_info *c) in tnc_destroy_cnext() argument
2861 if (!c->cnext) in tnc_destroy_cnext()
2863 ubifs_assert(c->cmt_state == COMMIT_BROKEN); in tnc_destroy_cnext()
2864 cnext = c->cnext; in tnc_destroy_cnext()
2871 } while (cnext && cnext != c->cnext); in tnc_destroy_cnext()
2878 void ubifs_tnc_close(struct ubifs_info *c) in ubifs_tnc_close() argument
2880 tnc_destroy_cnext(c); in ubifs_tnc_close()
2881 if (c->zroot.znode) { in ubifs_tnc_close()
2884 n = atomic_long_read(&c->clean_zn_cnt); in ubifs_tnc_close()
2885 freed = ubifs_destroy_tnc_subtree(c->zroot.znode); in ubifs_tnc_close()
2889 kfree(c->gap_lebs); in ubifs_tnc_close()
2890 kfree(c->ilebs); in ubifs_tnc_close()
2891 destroy_old_idx(c); in ubifs_tnc_close()
2902 static struct ubifs_znode *left_znode(struct ubifs_info *c, in left_znode() argument
2916 znode = get_znode(c, znode, n); in left_znode()
2921 znode = get_znode(c, znode, n); in left_znode()
2939 static struct ubifs_znode *right_znode(struct ubifs_info *c, in right_znode() argument
2953 znode = get_znode(c, znode, n); in right_znode()
2957 znode = get_znode(c, znode, 0); in right_znode()
2992 static struct ubifs_znode *lookup_znode(struct ubifs_info *c, in lookup_znode() argument
2999 ubifs_assert(key_type(c, key) < UBIFS_INVALID_KEY); in lookup_znode()
3009 znode = c->zroot.znode; in lookup_znode()
3011 znode = ubifs_load_znode(c, &c->zroot, NULL, 0); in lookup_znode()
3016 if (c->zroot.lnum == lnum && c->zroot.offs == offs) in lookup_znode()
3022 ubifs_search_zbranch(c, znode, key, &n); in lookup_znode()
3032 znode = left_znode(c, znode); in lookup_znode()
3037 ubifs_search_zbranch(c, znode, key, &n); in lookup_znode()
3042 znode = get_znode(c, znode, n); in lookup_znode()
3048 return get_znode(c, znode, n); in lookup_znode()
3050 if (!is_hash_key(c, key)) in lookup_znode()
3064 znode = left_znode(c, znode); in lookup_znode()
3074 return get_znode(c, znode, n); in lookup_znode()
3076 if (keys_cmp(c, &znode->zbranch[n].key, key) < 0) in lookup_znode()
3086 znode = right_znode(c, znode); in lookup_znode()
3096 return get_znode(c, znode, n); in lookup_znode()
3098 if (keys_cmp(c, &znode->zbranch[n].key, key) > 0) in lookup_znode()
3121 int is_idx_node_in_tnc(struct ubifs_info *c, union ubifs_key *key, int level, in is_idx_node_in_tnc() argument
3126 znode = lookup_znode(c, key, level, lnum, offs); in is_idx_node_in_tnc()
3148 static int is_leaf_node_in_tnc(struct ubifs_info *c, union ubifs_key *key, in is_leaf_node_in_tnc() argument
3154 const int unique = !is_hash_key(c, key); in is_leaf_node_in_tnc()
3156 found = ubifs_lookup_level0(c, key, &znode, &n); in is_leaf_node_in_tnc()
3174 err = tnc_prev(c, &znode, &n); in is_leaf_node_in_tnc()
3179 if (keys_cmp(c, key, &znode->zbranch[n].key)) in is_leaf_node_in_tnc()
3189 err = tnc_next(c, &znode, &n); in is_leaf_node_in_tnc()
3195 if (keys_cmp(c, key, &znode->zbranch[n].key)) in is_leaf_node_in_tnc()
3218 int ubifs_tnc_has_node(struct ubifs_info *c, union ubifs_key *key, int level, in ubifs_tnc_has_node() argument
3223 mutex_lock(&c->tnc_mutex); in ubifs_tnc_has_node()
3225 err = is_idx_node_in_tnc(c, key, level, lnum, offs); in ubifs_tnc_has_node()
3237 err = is_leaf_node_in_tnc(c, key, lnum, offs); in ubifs_tnc_has_node()
3240 mutex_unlock(&c->tnc_mutex); in ubifs_tnc_has_node()
3258 int ubifs_dirty_idx_node(struct ubifs_info *c, union ubifs_key *key, int level, in ubifs_dirty_idx_node() argument
3264 mutex_lock(&c->tnc_mutex); in ubifs_dirty_idx_node()
3265 znode = lookup_znode(c, key, level, lnum, offs); in ubifs_dirty_idx_node()
3272 znode = dirty_cow_bottom_up(c, znode); in ubifs_dirty_idx_node()
3279 mutex_unlock(&c->tnc_mutex); in ubifs_dirty_idx_node()
3294 int dbg_check_inode_size(struct ubifs_info *c, const struct inode *inode, in dbg_check_inode_size() argument
3304 if (!dbg_is_chk_gen(c)) in dbg_check_inode_size()
3308 data_key_init(c, &from_key, inode->i_ino, block); in dbg_check_inode_size()
3309 highest_data_key(c, &to_key, inode->i_ino); in dbg_check_inode_size()
3311 mutex_lock(&c->tnc_mutex); in dbg_check_inode_size()
3312 err = ubifs_lookup_level0(c, &from_key, &znode, &n); in dbg_check_inode_size()
3321 err = tnc_next(c, &znode, &n); in dbg_check_inode_size()
3331 if (!key_in_range(c, key, &from_key, &to_key)) in dbg_check_inode_size()
3335 block = key_block(c, key); in dbg_check_inode_size()
3336 ubifs_err(c, "inode %lu has size %lld, but there are data at offset %lld", in dbg_check_inode_size()
3339 mutex_unlock(&c->tnc_mutex); in dbg_check_inode_size()
3340 ubifs_dump_inode(c, inode); in dbg_check_inode_size()
3345 mutex_unlock(&c->tnc_mutex); in dbg_check_inode_size()