Lines Matching refs:c
104 static int get_master_node(const struct ubifs_info *c, int lnum, void **pbuf, in get_master_node() argument
107 const int sz = c->mst_node_alsz; in get_master_node()
111 sbuf = vmalloc(c->leb_size); in get_master_node()
115 err = ubifs_leb_read(c, lnum, sbuf, 0, c->leb_size, 0); in get_master_node()
122 len = c->leb_size; in get_master_node()
123 while (offs + UBIFS_MST_NODE_SZ <= c->leb_size) { in get_master_node()
139 ret = ubifs_scan_a_node(c, buf, len, lnum, offs, 1); in get_master_node()
145 ret = ubifs_scan_a_node(c, buf, len, lnum, offs, 1); in get_master_node()
167 if (offs < c->leb_size) { in get_master_node()
177 if (offs < c->leb_size) in get_master_node()
199 static int write_rcvrd_mst_node(struct ubifs_info *c, in write_rcvrd_mst_node() argument
202 int err = 0, lnum = UBIFS_MST_LNUM, sz = c->mst_node_alsz; in write_rcvrd_mst_node()
210 ubifs_prepare_node(c, mst, UBIFS_MST_NODE_SZ, 1); in write_rcvrd_mst_node()
211 err = ubifs_leb_change(c, lnum, mst, sz); in write_rcvrd_mst_node()
214 err = ubifs_leb_change(c, lnum + 1, mst, sz); in write_rcvrd_mst_node()
231 int ubifs_recover_master_node(struct ubifs_info *c) in ubifs_recover_master_node() argument
235 const int sz = c->mst_node_alsz; in ubifs_recover_master_node()
240 err = get_master_node(c, UBIFS_MST_LNUM, &buf1, &mst1, &cor1); in ubifs_recover_master_node()
244 err = get_master_node(c, UBIFS_MST_LNUM + 1, &buf2, &mst2, &cor2); in ubifs_recover_master_node()
273 c->leb_size - offs2 - sz < sz) { in ubifs_recover_master_node()
298 if (offs2 + sz + sz <= c->leb_size) in ubifs_recover_master_node()
303 ubifs_msg(c, "recovered master node from LEB %d", in ubifs_recover_master_node()
306 memcpy(c->mst_node, mst, UBIFS_MST_NODE_SZ); in ubifs_recover_master_node()
308 if (c->ro_mount) { in ubifs_recover_master_node()
310 c->rcvrd_mst_node = kmalloc(sz, GFP_KERNEL); in ubifs_recover_master_node()
311 if (!c->rcvrd_mst_node) { in ubifs_recover_master_node()
315 memcpy(c->rcvrd_mst_node, c->mst_node, UBIFS_MST_NODE_SZ); in ubifs_recover_master_node()
341 c->mst_node->flags |= cpu_to_le32(UBIFS_MST_DIRTY); in ubifs_recover_master_node()
345 c->max_sqnum = le64_to_cpu(mst->ch.sqnum) - 1; in ubifs_recover_master_node()
346 err = write_rcvrd_mst_node(c, c->mst_node); in ubifs_recover_master_node()
360 ubifs_err(c, "failed to recover master node"); in ubifs_recover_master_node()
362 ubifs_err(c, "dumping first master node"); in ubifs_recover_master_node()
363 ubifs_dump_node(c, mst1); in ubifs_recover_master_node()
366 ubifs_err(c, "dumping second master node"); in ubifs_recover_master_node()
367 ubifs_dump_node(c, mst2); in ubifs_recover_master_node()
383 int ubifs_write_rcvrd_mst_node(struct ubifs_info *c) in ubifs_write_rcvrd_mst_node() argument
387 if (!c->rcvrd_mst_node) in ubifs_write_rcvrd_mst_node()
389 c->rcvrd_mst_node->flags |= cpu_to_le32(UBIFS_MST_DIRTY); in ubifs_write_rcvrd_mst_node()
390 c->mst_node->flags |= cpu_to_le32(UBIFS_MST_DIRTY); in ubifs_write_rcvrd_mst_node()
391 err = write_rcvrd_mst_node(c, c->rcvrd_mst_node); in ubifs_write_rcvrd_mst_node()
394 kfree(c->rcvrd_mst_node); in ubifs_write_rcvrd_mst_node()
395 c->rcvrd_mst_node = NULL; in ubifs_write_rcvrd_mst_node()
410 static int is_last_write(const struct ubifs_info *c, void *buf, int offs) in is_last_write() argument
419 empty_offs = ALIGN(offs + 1, c->max_write_size); in is_last_write()
420 check_len = c->leb_size - empty_offs; in is_last_write()
437 static void clean_buf(const struct ubifs_info *c, void **buf, int lnum, in clean_buf() argument
446 empty_offs = ALIGN(*offs, c->min_io_size); in clean_buf()
448 ubifs_pad(c, *buf, pad_len); in clean_buf()
452 memset(*buf, 0xff, c->leb_size - empty_offs); in clean_buf()
467 static int no_more_nodes(const struct ubifs_info *c, void *buf, int len, in no_more_nodes() argument
474 skip = ALIGN(offs + UBIFS_CH_SZ, c->max_write_size) - offs; in no_more_nodes()
481 if (ubifs_check_node(c, buf, lnum, offs, 1, 0) != -EUCLEAN) { in no_more_nodes()
486 skip = ALIGN(offs + dlen, c->max_write_size) - offs; in no_more_nodes()
500 static int fix_unclean_leb(struct ubifs_info *c, struct ubifs_scan_leb *sleb, in fix_unclean_leb() argument
514 if (c->ro_mount && !c->remounting_rw) { in fix_unclean_leb()
525 list_add_tail(&ucleb->list, &c->unclean_leb_list); in fix_unclean_leb()
534 err = ubifs_leb_unmap(c, lnum); in fix_unclean_leb()
538 int len = ALIGN(endpt, c->min_io_size); in fix_unclean_leb()
541 err = ubifs_leb_read(c, lnum, sleb->buf, 0, in fix_unclean_leb()
553 ubifs_pad(c, buf, pad_len); in fix_unclean_leb()
556 err = ubifs_leb_change(c, lnum, sleb->buf, len); in fix_unclean_leb()
633 struct ubifs_scan_leb *ubifs_recover_leb(struct ubifs_info *c, int lnum, in ubifs_recover_leb() argument
636 int ret = 0, err, len = c->leb_size - offs, start = offs, min_io_unit; in ubifs_recover_leb()
637 int grouped = jhead == -1 ? 0 : c->jheads[jhead].grouped; in ubifs_recover_leb()
643 sleb = ubifs_start_scan(c, lnum, offs, sbuf); in ubifs_recover_leb()
658 ret = ubifs_scan_a_node(c, buf, len, lnum, offs, 1); in ubifs_recover_leb()
664 err = ubifs_add_snod(c, sleb, buf, offs); in ubifs_recover_leb()
684 ubifs_err(c, "unexpected return value %d", ret); in ubifs_recover_leb()
691 if (!is_last_write(c, buf, offs)) in ubifs_recover_leb()
694 if (!no_more_nodes(c, buf, len, lnum, offs)) in ubifs_recover_leb()
697 if (!is_last_write(c, buf, offs)) { in ubifs_recover_leb()
704 ubifs_err(c, "corrupt empty space LEB %d:%d, corruption starts at %d", in ubifs_recover_leb()
713 min_io_unit = round_down(offs, c->min_io_size); in ubifs_recover_leb()
777 len = c->leb_size - offs; in ubifs_recover_leb()
779 clean_buf(c, &buf, lnum, &offs, &len); in ubifs_recover_leb()
780 ubifs_end_scan(c, sleb, lnum, offs); in ubifs_recover_leb()
782 err = fix_unclean_leb(c, sleb, start); in ubifs_recover_leb()
790 ubifs_err(c, "corruption %d", ret); in ubifs_recover_leb()
791 ubifs_scan_a_node(c, buf, len, lnum, offs, 1); in ubifs_recover_leb()
793 ubifs_scanned_corruption(c, lnum, offs, buf); in ubifs_recover_leb()
796 ubifs_err(c, "LEB %d scanning failed", lnum); in ubifs_recover_leb()
810 static int get_cs_sqnum(struct ubifs_info *c, int lnum, int offs, in get_cs_sqnum() argument
820 if (c->leb_size - offs < UBIFS_CS_NODE_SZ) in get_cs_sqnum()
822 err = ubifs_leb_read(c, lnum, (void *)cs_node, offs, in get_cs_sqnum()
826 ret = ubifs_scan_a_node(c, cs_node, UBIFS_CS_NODE_SZ, lnum, offs, 0); in get_cs_sqnum()
828 ubifs_err(c, "Not a valid node"); in get_cs_sqnum()
832 ubifs_err(c, "Node a CS node, type is %d", cs_node->ch.node_type); in get_cs_sqnum()
835 if (le64_to_cpu(cs_node->cmt_no) != c->cmt_no) { in get_cs_sqnum()
836 ubifs_err(c, "CS node cmt_no %llu != current cmt_no %llu", in get_cs_sqnum()
838 c->cmt_no); in get_cs_sqnum()
849 ubifs_err(c, "failed to get CS sqnum"); in get_cs_sqnum()
867 struct ubifs_scan_leb *ubifs_recover_log_leb(struct ubifs_info *c, int lnum, in ubifs_recover_log_leb() argument
875 if (next_lnum >= UBIFS_LOG_LNUM + c->log_lebs) in ubifs_recover_log_leb()
877 if (next_lnum != c->ltail_lnum) { in ubifs_recover_log_leb()
882 sleb = ubifs_scan(c, next_lnum, 0, sbuf, 0); in ubifs_recover_log_leb()
887 unsigned long long cs_sqnum = c->cs_sqnum; in ubifs_recover_log_leb()
894 err = get_cs_sqnum(c, lnum, offs, &cs_sqnum); in ubifs_recover_log_leb()
901 ubifs_err(c, "unrecoverable log corruption in LEB %d", in ubifs_recover_log_leb()
909 return ubifs_recover_leb(c, lnum, offs, sbuf, -1); in ubifs_recover_log_leb()
923 static int recover_head(struct ubifs_info *c, int lnum, int offs, void *sbuf) in recover_head() argument
925 int len = c->max_write_size, err; in recover_head()
927 if (offs + len > c->leb_size) in recover_head()
928 len = c->leb_size - offs; in recover_head()
934 err = ubifs_leb_read(c, lnum, sbuf, offs, len, 1); in recover_head()
938 return ubifs_leb_unmap(c, lnum); in recover_head()
939 err = ubifs_leb_read(c, lnum, sbuf, 0, offs, 1); in recover_head()
942 return ubifs_leb_change(c, lnum, sbuf, offs); in recover_head()
965 int ubifs_recover_inl_heads(struct ubifs_info *c, void *sbuf) in ubifs_recover_inl_heads() argument
969 ubifs_assert(!c->ro_mount || c->remounting_rw); in ubifs_recover_inl_heads()
971 dbg_rcvry("checking index head at %d:%d", c->ihead_lnum, c->ihead_offs); in ubifs_recover_inl_heads()
972 err = recover_head(c, c->ihead_lnum, c->ihead_offs, sbuf); in ubifs_recover_inl_heads()
976 dbg_rcvry("checking LPT head at %d:%d", c->nhead_lnum, c->nhead_offs); in ubifs_recover_inl_heads()
978 return recover_head(c, c->nhead_lnum, c->nhead_offs, sbuf); in ubifs_recover_inl_heads()
993 static int clean_an_unclean_leb(struct ubifs_info *c, in clean_an_unclean_leb() argument
1003 return ubifs_leb_unmap(c, lnum); in clean_an_unclean_leb()
1006 err = ubifs_leb_read(c, lnum, buf, offs, len, 0); in clean_an_unclean_leb()
1016 ret = ubifs_scan_a_node(c, buf, len, lnum, offs, quiet); in clean_an_unclean_leb()
1039 ubifs_err(c, "unexpected empty space at %d:%d", in clean_an_unclean_leb()
1050 ubifs_scanned_corruption(c, lnum, offs, buf); in clean_an_unclean_leb()
1055 len = ALIGN(ucleb->endpt, c->min_io_size); in clean_an_unclean_leb()
1060 buf = c->sbuf + len - pad_len; in clean_an_unclean_leb()
1061 ubifs_pad(c, buf, pad_len); in clean_an_unclean_leb()
1066 err = ubifs_leb_change(c, lnum, sbuf, len); in clean_an_unclean_leb()
1086 int ubifs_clean_lebs(struct ubifs_info *c, void *sbuf) in ubifs_clean_lebs() argument
1089 while (!list_empty(&c->unclean_leb_list)) { in ubifs_clean_lebs()
1093 ucleb = list_entry(c->unclean_leb_list.next, in ubifs_clean_lebs()
1095 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()
1232 int ubifs_rcvry_gc_commit(struct ubifs_info *c) in ubifs_rcvry_gc_commit() argument
1264 static int add_ino(struct ubifs_info *c, ino_t inum, loff_t i_size, in add_ino() argument
1267 struct rb_node **p = &c->size_tree.rb_node, *parent = NULL; in add_ino()
1289 rb_insert_color(&e->rb, &c->size_tree); in add_ino()
1299 static struct size_entry *find_ino(struct ubifs_info *c, ino_t inum) in find_ino() argument
1301 struct rb_node *p = c->size_tree.rb_node; in find_ino()
1321 static void remove_ino(struct ubifs_info *c, ino_t inum) in remove_ino() argument
1323 struct size_entry *e = find_ino(c, inum); in remove_ino()
1327 rb_erase(&e->rb, &c->size_tree); in remove_ino()
1335 void ubifs_destroy_size_tree(struct ubifs_info *c) in ubifs_destroy_size_tree() argument
1339 rbtree_postorder_for_each_entry_safe(e, n, &c->size_tree, rb) { in ubifs_destroy_size_tree()
1345 c->size_tree = RB_ROOT; in ubifs_destroy_size_tree()
1373 int ubifs_recover_size_accum(struct ubifs_info *c, union ubifs_key *key, in ubifs_recover_size_accum() argument
1376 ino_t inum = key_inum(c, key); in ubifs_recover_size_accum()
1380 switch (key_type(c, key)) { in ubifs_recover_size_accum()
1383 remove_ino(c, inum); in ubifs_recover_size_accum()
1385 e = find_ino(c, inum); in ubifs_recover_size_accum()
1390 err = add_ino(c, inum, new_size, 0, 1); in ubifs_recover_size_accum()
1397 e = find_ino(c, inum); in ubifs_recover_size_accum()
1402 err = add_ino(c, inum, 0, new_size, 0); in ubifs_recover_size_accum()
1408 e = find_ino(c, inum); in ubifs_recover_size_accum()
1422 static int fix_size_in_place(struct ubifs_info *c, struct size_entry *e) in fix_size_in_place() argument
1424 struct ubifs_ino_node *ino = c->sbuf; in fix_size_in_place()
1432 ino_key_init(c, &key, e->inum); in fix_size_in_place()
1433 err = ubifs_tnc_locate(c, &key, ino, &lnum, &offs); in fix_size_in_place()
1444 err = ubifs_leb_read(c, lnum, c->sbuf, 0, c->leb_size, 1); in fix_size_in_place()
1448 ino = c->sbuf + offs; in fix_size_in_place()
1454 p = c->sbuf; in fix_size_in_place()
1455 len = c->leb_size - 1; in fix_size_in_place()
1458 len = ALIGN(len + 1, c->min_io_size); in fix_size_in_place()
1460 err = ubifs_leb_change(c, lnum, c->sbuf, len); in fix_size_in_place()
1468 ubifs_warn(c, "inode %lu failed to fix size %lld -> %lld error %d", in fix_size_in_place()
1483 int ubifs_recover_size(struct ubifs_info *c) in ubifs_recover_size() argument
1485 struct rb_node *this = rb_first(&c->size_tree); in ubifs_recover_size()
1495 ino_key_init(c, &key, e->inum); in ubifs_recover_size()
1496 err = ubifs_tnc_lookup(c, &key, c->sbuf); in ubifs_recover_size()
1503 err = ubifs_tnc_remove_ino(c, e->inum); in ubifs_recover_size()
1507 struct ubifs_ino_node *ino = c->sbuf; in ubifs_recover_size()
1515 if (c->ro_mount) { in ubifs_recover_size()
1522 inode = ubifs_iget(c->vfs_sb, e->inum); in ubifs_recover_size()
1542 err = fix_size_in_place(c, e); in ubifs_recover_size()
1552 rb_erase(&e->rb, &c->size_tree); in ubifs_recover_size()