Lines Matching refs:c
72 static int get_master_node(const struct ubifs_info *c, int lnum, void **pbuf, in get_master_node() argument
75 const int sz = c->mst_node_alsz; in get_master_node()
79 sbuf = vmalloc(c->leb_size); in get_master_node()
83 err = ubi_read(c->ubi, lnum, sbuf, 0, c->leb_size); in get_master_node()
90 len = c->leb_size; in get_master_node()
91 while (offs + UBIFS_MST_NODE_SZ <= c->leb_size) { in get_master_node()
107 ret = ubifs_scan_a_node(c, buf, len, lnum, offs, 1); in get_master_node()
113 ret = ubifs_scan_a_node(c, buf, len, lnum, offs, 1); in get_master_node()
135 if (offs < c->leb_size) { in get_master_node()
145 if (offs < c->leb_size) in get_master_node()
167 static int write_rcvrd_mst_node(struct ubifs_info *c, in write_rcvrd_mst_node() argument
170 int err = 0, lnum = UBIFS_MST_LNUM, sz = c->mst_node_alsz; in write_rcvrd_mst_node()
178 ubifs_prepare_node(c, mst, UBIFS_MST_NODE_SZ, 1); in write_rcvrd_mst_node()
179 err = ubi_leb_change(c->ubi, lnum, mst, sz, UBI_SHORTTERM); in write_rcvrd_mst_node()
182 err = ubi_leb_change(c->ubi, lnum + 1, mst, sz, UBI_SHORTTERM); in write_rcvrd_mst_node()
199 int ubifs_recover_master_node(struct ubifs_info *c) in ubifs_recover_master_node() argument
203 const int sz = c->mst_node_alsz; in ubifs_recover_master_node()
208 err = get_master_node(c, UBIFS_MST_LNUM, &buf1, &mst1, &cor1); in ubifs_recover_master_node()
212 err = get_master_node(c, UBIFS_MST_LNUM + 1, &buf2, &mst2, &cor2); in ubifs_recover_master_node()
240 } else if (offs1 == 0 && offs2 + sz >= c->leb_size) { in ubifs_recover_master_node()
265 if (offs2 + sz + sz <= c->leb_size) in ubifs_recover_master_node()
273 memcpy(c->mst_node, mst, UBIFS_MST_NODE_SZ); in ubifs_recover_master_node()
275 if ((c->vfs_sb->s_flags & MS_RDONLY)) { in ubifs_recover_master_node()
277 c->rcvrd_mst_node = kmalloc(sz, GFP_KERNEL); in ubifs_recover_master_node()
278 if (!c->rcvrd_mst_node) { in ubifs_recover_master_node()
282 memcpy(c->rcvrd_mst_node, c->mst_node, UBIFS_MST_NODE_SZ); in ubifs_recover_master_node()
285 c->max_sqnum = le64_to_cpu(mst->ch.sqnum) - 1; in ubifs_recover_master_node()
286 err = write_rcvrd_mst_node(c, c->mst_node); in ubifs_recover_master_node()
302 dbg_dump_node(c, mst1); in ubifs_recover_master_node()
306 dbg_dump_node(c, mst2); in ubifs_recover_master_node()
322 int ubifs_write_rcvrd_mst_node(struct ubifs_info *c) in ubifs_write_rcvrd_mst_node() argument
326 if (!c->rcvrd_mst_node) in ubifs_write_rcvrd_mst_node()
328 c->rcvrd_mst_node->flags |= cpu_to_le32(UBIFS_MST_DIRTY); in ubifs_write_rcvrd_mst_node()
329 c->mst_node->flags |= cpu_to_le32(UBIFS_MST_DIRTY); in ubifs_write_rcvrd_mst_node()
330 err = write_rcvrd_mst_node(c, c->rcvrd_mst_node); in ubifs_write_rcvrd_mst_node()
333 kfree(c->rcvrd_mst_node); in ubifs_write_rcvrd_mst_node()
334 c->rcvrd_mst_node = NULL; in ubifs_write_rcvrd_mst_node()
349 static int is_last_write(const struct ubifs_info *c, void *buf, int offs) in is_last_write() argument
355 if (c->min_io_size == 1) { in is_last_write()
356 check_len = c->leb_size - offs; in is_last_write()
375 empty_offs = ALIGN(offs + 1, c->min_io_size); in is_last_write()
376 check_len = c->leb_size - empty_offs; in is_last_write()
397 static void clean_buf(const struct ubifs_info *c, void **buf, int lnum, in clean_buf() argument
405 if (c->min_io_size == 1) { in clean_buf()
406 memset(*buf, 0xff, c->leb_size - *offs); in clean_buf()
411 empty_offs = ALIGN(*offs, c->min_io_size); in clean_buf()
413 ubifs_pad(c, *buf, pad_len); in clean_buf()
417 memset(*buf, 0xff, c->leb_size - empty_offs); in clean_buf()
431 static int no_more_nodes(const struct ubifs_info *c, void *buf, int len, in no_more_nodes() argument
446 if (c->min_io_size == 1) in no_more_nodes()
449 skip = ALIGN(offs + 1, c->min_io_size) - offs; in no_more_nodes()
460 ret = ubifs_scan_a_node(c, buf, len, lnum, offs, 1); in no_more_nodes()
489 static int fix_unclean_leb(struct ubifs_info *c, struct ubifs_scan_leb *sleb, in fix_unclean_leb() argument
503 if ((c->vfs_sb->s_flags & MS_RDONLY) && !c->remounting_rw) { in fix_unclean_leb()
514 list_add_tail(&ucleb->list, &c->unclean_leb_list); in fix_unclean_leb()
522 err = ubifs_leb_unmap(c, lnum); in fix_unclean_leb()
526 int len = ALIGN(endpt, c->min_io_size); in fix_unclean_leb()
529 err = ubi_read(c->ubi, lnum, sleb->buf, 0, in fix_unclean_leb()
541 ubifs_pad(c, buf, pad_len); in fix_unclean_leb()
544 err = ubi_leb_change(c->ubi, lnum, sleb->buf, len, in fix_unclean_leb()
596 struct ubifs_scan_leb *ubifs_recover_leb(struct ubifs_info *c, int lnum, in ubifs_recover_leb() argument
599 int err, len = c->leb_size - offs, need_clean = 0, quiet = 1; in ubifs_recover_leb()
606 sleb = ubifs_start_scan(c, lnum, offs, sbuf); in ubifs_recover_leb()
625 ret = ubifs_scan_a_node(c, buf, len, lnum, offs, quiet); in ubifs_recover_leb()
632 err = ubifs_add_snod(c, sleb, buf, offs); in ubifs_recover_leb()
652 if (!is_last_write(c, buf, offs)) in ubifs_recover_leb()
654 clean_buf(c, &buf, lnum, &offs, &len); in ubifs_recover_leb()
662 if (is_last_write(c, buf, offs)) { in ubifs_recover_leb()
663 clean_buf(c, &buf, lnum, &offs, &len); in ubifs_recover_leb()
670 if (no_more_nodes(c, buf, len, lnum, offs)) { in ubifs_recover_leb()
671 clean_buf(c, &buf, lnum, &offs, &len); in ubifs_recover_leb()
698 if (is_last_write(c, buf, offs)) { in ubifs_recover_leb()
699 clean_buf(c, &buf, lnum, &offs, &len); in ubifs_recover_leb()
711 len = c->leb_size - offs; in ubifs_recover_leb()
712 clean_buf(c, &buf, lnum, &offs, &len); in ubifs_recover_leb()
716 if (offs % c->min_io_size) { in ubifs_recover_leb()
717 clean_buf(c, &buf, lnum, &offs, &len); in ubifs_recover_leb()
721 ubifs_end_scan(c, sleb, lnum, offs); in ubifs_recover_leb()
724 err = fix_unclean_leb(c, sleb, start); in ubifs_recover_leb()
732 ubifs_scanned_corruption(c, lnum, offs, buf); in ubifs_recover_leb()
749 static int get_cs_sqnum(struct ubifs_info *c, int lnum, int offs, in get_cs_sqnum() argument
759 if (c->leb_size - offs < UBIFS_CS_NODE_SZ) in get_cs_sqnum()
761 err = ubi_read(c->ubi, lnum, (void *)cs_node, offs, UBIFS_CS_NODE_SZ); in get_cs_sqnum()
764 ret = ubifs_scan_a_node(c, cs_node, UBIFS_CS_NODE_SZ, lnum, offs, 0); in get_cs_sqnum()
773 if (le64_to_cpu(cs_node->cmt_no) != c->cmt_no) { in get_cs_sqnum()
776 c->cmt_no); in get_cs_sqnum()
804 struct ubifs_scan_leb *ubifs_recover_log_leb(struct ubifs_info *c, int lnum, in ubifs_recover_log_leb() argument
812 if (next_lnum >= UBIFS_LOG_LNUM + c->log_lebs) in ubifs_recover_log_leb()
814 if (next_lnum != c->ltail_lnum) { in ubifs_recover_log_leb()
819 sleb = ubifs_scan(c, next_lnum, 0, sbuf); in ubifs_recover_log_leb()
824 unsigned long long cs_sqnum = c->cs_sqnum; in ubifs_recover_log_leb()
831 err = get_cs_sqnum(c, lnum, offs, &cs_sqnum); in ubifs_recover_log_leb()
846 return ubifs_recover_leb(c, lnum, offs, sbuf, 0); in ubifs_recover_log_leb()
860 static int recover_head(const struct ubifs_info *c, int lnum, int offs, in recover_head() argument
865 if (c->min_io_size > 1) in recover_head()
866 len = c->min_io_size; in recover_head()
869 if (offs + len > c->leb_size) in recover_head()
870 len = c->leb_size - offs; in recover_head()
876 err = ubi_read(c->ubi, lnum, sbuf, offs, len); in recover_head()
892 return ubifs_leb_unmap(c, lnum); in recover_head()
893 err = ubi_read(c->ubi, lnum, sbuf, 0, offs); in recover_head()
896 return ubi_leb_change(c->ubi, lnum, sbuf, offs, UBI_UNKNOWN); in recover_head()
919 int ubifs_recover_inl_heads(const struct ubifs_info *c, void *sbuf) in ubifs_recover_inl_heads() argument
923 ubifs_assert(!(c->vfs_sb->s_flags & MS_RDONLY) || c->remounting_rw); in ubifs_recover_inl_heads()
925 dbg_rcvry("checking index head at %d:%d", c->ihead_lnum, c->ihead_offs); in ubifs_recover_inl_heads()
926 err = recover_head(c, c->ihead_lnum, c->ihead_offs, sbuf); in ubifs_recover_inl_heads()
930 dbg_rcvry("checking LPT head at %d:%d", c->nhead_lnum, c->nhead_offs); in ubifs_recover_inl_heads()
931 err = recover_head(c, c->nhead_lnum, c->nhead_offs, sbuf); in ubifs_recover_inl_heads()
950 static int clean_an_unclean_leb(const struct ubifs_info *c, in clean_an_unclean_leb() argument
960 err = ubifs_leb_unmap(c, lnum); in clean_an_unclean_leb()
966 err = ubi_read(c->ubi, lnum, buf, offs, len); in clean_an_unclean_leb()
976 ret = ubifs_scan_a_node(c, buf, len, lnum, offs, quiet); in clean_an_unclean_leb()
1010 ubifs_scanned_corruption(c, lnum, offs, buf); in clean_an_unclean_leb()
1015 len = ALIGN(ucleb->endpt, c->min_io_size); in clean_an_unclean_leb()
1020 buf = c->sbuf + len - pad_len; in clean_an_unclean_leb()
1021 ubifs_pad(c, buf, pad_len); in clean_an_unclean_leb()
1026 err = ubi_leb_change(c->ubi, lnum, sbuf, len, UBI_UNKNOWN); in clean_an_unclean_leb()
1046 int ubifs_clean_lebs(const struct ubifs_info *c, void *sbuf) in ubifs_clean_lebs() argument
1049 while (!list_empty(&c->unclean_leb_list)) { in ubifs_clean_lebs()
1053 ucleb = list_entry(c->unclean_leb_list.next, in ubifs_clean_lebs()
1055 err = clean_an_unclean_leb(c, ucleb, sbuf); in ubifs_clean_lebs()
1082 int ubifs_rcvry_gc_commit(struct ubifs_info *c) in ubifs_rcvry_gc_commit() argument
1084 struct ubifs_wbuf *wbuf = &c->jheads[GCHD].wbuf; in ubifs_rcvry_gc_commit()
1088 c->gc_lnum = -1; in ubifs_rcvry_gc_commit()
1097 if (wbuf->offs == c->leb_size) { in ubifs_rcvry_gc_commit()
1101 err = ubifs_find_dirty_leb(c, &lp, wbuf->offs, 2); in ubifs_rcvry_gc_commit()
1109 if (lp.free + lp.dirty == c->leb_size) { in ubifs_rcvry_gc_commit()
1111 if (lp.free != c->leb_size) { in ubifs_rcvry_gc_commit()
1112 err = ubifs_change_one_lp(c, lnum, c->leb_size, in ubifs_rcvry_gc_commit()
1117 err = ubifs_leb_unmap(c, lnum); in ubifs_rcvry_gc_commit()
1120 c->gc_lnum = lnum; in ubifs_rcvry_gc_commit()
1124 return ubifs_run_commit(c); in ubifs_rcvry_gc_commit()
1133 err = ubifs_return_leb(c, lnum); in ubifs_rcvry_gc_commit()
1143 err = ubifs_run_commit(c); in ubifs_rcvry_gc_commit()
1152 err = ubifs_garbage_collect_leb(c, &lp); in ubifs_rcvry_gc_commit()
1170 err = ubifs_leb_unmap(c, c->gc_lnum); in ubifs_rcvry_gc_commit()
1182 lnum = ubifs_find_free_leb_for_idx(c); in ubifs_rcvry_gc_commit()
1188 err = ubifs_change_one_lp(c, lnum, LPROPS_NC, LPROPS_NC, 0, in ubifs_rcvry_gc_commit()
1192 c->gc_lnum = lnum; in ubifs_rcvry_gc_commit()
1196 return ubifs_run_commit(c); in ubifs_rcvry_gc_commit()
1225 static int add_ino(struct ubifs_info *c, ino_t inum, loff_t i_size, in add_ino() argument
1228 struct rb_node **p = &c->size_tree.rb_node, *parent = NULL; in add_ino()
1250 rb_insert_color(&e->rb, &c->size_tree); in add_ino()
1260 static struct size_entry *find_ino(struct ubifs_info *c, ino_t inum) in find_ino() argument
1262 struct rb_node *p = c->size_tree.rb_node; in find_ino()
1282 static void remove_ino(struct ubifs_info *c, ino_t inum) in remove_ino() argument
1284 struct size_entry *e = find_ino(c, inum); in remove_ino()
1288 rb_erase(&e->rb, &c->size_tree); in remove_ino()
1296 void ubifs_destroy_size_tree(struct ubifs_info *c) in ubifs_destroy_size_tree() argument
1298 struct rb_node *this = c->size_tree.rb_node; in ubifs_destroy_size_tree()
1321 c->size_tree = RB_ROOT; in ubifs_destroy_size_tree()
1349 int ubifs_recover_size_accum(struct ubifs_info *c, union ubifs_key *key, in ubifs_recover_size_accum() argument
1352 ino_t inum = key_inum(c, key); in ubifs_recover_size_accum()
1356 switch (key_type(c, key)) { in ubifs_recover_size_accum()
1359 remove_ino(c, inum); in ubifs_recover_size_accum()
1361 e = find_ino(c, inum); in ubifs_recover_size_accum()
1366 err = add_ino(c, inum, new_size, 0, 1); in ubifs_recover_size_accum()
1373 e = find_ino(c, inum); in ubifs_recover_size_accum()
1378 err = add_ino(c, inum, 0, new_size, 0); in ubifs_recover_size_accum()
1384 e = find_ino(c, inum); in ubifs_recover_size_accum()
1397 static int fix_size_in_place(struct ubifs_info *c, struct size_entry *e) in fix_size_in_place() argument
1399 struct ubifs_ino_node *ino = c->sbuf; in fix_size_in_place()
1407 ino_key_init(c, &key, e->inum); in fix_size_in_place()
1408 err = ubifs_tnc_locate(c, &key, ino, &lnum, &offs); in fix_size_in_place()
1419 err = ubi_read(c->ubi, lnum, c->sbuf, 0, c->leb_size); in fix_size_in_place()
1423 ino = c->sbuf + offs; in fix_size_in_place()
1429 p = c->sbuf; in fix_size_in_place()
1430 len = c->leb_size - 1; in fix_size_in_place()
1433 len = ALIGN(len + 1, c->min_io_size); in fix_size_in_place()
1435 err = ubi_leb_change(c->ubi, lnum, c->sbuf, len, UBI_UNKNOWN); in fix_size_in_place()
1457 int ubifs_recover_size(struct ubifs_info *c) in ubifs_recover_size() argument
1459 struct rb_node *this = rb_first(&c->size_tree); in ubifs_recover_size()
1469 ino_key_init(c, &key, e->inum); in ubifs_recover_size()
1470 err = ubifs_tnc_lookup(c, &key, c->sbuf); in ubifs_recover_size()
1477 err = ubifs_tnc_remove_ino(c, e->inum); in ubifs_recover_size()
1481 struct ubifs_ino_node *ino = c->sbuf; in ubifs_recover_size()
1488 if (!e->inode && (c->vfs_sb->s_flags & MS_RDONLY)) { in ubifs_recover_size()
1492 inode = ubifs_iget(c->vfs_sb, e->inum); in ubifs_recover_size()
1508 err = fix_size_in_place(c, e); in ubifs_recover_size()
1516 rb_erase(&e->rb, &c->size_tree); in ubifs_recover_size()