Lines Matching refs:c

109 static int get_master_node(const struct ubifs_info *c, int lnum, void **pbuf,  in get_master_node()  argument
112 const int sz = c->mst_node_alsz; in get_master_node()
116 sbuf = vmalloc(c->leb_size); in get_master_node()
120 err = ubifs_leb_read(c, lnum, sbuf, 0, c->leb_size, 0); in get_master_node()
127 len = c->leb_size; in get_master_node()
128 while (offs + UBIFS_MST_NODE_SZ <= c->leb_size) { in get_master_node()
144 ret = ubifs_scan_a_node(c, buf, len, lnum, offs, 1); in get_master_node()
150 ret = ubifs_scan_a_node(c, buf, len, lnum, offs, 1); in get_master_node()
172 if (offs < c->leb_size) { in get_master_node()
182 if (offs < c->leb_size) in get_master_node()
204 static int write_rcvrd_mst_node(struct ubifs_info *c, in write_rcvrd_mst_node() argument
207 int err = 0, lnum = UBIFS_MST_LNUM, sz = c->mst_node_alsz; in write_rcvrd_mst_node()
215 ubifs_prepare_node(c, mst, UBIFS_MST_NODE_SZ, 1); in write_rcvrd_mst_node()
216 err = ubifs_leb_change(c, lnum, mst, sz); in write_rcvrd_mst_node()
219 err = ubifs_leb_change(c, lnum + 1, mst, sz); in write_rcvrd_mst_node()
236 int ubifs_recover_master_node(struct ubifs_info *c) in ubifs_recover_master_node() argument
240 const int sz = c->mst_node_alsz; in ubifs_recover_master_node()
245 err = get_master_node(c, UBIFS_MST_LNUM, &buf1, &mst1, &cor1); in ubifs_recover_master_node()
249 err = get_master_node(c, UBIFS_MST_LNUM + 1, &buf2, &mst2, &cor2); in ubifs_recover_master_node()
278 c->leb_size - offs2 - sz < sz) { in ubifs_recover_master_node()
303 if (offs2 + sz + sz <= c->leb_size) in ubifs_recover_master_node()
308 ubifs_msg(c, "recovered master node from LEB %d", in ubifs_recover_master_node()
311 memcpy(c->mst_node, mst, UBIFS_MST_NODE_SZ); in ubifs_recover_master_node()
313 if (c->ro_mount) { in ubifs_recover_master_node()
315 c->rcvrd_mst_node = kmalloc(sz, GFP_KERNEL); in ubifs_recover_master_node()
316 if (!c->rcvrd_mst_node) { in ubifs_recover_master_node()
320 memcpy(c->rcvrd_mst_node, c->mst_node, UBIFS_MST_NODE_SZ); in ubifs_recover_master_node()
346 c->mst_node->flags |= cpu_to_le32(UBIFS_MST_DIRTY); in ubifs_recover_master_node()
349 c->max_sqnum = le64_to_cpu(mst->ch.sqnum) - 1; in ubifs_recover_master_node()
350 err = write_rcvrd_mst_node(c, c->mst_node); in ubifs_recover_master_node()
363 ubifs_err(c, "failed to recover master node"); in ubifs_recover_master_node()
365 ubifs_err(c, "dumping first master node"); in ubifs_recover_master_node()
366 ubifs_dump_node(c, mst1); in ubifs_recover_master_node()
369 ubifs_err(c, "dumping second master node"); in ubifs_recover_master_node()
370 ubifs_dump_node(c, mst2); in ubifs_recover_master_node()
386 int ubifs_write_rcvrd_mst_node(struct ubifs_info *c) in ubifs_write_rcvrd_mst_node() argument
390 if (!c->rcvrd_mst_node) in ubifs_write_rcvrd_mst_node()
392 c->rcvrd_mst_node->flags |= cpu_to_le32(UBIFS_MST_DIRTY); in ubifs_write_rcvrd_mst_node()
393 c->mst_node->flags |= cpu_to_le32(UBIFS_MST_DIRTY); in ubifs_write_rcvrd_mst_node()
394 err = write_rcvrd_mst_node(c, c->rcvrd_mst_node); in ubifs_write_rcvrd_mst_node()
397 kfree(c->rcvrd_mst_node); in ubifs_write_rcvrd_mst_node()
398 c->rcvrd_mst_node = NULL; in ubifs_write_rcvrd_mst_node()
413 static int is_last_write(const struct ubifs_info *c, void *buf, int offs) in is_last_write() argument
422 empty_offs = ALIGN(offs + 1, c->max_write_size); in is_last_write()
423 check_len = c->leb_size - empty_offs; in is_last_write()
440 static void clean_buf(const struct ubifs_info *c, void **buf, int lnum, in clean_buf() argument
449 empty_offs = ALIGN(*offs, c->min_io_size); in clean_buf()
451 ubifs_pad(c, *buf, pad_len); in clean_buf()
455 memset(*buf, 0xff, c->leb_size - empty_offs); in clean_buf()
470 static int no_more_nodes(const struct ubifs_info *c, void *buf, int len, in no_more_nodes() argument
477 skip = ALIGN(offs + UBIFS_CH_SZ, c->max_write_size) - offs; in no_more_nodes()
484 if (ubifs_check_node(c, buf, lnum, offs, 1, 0) != -EUCLEAN) { in no_more_nodes()
489 skip = ALIGN(offs + dlen, c->max_write_size) - offs; in no_more_nodes()
503 static int fix_unclean_leb(struct ubifs_info *c, struct ubifs_scan_leb *sleb, in fix_unclean_leb() argument
517 if (c->ro_mount && !c->remounting_rw) { in fix_unclean_leb()
528 list_add_tail(&ucleb->list, &c->unclean_leb_list); in fix_unclean_leb()
536 err = ubifs_leb_unmap(c, lnum); in fix_unclean_leb()
540 int len = ALIGN(endpt, c->min_io_size); in fix_unclean_leb()
543 err = ubifs_leb_read(c, lnum, sleb->buf, 0, in fix_unclean_leb()
555 ubifs_pad(c, buf, pad_len); in fix_unclean_leb()
558 err = ubifs_leb_change(c, lnum, sleb->buf, len); in fix_unclean_leb()
634 struct ubifs_scan_leb *ubifs_recover_leb(struct ubifs_info *c, int lnum, in ubifs_recover_leb() argument
637 int ret = 0, err, len = c->leb_size - offs, start = offs, min_io_unit; in ubifs_recover_leb()
638 int grouped = jhead == -1 ? 0 : c->jheads[jhead].grouped; in ubifs_recover_leb()
644 sleb = ubifs_start_scan(c, lnum, offs, sbuf); in ubifs_recover_leb()
659 ret = ubifs_scan_a_node(c, buf, len, lnum, offs, 1); in ubifs_recover_leb()
665 err = ubifs_add_snod(c, sleb, buf, offs); in ubifs_recover_leb()
685 ubifs_err(c, "unexpected return value %d", ret); in ubifs_recover_leb()
692 if (!is_last_write(c, buf, offs)) in ubifs_recover_leb()
695 if (!no_more_nodes(c, buf, len, lnum, offs)) in ubifs_recover_leb()
698 if (!is_last_write(c, buf, offs)) { in ubifs_recover_leb()
705 ubifs_err(c, "corrupt empty space LEB %d:%d, corruption starts at %d", in ubifs_recover_leb()
714 min_io_unit = round_down(offs, c->min_io_size); in ubifs_recover_leb()
778 len = c->leb_size - offs; in ubifs_recover_leb()
780 clean_buf(c, &buf, lnum, &offs, &len); in ubifs_recover_leb()
781 ubifs_end_scan(c, sleb, lnum, offs); in ubifs_recover_leb()
783 err = fix_unclean_leb(c, sleb, start); in ubifs_recover_leb()
791 ubifs_err(c, "corruption %d", ret); in ubifs_recover_leb()
792 ubifs_scan_a_node(c, buf, len, lnum, offs, 1); in ubifs_recover_leb()
794 ubifs_scanned_corruption(c, lnum, offs, buf); in ubifs_recover_leb()
797 ubifs_err(c, "LEB %d scanning failed", lnum); in ubifs_recover_leb()
811 static int get_cs_sqnum(struct ubifs_info *c, int lnum, int offs, in get_cs_sqnum() argument
821 if (c->leb_size - offs < UBIFS_CS_NODE_SZ) in get_cs_sqnum()
823 err = ubifs_leb_read(c, lnum, (void *)cs_node, offs, in get_cs_sqnum()
827 ret = ubifs_scan_a_node(c, cs_node, UBIFS_CS_NODE_SZ, lnum, offs, 0); in get_cs_sqnum()
829 ubifs_err(c, "Not a valid node"); in get_cs_sqnum()
833 ubifs_err(c, "Node a CS node, type is %d", cs_node->ch.node_type); in get_cs_sqnum()
836 if (le64_to_cpu(cs_node->cmt_no) != c->cmt_no) { in get_cs_sqnum()
837 ubifs_err(c, "CS node cmt_no %llu != current cmt_no %llu", in get_cs_sqnum()
839 c->cmt_no); in get_cs_sqnum()
850 ubifs_err(c, "failed to get CS sqnum"); in get_cs_sqnum()
868 struct ubifs_scan_leb *ubifs_recover_log_leb(struct ubifs_info *c, int lnum, in ubifs_recover_log_leb() argument
876 if (next_lnum >= UBIFS_LOG_LNUM + c->log_lebs) in ubifs_recover_log_leb()
878 if (next_lnum != c->ltail_lnum) { in ubifs_recover_log_leb()
883 sleb = ubifs_scan(c, next_lnum, 0, sbuf, 0); in ubifs_recover_log_leb()
888 unsigned long long cs_sqnum = c->cs_sqnum; in ubifs_recover_log_leb()
895 err = get_cs_sqnum(c, lnum, offs, &cs_sqnum); in ubifs_recover_log_leb()
902 ubifs_err(c, "unrecoverable log corruption in LEB %d", in ubifs_recover_log_leb()
910 return ubifs_recover_leb(c, lnum, offs, sbuf, -1); in ubifs_recover_log_leb()
924 static int recover_head(struct ubifs_info *c, int lnum, int offs, void *sbuf) in recover_head() argument
926 int len = c->max_write_size, err; in recover_head()
928 if (offs + len > c->leb_size) in recover_head()
929 len = c->leb_size - offs; in recover_head()
935 err = ubifs_leb_read(c, lnum, sbuf, offs, len, 1); in recover_head()
939 return ubifs_leb_unmap(c, lnum); in recover_head()
940 err = ubifs_leb_read(c, lnum, sbuf, 0, offs, 1); in recover_head()
943 return ubifs_leb_change(c, lnum, sbuf, offs); in recover_head()
966 int ubifs_recover_inl_heads(struct ubifs_info *c, void *sbuf) in ubifs_recover_inl_heads() argument
970 ubifs_assert(!c->ro_mount || c->remounting_rw); in ubifs_recover_inl_heads()
972 dbg_rcvry("checking index head at %d:%d", c->ihead_lnum, c->ihead_offs); in ubifs_recover_inl_heads()
973 err = recover_head(c, c->ihead_lnum, c->ihead_offs, sbuf); in ubifs_recover_inl_heads()
977 dbg_rcvry("checking LPT head at %d:%d", c->nhead_lnum, c->nhead_offs); in ubifs_recover_inl_heads()
979 return recover_head(c, c->nhead_lnum, c->nhead_offs, sbuf); in ubifs_recover_inl_heads()
994 static int clean_an_unclean_leb(struct ubifs_info *c, in clean_an_unclean_leb() argument
1004 return ubifs_leb_unmap(c, lnum); in clean_an_unclean_leb()
1007 err = ubifs_leb_read(c, lnum, buf, offs, len, 0); in clean_an_unclean_leb()
1017 ret = ubifs_scan_a_node(c, buf, len, lnum, offs, quiet); in clean_an_unclean_leb()
1040 ubifs_err(c, "unexpected empty space at %d:%d", in clean_an_unclean_leb()
1051 ubifs_scanned_corruption(c, lnum, offs, buf); in clean_an_unclean_leb()
1056 len = ALIGN(ucleb->endpt, c->min_io_size); in clean_an_unclean_leb()
1061 buf = c->sbuf + len - pad_len; in clean_an_unclean_leb()
1062 ubifs_pad(c, buf, pad_len); in clean_an_unclean_leb()
1067 err = ubifs_leb_change(c, lnum, sbuf, len); in clean_an_unclean_leb()
1087 int ubifs_clean_lebs(struct ubifs_info *c, void *sbuf) in ubifs_clean_lebs() argument
1090 while (!list_empty(&c->unclean_leb_list)) { in ubifs_clean_lebs()
1094 ucleb = list_entry(c->unclean_leb_list.next, in ubifs_clean_lebs()
1096 err = clean_an_unclean_leb(c, ucleb, sbuf); in ubifs_clean_lebs()
1113 static int grab_empty_leb(struct ubifs_info *c) in grab_empty_leb() argument
1132 lnum = ubifs_find_free_leb_for_idx(c); in grab_empty_leb()
1134 ubifs_err(c, "could not find an empty LEB"); in grab_empty_leb()
1135 ubifs_dump_lprops(c); in grab_empty_leb()
1136 ubifs_dump_budg(c, &c->bi); in grab_empty_leb()
1141 err = ubifs_change_one_lp(c, lnum, LPROPS_NC, LPROPS_NC, 0, in grab_empty_leb()
1146 c->gc_lnum = lnum; in grab_empty_leb()
1149 return ubifs_run_commit(c); in grab_empty_leb()
1170 int ubifs_rcvry_gc_commit(struct ubifs_info *c) in ubifs_rcvry_gc_commit() argument
1172 struct ubifs_wbuf *wbuf = &c->jheads[GCHD].wbuf; in ubifs_rcvry_gc_commit()
1178 c->gc_lnum = -1; in ubifs_rcvry_gc_commit()
1179 if (wbuf->lnum == -1 || wbuf->offs == c->leb_size) in ubifs_rcvry_gc_commit()
1180 return grab_empty_leb(c); in ubifs_rcvry_gc_commit()
1182 err = ubifs_find_dirty_leb(c, &lp, wbuf->offs, 2); in ubifs_rcvry_gc_commit()
1188 return grab_empty_leb(c); in ubifs_rcvry_gc_commit()
1199 err = ubifs_run_commit(c); in ubifs_rcvry_gc_commit()
1205 err = ubifs_garbage_collect_leb(c, &lp); in ubifs_rcvry_gc_commit()
1214 ubifs_err(c, "GC failed, error %d", err); in ubifs_rcvry_gc_commit()
1224 err = ubifs_leb_unmap(c, c->gc_lnum); in ubifs_rcvry_gc_commit()
1258 static int add_ino(struct ubifs_info *c, ino_t inum, loff_t i_size, in add_ino() argument
1261 struct rb_node **p = &c->size_tree.rb_node, *parent = NULL; in add_ino()
1283 rb_insert_color(&e->rb, &c->size_tree); in add_ino()
1293 static struct size_entry *find_ino(struct ubifs_info *c, ino_t inum) in find_ino() argument
1295 struct rb_node *p = c->size_tree.rb_node; in find_ino()
1315 static void remove_ino(struct ubifs_info *c, ino_t inum) in remove_ino() argument
1317 struct size_entry *e = find_ino(c, inum); in remove_ino()
1321 rb_erase(&e->rb, &c->size_tree); in remove_ino()
1329 void ubifs_destroy_size_tree(struct ubifs_info *c) in ubifs_destroy_size_tree() argument
1333 rbtree_postorder_for_each_entry_safe(e, n, &c->size_tree, rb) { in ubifs_destroy_size_tree()
1339 c->size_tree = RB_ROOT; in ubifs_destroy_size_tree()
1367 int ubifs_recover_size_accum(struct ubifs_info *c, union ubifs_key *key, in ubifs_recover_size_accum() argument
1370 ino_t inum = key_inum(c, key); in ubifs_recover_size_accum()
1374 switch (key_type(c, key)) { in ubifs_recover_size_accum()
1377 remove_ino(c, inum); in ubifs_recover_size_accum()
1379 e = find_ino(c, inum); in ubifs_recover_size_accum()
1384 err = add_ino(c, inum, new_size, 0, 1); in ubifs_recover_size_accum()
1391 e = find_ino(c, inum); in ubifs_recover_size_accum()
1396 err = add_ino(c, inum, 0, new_size, 0); in ubifs_recover_size_accum()
1402 e = find_ino(c, inum); in ubifs_recover_size_accum()
1415 static int fix_size_in_place(struct ubifs_info *c, struct size_entry *e) in fix_size_in_place() argument
1417 struct ubifs_ino_node *ino = c->sbuf; in fix_size_in_place()
1425 ino_key_init(c, &key, e->inum); in fix_size_in_place()
1426 err = ubifs_tnc_locate(c, &key, ino, &lnum, &offs); in fix_size_in_place()
1437 err = ubifs_leb_read(c, lnum, c->sbuf, 0, c->leb_size, 1); in fix_size_in_place()
1441 ino = c->sbuf + offs; in fix_size_in_place()
1447 p = c->sbuf; in fix_size_in_place()
1448 len = c->leb_size - 1; in fix_size_in_place()
1451 len = ALIGN(len + 1, c->min_io_size); in fix_size_in_place()
1453 err = ubifs_leb_change(c, lnum, c->sbuf, len); in fix_size_in_place()
1461 ubifs_warn(c, "inode %lu failed to fix size %lld -> %lld error %d", in fix_size_in_place()
1475 int ubifs_recover_size(struct ubifs_info *c) in ubifs_recover_size() argument
1477 struct rb_node *this = rb_first(&c->size_tree); in ubifs_recover_size()
1487 ino_key_init(c, &key, e->inum); in ubifs_recover_size()
1488 err = ubifs_tnc_lookup(c, &key, c->sbuf); in ubifs_recover_size()
1495 err = ubifs_tnc_remove_ino(c, e->inum); in ubifs_recover_size()
1499 struct ubifs_ino_node *ino = c->sbuf; in ubifs_recover_size()
1507 if (c->ro_mount) { in ubifs_recover_size()
1514 inode = ubifs_iget(c->vfs_sb, e->inum); in ubifs_recover_size()
1533 err = fix_size_in_place(c, e); in ubifs_recover_size()
1542 rb_erase(&e->rb, &c->size_tree); in ubifs_recover_size()