Lines Matching refs:c

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 = kmemdup(znode, c->max_znode_sz, GFP_NOFS); in copy_znode()
225 atomic_long_inc(&c->dirty_zn_cnt); in copy_znode()
237 static int add_idx_dirt(struct ubifs_info *c, int lnum, int dirt) in add_idx_dirt() argument
239 c->calc_idx_sz -= ALIGN(dirt, 8); in add_idx_dirt()
240 return ubifs_add_dirt(c, lnum, dirt); in add_idx_dirt()
250 static struct ubifs_znode *dirty_cow_znode(struct ubifs_info *c, in dirty_cow_znode() argument
260 atomic_long_inc(&c->dirty_zn_cnt); in dirty_cow_znode()
261 atomic_long_dec(&c->clean_zn_cnt); in dirty_cow_znode()
263 err = add_idx_dirt(c, zbr->lnum, zbr->len); in dirty_cow_znode()
270 zn = copy_znode(c, znode); in dirty_cow_znode()
275 err = insert_old_idx(c, zbr->lnum, zbr->offs); in dirty_cow_znode()
278 err = add_idx_dirt(c, zbr->lnum, zbr->len); in dirty_cow_znode()
312 static int lnc_add(struct ubifs_info *c, struct ubifs_zbranch *zbr, in lnc_add() argument
321 ubifs_assert(is_hash_key(c, &zbr->key)); in lnc_add()
323 err = ubifs_validate_entry(c, dent); in lnc_add()
326 ubifs_dump_node(c, dent); in lnc_add()
348 static int lnc_add_directly(struct ubifs_info *c, struct ubifs_zbranch *zbr, in lnc_add_directly() argument
356 err = ubifs_validate_entry(c, node); in lnc_add_directly()
359 ubifs_dump_node(c, node); in lnc_add_directly()
391 static int tnc_read_node_nm(struct ubifs_info *c, struct ubifs_zbranch *zbr, in tnc_read_node_nm() argument
396 ubifs_assert(is_hash_key(c, &zbr->key)); in tnc_read_node_nm()
405 err = ubifs_tnc_read_node(c, zbr, node); in tnc_read_node_nm()
410 err = lnc_add(c, zbr, node); in tnc_read_node_nm()
438 static int try_read_node(const struct ubifs_info *c, void *buf, int type, in try_read_node() argument
447 err = ubifs_leb_read(c, lnum, buf, offs, len, 1); in try_read_node()
449 ubifs_err(c, "cannot read node type %d from LEB %d:%d, error %d", in try_read_node()
464 if (type == UBIFS_DATA_NODE && c->no_chk_data_crc && !c->mounting && in try_read_node()
465 !c->remounting_rw) in try_read_node()
486 static int fallible_read_node(struct ubifs_info *c, const union ubifs_key *key, in fallible_read_node() argument
493 ret = try_read_node(c, node, key_type(c, key), zbr->len, zbr->lnum, in fallible_read_node()
500 key_read(c, &dent->key, &node_key); in fallible_read_node()
501 if (keys_cmp(c, key, &node_key) != 0) in fallible_read_node()
504 if (ret == 0 && c->replaying) in fallible_read_node()
521 static int matches_name(struct ubifs_info *c, struct ubifs_zbranch *zbr, in matches_name() argument
533 err = ubifs_tnc_read_node(c, zbr, dent); in matches_name()
538 err = lnc_add_directly(c, zbr, dent); in matches_name()
571 static struct ubifs_znode *get_znode(struct ubifs_info *c, in get_znode() argument
580 znode = ubifs_load_znode(c, zbr, znode, n); in get_znode()
593 static int tnc_next(struct ubifs_info *c, struct ubifs_znode **zn, int *n) in tnc_next() argument
612 znode = get_znode(c, znode, nn); in tnc_next()
616 znode = get_znode(c, znode, 0); in tnc_next()
638 static int tnc_prev(struct ubifs_info *c, struct ubifs_znode **zn, int *n) in tnc_prev() argument
656 znode = get_znode(c, znode, nn); in tnc_prev()
661 znode = get_znode(c, znode, nn); in tnc_prev()
690 static int resolve_collision(struct ubifs_info *c, const union ubifs_key *key, in resolve_collision() argument
696 err = matches_name(c, &(*zn)->zbranch[*n], nm); in resolve_collision()
705 err = tnc_prev(c, zn, n); in resolve_collision()
713 if (keys_cmp(c, &(*zn)->zbranch[*n].key, key)) { in resolve_collision()
744 err = tnc_next(c, zn, n); in resolve_collision()
757 err = matches_name(c, &(*zn)->zbranch[*n], nm); in resolve_collision()
772 err = tnc_next(c, &znode, &nn); in resolve_collision()
777 if (keys_cmp(c, &znode->zbranch[nn].key, key)) in resolve_collision()
779 err = matches_name(c, &znode->zbranch[nn], nm); in resolve_collision()
808 static int fallible_matches_name(struct ubifs_info *c, in fallible_matches_name() argument
821 err = fallible_read_node(c, &zbr->key, zbr, dent); in fallible_matches_name()
831 err = lnc_add_directly(c, zbr, dent); in fallible_matches_name()
878 static int fallible_resolve_collision(struct ubifs_info *c, in fallible_resolve_collision() argument
886 cmp = fallible_matches_name(c, &znode->zbranch[nn], nm); in fallible_resolve_collision()
906 err = tnc_prev(c, zn, n); in fallible_resolve_collision()
914 if (keys_cmp(c, &(*zn)->zbranch[*n].key, key)) { in fallible_resolve_collision()
917 err = tnc_next(c, zn, n); in fallible_resolve_collision()
930 err = fallible_matches_name(c, &(*zn)->zbranch[*n], nm); in fallible_resolve_collision()
954 err = tnc_next(c, &znode, &nn); in fallible_resolve_collision()
959 if (keys_cmp(c, &znode->zbranch[nn].key, key)) in fallible_resolve_collision()
961 err = fallible_matches_name(c, &znode->zbranch[nn], nm); in fallible_resolve_collision()
1022 static int resolve_collision_directly(struct ubifs_info *c, in resolve_collision_directly() argument
1037 err = tnc_prev(c, &znode, &nn); in resolve_collision_directly()
1042 if (keys_cmp(c, &znode->zbranch[nn].key, key)) in resolve_collision_directly()
1055 err = tnc_next(c, &znode, &nn); in resolve_collision_directly()
1060 if (keys_cmp(c, &znode->zbranch[nn].key, key)) in resolve_collision_directly()
1079 static struct ubifs_znode *dirty_cow_bottom_up(struct ubifs_info *c, in dirty_cow_bottom_up() argument
1083 int *path = c->bottom_up_buf, p = 0; in dirty_cow_bottom_up()
1085 ubifs_assert(c->zroot.znode); in dirty_cow_bottom_up()
1087 if (c->zroot.znode->level > BOTTOM_UP_HEIGHT) { in dirty_cow_bottom_up()
1088 kfree(c->bottom_up_buf); in dirty_cow_bottom_up()
1089 c->bottom_up_buf = kmalloc(c->zroot.znode->level * sizeof(int), in dirty_cow_bottom_up()
1091 if (!c->bottom_up_buf) in dirty_cow_bottom_up()
1093 path = c->bottom_up_buf; in dirty_cow_bottom_up()
1095 if (c->zroot.znode->level) { in dirty_cow_bottom_up()
1104 ubifs_assert(p < c->zroot.znode->level); in dirty_cow_bottom_up()
1121 znode = dirty_cow_znode(c, zbr); in dirty_cow_bottom_up()
1123 ubifs_assert(znode == c->zroot.znode); in dirty_cow_bottom_up()
1124 znode = dirty_cow_znode(c, &c->zroot); in dirty_cow_bottom_up()
1158 int ubifs_lookup_level0(struct ubifs_info *c, const union ubifs_key *key, in ubifs_lookup_level0() argument
1166 ubifs_assert(key_type(c, key) < UBIFS_INVALID_KEY); in ubifs_lookup_level0()
1168 znode = c->zroot.znode; in ubifs_lookup_level0()
1170 znode = ubifs_load_znode(c, &c->zroot, NULL, 0); in ubifs_lookup_level0()
1180 exact = ubifs_search_zbranch(c, znode, key, n); in ubifs_lookup_level0()
1196 znode = ubifs_load_znode(c, zbr, znode, *n); in ubifs_lookup_level0()
1202 if (exact || !is_hash_key(c, key) || *n != -1) { in ubifs_lookup_level0()
1250 err = tnc_prev(c, &znode, n); in ubifs_lookup_level0()
1258 if (keys_cmp(c, key, &znode->zbranch[*n].key)) { in ubifs_lookup_level0()
1294 static int lookup_level0_dirty(struct ubifs_info *c, const union ubifs_key *key, in lookup_level0_dirty() argument
1303 znode = c->zroot.znode; in lookup_level0_dirty()
1305 znode = ubifs_load_znode(c, &c->zroot, NULL, 0); in lookup_level0_dirty()
1310 znode = dirty_cow_znode(c, &c->zroot); in lookup_level0_dirty()
1319 exact = ubifs_search_zbranch(c, znode, key, n); in lookup_level0_dirty()
1330 znode = dirty_cow_znode(c, zbr); in lookup_level0_dirty()
1337 znode = ubifs_load_znode(c, zbr, znode, *n); in lookup_level0_dirty()
1340 znode = dirty_cow_znode(c, zbr); in lookup_level0_dirty()
1346 if (exact || !is_hash_key(c, key) || *n != -1) { in lookup_level0_dirty()
1355 err = tnc_prev(c, &znode, n); in lookup_level0_dirty()
1363 if (keys_cmp(c, key, &znode->zbranch[*n].key)) { in lookup_level0_dirty()
1370 znode = dirty_cow_bottom_up(c, znode); in lookup_level0_dirty()
1390 static int maybe_leb_gced(struct ubifs_info *c, int lnum, int gc_seq1) in maybe_leb_gced() argument
1394 gced_lnum = c->gced_lnum; in maybe_leb_gced()
1396 gc_seq2 = c->gc_seq; in maybe_leb_gced()
1408 if (gced_lnum != c->gced_lnum) in maybe_leb_gced()
1429 int ubifs_tnc_locate(struct ubifs_info *c, const union ubifs_key *key, in ubifs_tnc_locate() argument
1437 mutex_lock(&c->tnc_mutex); in ubifs_tnc_locate()
1438 found = ubifs_lookup_level0(c, key, &znode, &n); in ubifs_tnc_locate()
1451 if (is_hash_key(c, key)) { in ubifs_tnc_locate()
1456 err = tnc_read_node_nm(c, zt, node); in ubifs_tnc_locate()
1460 err = ubifs_tnc_read_node(c, zt, node); in ubifs_tnc_locate()
1465 gc_seq1 = c->gc_seq; in ubifs_tnc_locate()
1466 mutex_unlock(&c->tnc_mutex); in ubifs_tnc_locate()
1468 if (ubifs_get_wbuf(c, zbr.lnum)) { in ubifs_tnc_locate()
1470 err = ubifs_tnc_read_node(c, &zbr, node); in ubifs_tnc_locate()
1474 err = fallible_read_node(c, key, &zbr, node); in ubifs_tnc_locate()
1475 if (err <= 0 || maybe_leb_gced(c, zbr.lnum, gc_seq1)) { in ubifs_tnc_locate()
1486 mutex_unlock(&c->tnc_mutex); in ubifs_tnc_locate()
1503 int ubifs_tnc_get_bu_keys(struct ubifs_info *c, struct bu_info *bu) in ubifs_tnc_get_bu_keys() argument
1507 unsigned int block = key_block(c, &bu->key); in ubifs_tnc_get_bu_keys()
1514 mutex_lock(&c->tnc_mutex); in ubifs_tnc_get_bu_keys()
1516 err = ubifs_lookup_level0(c, &bu->key, &znode, &n); in ubifs_tnc_get_bu_keys()
1539 err = tnc_next(c, &znode, &n); in ubifs_tnc_get_bu_keys()
1545 if (key_inum(c, key) != key_inum(c, &bu->key) || in ubifs_tnc_get_bu_keys()
1546 key_type(c, key) != UBIFS_DATA_KEY) { in ubifs_tnc_get_bu_keys()
1573 next_block = key_block(c, key); in ubifs_tnc_get_bu_keys()
1592 bu->gc_seq = c->gc_seq; in ubifs_tnc_get_bu_keys()
1593 mutex_unlock(&c->tnc_mutex); in ubifs_tnc_get_bu_keys()
1615 block = key_block(c, &bu->key) + bu->blk_cnt; in ubifs_tnc_get_bu_keys()
1618 if (key_block(c, &bu->zbranch[bu->cnt - 1].key) < block) in ubifs_tnc_get_bu_keys()
1638 const struct ubifs_info *c = wbuf->c; in read_wbuf() local
1642 ubifs_assert(wbuf && lnum >= 0 && lnum < c->leb_cnt && offs >= 0); in read_wbuf()
1643 ubifs_assert(!(offs & 7) && offs < c->leb_size); in read_wbuf()
1644 ubifs_assert(offs + len <= c->leb_size); in read_wbuf()
1651 return ubifs_leb_read(c, lnum, buf, offs, len, 0); in read_wbuf()
1665 return ubifs_leb_read(c, lnum, buf, offs, rlen, 0); in read_wbuf()
1678 static int validate_data_node(struct ubifs_info *c, void *buf, in validate_data_node() argument
1686 ubifs_err(c, "bad node type (%d but expected %d)", in validate_data_node()
1691 err = ubifs_check_node(c, buf, zbr->lnum, zbr->offs, 0, 0); in validate_data_node()
1693 ubifs_err(c, "expected node type %d", UBIFS_DATA_NODE); in validate_data_node()
1699 ubifs_err(c, "bad node length %d, expected %d", len, zbr->len); in validate_data_node()
1704 key_read(c, buf + UBIFS_KEY_OFFSET, &key1); in validate_data_node()
1705 if (!keys_eq(c, &zbr->key, &key1)) { in validate_data_node()
1706 ubifs_err(c, "bad key in node at LEB %d:%d", in validate_data_node()
1718 ubifs_err(c, "bad node at LEB %d:%d", zbr->lnum, zbr->offs); in validate_data_node()
1719 ubifs_dump_node(c, buf); in validate_data_node()
1734 int ubifs_tnc_bulk_read(struct ubifs_info *c, struct bu_info *bu) in ubifs_tnc_bulk_read() argument
1743 ubifs_err(c, "buffer too small %d vs %d", bu->buf_len, len); in ubifs_tnc_bulk_read()
1748 wbuf = ubifs_get_wbuf(c, lnum); in ubifs_tnc_bulk_read()
1752 err = ubifs_leb_read(c, lnum, bu->buf, offs, len, 0); in ubifs_tnc_bulk_read()
1755 if (maybe_leb_gced(c, lnum, bu->gc_seq)) in ubifs_tnc_bulk_read()
1759 ubifs_err(c, "failed to read from LEB %d:%d, error %d", in ubifs_tnc_bulk_read()
1769 err = validate_data_node(c, buf, &bu->zbranch[i]); in ubifs_tnc_bulk_read()
1791 static int do_lookup_nm(struct ubifs_info *c, const union ubifs_key *key, in do_lookup_nm() argument
1798 mutex_lock(&c->tnc_mutex); in do_lookup_nm()
1799 found = ubifs_lookup_level0(c, key, &znode, &n); in do_lookup_nm()
1810 err = resolve_collision(c, key, &znode, &n, nm); in do_lookup_nm()
1819 err = tnc_read_node_nm(c, &znode->zbranch[n], node); in do_lookup_nm()
1822 mutex_unlock(&c->tnc_mutex); in do_lookup_nm()
1839 int ubifs_tnc_lookup_nm(struct ubifs_info *c, const union ubifs_key *key, in ubifs_tnc_lookup_nm() argument
1849 err = ubifs_tnc_lookup(c, key, node); in ubifs_tnc_lookup_nm()
1861 return do_lookup_nm(c, key, node, nm); in ubifs_tnc_lookup_nm()
1873 static void correct_parent_keys(const struct ubifs_info *c, in correct_parent_keys() argument
1884 while (keys_cmp(c, key, key1) < 0) { in correct_parent_keys()
1885 key_copy(c, key, key1); in correct_parent_keys()
1957 static int tnc_insert(struct ubifs_info *c, struct ubifs_znode *znode, in tnc_insert() argument
1964 ubifs_assert(n >= 0 && n <= c->fanout); in tnc_insert()
1969 if (znode->child_cnt < c->fanout) { in tnc_insert()
1970 ubifs_assert(n != c->fanout); in tnc_insert()
1977 correct_parent_keys(c, znode); in tnc_insert()
1993 ins_clr_old_idx_znode(c, znode); in tnc_insert()
1995 zn = kzalloc(c->max_znode_sz, GFP_NOFS); in tnc_insert()
2002 if (znode->level == 0 && key_type(c, key) == UBIFS_DATA_KEY) { in tnc_insert()
2004 if (n == c->fanout) { in tnc_insert()
2006 if (key_inum(c, key1) == key_inum(c, key) && in tnc_insert()
2007 key_type(c, key1) == UBIFS_DATA_KEY) in tnc_insert()
2011 } else if (appending && n != c->fanout) { in tnc_insert()
2015 if (n >= (c->fanout + 1) / 2) { in tnc_insert()
2017 if (key_inum(c, key1) == key_inum(c, key) && in tnc_insert()
2018 key_type(c, key1) == UBIFS_DATA_KEY) { in tnc_insert()
2020 if (key_inum(c, key1) != key_inum(c, key) || in tnc_insert()
2021 key_type(c, key1) != UBIFS_DATA_KEY) { in tnc_insert()
2023 move = c->fanout - keep; in tnc_insert()
2032 keep = c->fanout; in tnc_insert()
2035 keep = (c->fanout + 1) / 2; in tnc_insert()
2036 move = c->fanout - keep; in tnc_insert()
2061 atomic_long_inc(&c->dirty_zn_cnt); in tnc_insert()
2087 correct_parent_keys(c, znode); in tnc_insert()
2106 zi = kzalloc(c->max_znode_sz, GFP_NOFS); in tnc_insert()
2114 atomic_long_inc(&c->dirty_zn_cnt); in tnc_insert()
2118 zi->zbranch[0].lnum = c->zroot.lnum; in tnc_insert()
2119 zi->zbranch[0].offs = c->zroot.offs; in tnc_insert()
2120 zi->zbranch[0].len = c->zroot.len; in tnc_insert()
2124 c->zroot.lnum = 0; in tnc_insert()
2125 c->zroot.offs = 0; in tnc_insert()
2126 c->zroot.len = 0; in tnc_insert()
2127 c->zroot.znode = zi; in tnc_insert()
2149 int ubifs_tnc_add(struct ubifs_info *c, const union ubifs_key *key, int lnum, in ubifs_tnc_add() argument
2155 mutex_lock(&c->tnc_mutex); in ubifs_tnc_add()
2157 found = lookup_level0_dirty(c, key, &znode, &n); in ubifs_tnc_add()
2165 key_copy(c, key, &zbr.key); in ubifs_tnc_add()
2166 err = tnc_insert(c, znode, &zbr, n + 1); in ubifs_tnc_add()
2171 err = ubifs_add_dirt(c, zbr->lnum, zbr->len); in ubifs_tnc_add()
2178 err = dbg_check_tnc(c, 0); in ubifs_tnc_add()
2179 mutex_unlock(&c->tnc_mutex); in ubifs_tnc_add()
2198 int ubifs_tnc_replace(struct ubifs_info *c, const union ubifs_key *key, in ubifs_tnc_replace() argument
2204 mutex_lock(&c->tnc_mutex); in ubifs_tnc_replace()
2207 found = lookup_level0_dirty(c, key, &znode, &n); in ubifs_tnc_replace()
2219 err = ubifs_add_dirt(c, zbr->lnum, zbr->len); in ubifs_tnc_replace()
2226 } else if (is_hash_key(c, key)) { in ubifs_tnc_replace()
2227 found = resolve_collision_directly(c, key, &znode, &n, in ubifs_tnc_replace()
2239 znode = dirty_cow_bottom_up(c, znode); in ubifs_tnc_replace()
2247 err = ubifs_add_dirt(c, zbr->lnum, in ubifs_tnc_replace()
2259 err = ubifs_add_dirt(c, lnum, len); in ubifs_tnc_replace()
2262 err = dbg_check_tnc(c, 0); in ubifs_tnc_replace()
2265 mutex_unlock(&c->tnc_mutex); in ubifs_tnc_replace()
2281 int ubifs_tnc_add_nm(struct ubifs_info *c, const union ubifs_key *key, in ubifs_tnc_add_nm() argument
2287 mutex_lock(&c->tnc_mutex); in ubifs_tnc_add_nm()
2290 found = lookup_level0_dirty(c, key, &znode, &n); in ubifs_tnc_add_nm()
2297 if (c->replaying) in ubifs_tnc_add_nm()
2298 found = fallible_resolve_collision(c, key, &znode, &n, in ubifs_tnc_add_nm()
2301 found = resolve_collision(c, key, &znode, &n, nm); in ubifs_tnc_add_nm()
2310 znode = dirty_cow_bottom_up(c, znode); in ubifs_tnc_add_nm()
2321 err = ubifs_add_dirt(c, zbr->lnum, zbr->len); in ubifs_tnc_add_nm()
2336 key_copy(c, key, &zbr.key); in ubifs_tnc_add_nm()
2337 err = tnc_insert(c, znode, &zbr, n + 1); in ubifs_tnc_add_nm()
2340 if (c->replaying) { in ubifs_tnc_add_nm()
2349 err = dbg_check_tnc(c, 0); in ubifs_tnc_add_nm()
2350 mutex_unlock(&c->tnc_mutex); in ubifs_tnc_add_nm()
2353 return ubifs_tnc_remove_nm(c, key, &noname); in ubifs_tnc_add_nm()
2359 err = dbg_check_tnc(c, 0); in ubifs_tnc_add_nm()
2360 mutex_unlock(&c->tnc_mutex); in ubifs_tnc_add_nm()
2373 static int tnc_delete(struct ubifs_info *c, struct ubifs_znode *znode, int n) in tnc_delete() argument
2381 ubifs_assert(n >= 0 && n < c->fanout); in tnc_delete()
2387 err = ubifs_add_dirt(c, zbr->lnum, zbr->len); in tnc_delete()
2389 ubifs_dump_znode(c, znode); in tnc_delete()
2413 atomic_long_dec(&c->dirty_zn_cnt); in tnc_delete()
2415 err = insert_old_idx_znode(c, znode); in tnc_delete()
2421 atomic_long_inc(&c->clean_zn_cnt); in tnc_delete()
2445 znode = get_znode(c, znode, 0); in tnc_delete()
2448 znode = dirty_cow_znode(c, zbr); in tnc_delete()
2453 if (c->zroot.len) { in tnc_delete()
2454 err = insert_old_idx(c, c->zroot.lnum, in tnc_delete()
2455 c->zroot.offs); in tnc_delete()
2459 c->zroot.lnum = zbr->lnum; in tnc_delete()
2460 c->zroot.offs = zbr->offs; in tnc_delete()
2461 c->zroot.len = zbr->len; in tnc_delete()
2462 c->zroot.znode = znode; in tnc_delete()
2465 atomic_long_dec(&c->dirty_zn_cnt); in tnc_delete()
2469 atomic_long_inc(&c->clean_zn_cnt); in tnc_delete()
2486 int ubifs_tnc_remove(struct ubifs_info *c, const union ubifs_key *key) in ubifs_tnc_remove() argument
2491 mutex_lock(&c->tnc_mutex); in ubifs_tnc_remove()
2493 found = lookup_level0_dirty(c, key, &znode, &n); in ubifs_tnc_remove()
2499 err = tnc_delete(c, znode, n); in ubifs_tnc_remove()
2501 err = dbg_check_tnc(c, 0); in ubifs_tnc_remove()
2504 mutex_unlock(&c->tnc_mutex); in ubifs_tnc_remove()
2516 int ubifs_tnc_remove_nm(struct ubifs_info *c, const union ubifs_key *key, in ubifs_tnc_remove_nm() argument
2522 mutex_lock(&c->tnc_mutex); in ubifs_tnc_remove_nm()
2524 err = lookup_level0_dirty(c, key, &znode, &n); in ubifs_tnc_remove_nm()
2529 if (c->replaying) in ubifs_tnc_remove_nm()
2530 err = fallible_resolve_collision(c, key, &znode, &n, in ubifs_tnc_remove_nm()
2533 err = resolve_collision(c, key, &znode, &n, nm); in ubifs_tnc_remove_nm()
2540 znode = dirty_cow_bottom_up(c, znode); in ubifs_tnc_remove_nm()
2546 err = tnc_delete(c, znode, n); in ubifs_tnc_remove_nm()
2552 err = dbg_check_tnc(c, 0); in ubifs_tnc_remove_nm()
2553 mutex_unlock(&c->tnc_mutex); in ubifs_tnc_remove_nm()
2566 static int key_in_range(struct ubifs_info *c, union ubifs_key *key, in key_in_range() argument
2569 if (keys_cmp(c, key, from_key) < 0) in key_in_range()
2571 if (keys_cmp(c, key, to_key) > 0) in key_in_range()
2586 int ubifs_tnc_remove_range(struct ubifs_info *c, union ubifs_key *from_key, in ubifs_tnc_remove_range() argument
2593 mutex_lock(&c->tnc_mutex); in ubifs_tnc_remove_range()
2596 err = ubifs_lookup_level0(c, from_key, &znode, &n); in ubifs_tnc_remove_range()
2603 err = tnc_next(c, &znode, &n); in ubifs_tnc_remove_range()
2611 if (!key_in_range(c, key, from_key, to_key)) { in ubifs_tnc_remove_range()
2619 znode = dirty_cow_bottom_up(c, znode); in ubifs_tnc_remove_range()
2629 if (!key_in_range(c, key, from_key, to_key)) in ubifs_tnc_remove_range()
2632 err = ubifs_add_dirt(c, znode->zbranch[i].lnum, in ubifs_tnc_remove_range()
2635 ubifs_dump_znode(c, znode); in ubifs_tnc_remove_range()
2647 err = tnc_delete(c, znode, n); in ubifs_tnc_remove_range()
2654 err = dbg_check_tnc(c, 0); in ubifs_tnc_remove_range()
2655 mutex_unlock(&c->tnc_mutex); in ubifs_tnc_remove_range()
2668 int ubifs_tnc_remove_ino(struct ubifs_info *c, ino_t inum) in ubifs_tnc_remove_ino() argument
2680 lowest_xent_key(c, &key1, inum); in ubifs_tnc_remove_ino()
2685 xent = ubifs_tnc_next_ent(c, &key1, &nm); in ubifs_tnc_remove_ino()
2699 err = ubifs_tnc_remove_nm(c, &key1, &nm); in ubifs_tnc_remove_ino()
2705 lowest_ino_key(c, &key1, xattr_inum); in ubifs_tnc_remove_ino()
2706 highest_ino_key(c, &key2, xattr_inum); in ubifs_tnc_remove_ino()
2707 err = ubifs_tnc_remove_range(c, &key1, &key2); in ubifs_tnc_remove_ino()
2715 key_read(c, &xent->key, &key1); in ubifs_tnc_remove_ino()
2719 lowest_ino_key(c, &key1, inum); in ubifs_tnc_remove_ino()
2720 highest_ino_key(c, &key2, inum); in ubifs_tnc_remove_ino()
2722 return ubifs_tnc_remove_range(c, &key1, &key2); in ubifs_tnc_remove_ino()
2748 struct ubifs_dent_node *ubifs_tnc_next_ent(struct ubifs_info *c, in ubifs_tnc_next_ent() argument
2752 int n, err, type = key_type(c, key); in ubifs_tnc_next_ent()
2759 ubifs_assert(is_hash_key(c, key)); in ubifs_tnc_next_ent()
2761 mutex_lock(&c->tnc_mutex); in ubifs_tnc_next_ent()
2762 err = ubifs_lookup_level0(c, key, &znode, &n); in ubifs_tnc_next_ent()
2769 err = resolve_collision(c, key, &znode, &n, nm); in ubifs_tnc_next_ent()
2777 err = tnc_next(c, &znode, &n); in ubifs_tnc_next_ent()
2792 err = tnc_next(c, &znode, &n); in ubifs_tnc_next_ent()
2810 if (key_inum(c, dkey) != key_inum(c, key) || in ubifs_tnc_next_ent()
2811 key_type(c, dkey) != type) { in ubifs_tnc_next_ent()
2816 err = tnc_read_node_nm(c, zbr, dent); in ubifs_tnc_next_ent()
2820 mutex_unlock(&c->tnc_mutex); in ubifs_tnc_next_ent()
2826 mutex_unlock(&c->tnc_mutex); in ubifs_tnc_next_ent()
2836 static void tnc_destroy_cnext(struct ubifs_info *c) in tnc_destroy_cnext() argument
2840 if (!c->cnext) in tnc_destroy_cnext()
2842 ubifs_assert(c->cmt_state == COMMIT_BROKEN); in tnc_destroy_cnext()
2843 cnext = c->cnext; in tnc_destroy_cnext()
2850 } while (cnext && cnext != c->cnext); in tnc_destroy_cnext()
2857 void ubifs_tnc_close(struct ubifs_info *c) in ubifs_tnc_close() argument
2859 tnc_destroy_cnext(c); in ubifs_tnc_close()
2860 if (c->zroot.znode) { in ubifs_tnc_close()
2863 n = atomic_long_read(&c->clean_zn_cnt); in ubifs_tnc_close()
2864 freed = ubifs_destroy_tnc_subtree(c->zroot.znode); in ubifs_tnc_close()
2868 kfree(c->gap_lebs); in ubifs_tnc_close()
2869 kfree(c->ilebs); in ubifs_tnc_close()
2870 destroy_old_idx(c); in ubifs_tnc_close()
2881 static struct ubifs_znode *left_znode(struct ubifs_info *c, in left_znode() argument
2895 znode = get_znode(c, znode, n); in left_znode()
2900 znode = get_znode(c, znode, n); in left_znode()
2918 static struct ubifs_znode *right_znode(struct ubifs_info *c, in right_znode() argument
2932 znode = get_znode(c, znode, n); in right_znode()
2936 znode = get_znode(c, znode, 0); in right_znode()
2971 static struct ubifs_znode *lookup_znode(struct ubifs_info *c, in lookup_znode() argument
2978 ubifs_assert(key_type(c, key) < UBIFS_INVALID_KEY); in lookup_znode()
2988 znode = c->zroot.znode; in lookup_znode()
2990 znode = ubifs_load_znode(c, &c->zroot, NULL, 0); in lookup_znode()
2995 if (c->zroot.lnum == lnum && c->zroot.offs == offs) in lookup_znode()
3001 ubifs_search_zbranch(c, znode, key, &n); in lookup_znode()
3011 znode = left_znode(c, znode); in lookup_znode()
3016 ubifs_search_zbranch(c, znode, key, &n); in lookup_znode()
3021 znode = get_znode(c, znode, n); in lookup_znode()
3027 return get_znode(c, znode, n); in lookup_znode()
3029 if (!is_hash_key(c, key)) in lookup_znode()
3043 znode = left_znode(c, znode); in lookup_znode()
3053 return get_znode(c, znode, n); in lookup_znode()
3055 if (keys_cmp(c, &znode->zbranch[n].key, key) < 0) in lookup_znode()
3065 znode = right_znode(c, znode); in lookup_znode()
3075 return get_znode(c, znode, n); in lookup_znode()
3077 if (keys_cmp(c, &znode->zbranch[n].key, key) > 0) in lookup_znode()
3100 int is_idx_node_in_tnc(struct ubifs_info *c, union ubifs_key *key, int level, in is_idx_node_in_tnc() argument
3105 znode = lookup_znode(c, key, level, lnum, offs); in is_idx_node_in_tnc()
3127 static int is_leaf_node_in_tnc(struct ubifs_info *c, union ubifs_key *key, in is_leaf_node_in_tnc() argument
3133 const int unique = !is_hash_key(c, key); in is_leaf_node_in_tnc()
3135 found = ubifs_lookup_level0(c, key, &znode, &n); in is_leaf_node_in_tnc()
3153 err = tnc_prev(c, &znode, &n); in is_leaf_node_in_tnc()
3158 if (keys_cmp(c, key, &znode->zbranch[n].key)) in is_leaf_node_in_tnc()
3168 err = tnc_next(c, &znode, &n); in is_leaf_node_in_tnc()
3174 if (keys_cmp(c, key, &znode->zbranch[n].key)) in is_leaf_node_in_tnc()
3197 int ubifs_tnc_has_node(struct ubifs_info *c, union ubifs_key *key, int level, in ubifs_tnc_has_node() argument
3202 mutex_lock(&c->tnc_mutex); in ubifs_tnc_has_node()
3204 err = is_idx_node_in_tnc(c, key, level, lnum, offs); in ubifs_tnc_has_node()
3216 err = is_leaf_node_in_tnc(c, key, lnum, offs); in ubifs_tnc_has_node()
3219 mutex_unlock(&c->tnc_mutex); in ubifs_tnc_has_node()
3237 int ubifs_dirty_idx_node(struct ubifs_info *c, union ubifs_key *key, int level, in ubifs_dirty_idx_node() argument
3243 mutex_lock(&c->tnc_mutex); in ubifs_dirty_idx_node()
3244 znode = lookup_znode(c, key, level, lnum, offs); in ubifs_dirty_idx_node()
3251 znode = dirty_cow_bottom_up(c, znode); in ubifs_dirty_idx_node()
3258 mutex_unlock(&c->tnc_mutex); in ubifs_dirty_idx_node()
3273 int dbg_check_inode_size(struct ubifs_info *c, const struct inode *inode, in dbg_check_inode_size() argument
3283 if (!dbg_is_chk_gen(c)) in dbg_check_inode_size()
3287 data_key_init(c, &from_key, inode->i_ino, block); in dbg_check_inode_size()
3288 highest_data_key(c, &to_key, inode->i_ino); in dbg_check_inode_size()
3290 mutex_lock(&c->tnc_mutex); in dbg_check_inode_size()
3291 err = ubifs_lookup_level0(c, &from_key, &znode, &n); in dbg_check_inode_size()
3300 err = tnc_next(c, &znode, &n); in dbg_check_inode_size()
3310 if (!key_in_range(c, key, &from_key, &to_key)) in dbg_check_inode_size()
3314 block = key_block(c, key); in dbg_check_inode_size()
3315 ubifs_err(c, "inode %lu has size %lld, but there are data at offset %lld", in dbg_check_inode_size()
3318 mutex_unlock(&c->tnc_mutex); in dbg_check_inode_size()
3319 ubifs_dump_inode(c, inode); in dbg_check_inode_size()
3324 mutex_unlock(&c->tnc_mutex); in dbg_check_inode_size()