Lines Matching full:line
33 static int pblk_recov_l2p_from_emeta(struct pblk *pblk, struct pblk_line *line) in pblk_recov_l2p_from_emeta() argument
38 struct pblk_emeta *emeta = line->emeta; in pblk_recov_l2p_from_emeta()
49 data_start = pblk_line_smeta_start(pblk, line) + lm->smeta_sec; in pblk_recov_l2p_from_emeta()
50 data_end = line->emeta_ssec; in pblk_recov_l2p_from_emeta()
57 ppa = addr_to_gen_ppa(pblk, i, line->id); in pblk_recov_l2p_from_emeta()
61 if (test_bit(pos, line->blk_bitmap)) in pblk_recov_l2p_from_emeta()
65 spin_lock(&line->lock); in pblk_recov_l2p_from_emeta()
66 if (test_and_set_bit(i, line->invalid_bitmap)) in pblk_recov_l2p_from_emeta()
69 le32_add_cpu(line->vsc, -1); in pblk_recov_l2p_from_emeta()
70 spin_unlock(&line->lock); in pblk_recov_l2p_from_emeta()
80 pblk_err(pblk, "line %d - inconsistent lba list(%llu/%llu)\n", in pblk_recov_l2p_from_emeta()
81 line->id, nr_valid_lbas, nr_lbas); in pblk_recov_l2p_from_emeta()
83 line->left_msecs = 0; in pblk_recov_l2p_from_emeta()
88 static int pblk_calc_sec_in_line(struct pblk *pblk, struct pblk_line *line) in pblk_calc_sec_in_line() argument
93 int nr_bb = bitmap_weight(line->blk_bitmap, lm->blk_per_line); in pblk_calc_sec_in_line()
108 static int pblk_recov_read_oob(struct pblk *pblk, struct pblk_line *line, in pblk_recov_read_oob() argument
132 left_ppas = line->cur_sec - r_ptr; in pblk_recov_read_oob()
170 ppa = addr_to_gen_ppa(pblk, r_ptr_int, line->id); in pblk_recov_read_oob()
173 while (test_bit(pos, line->blk_bitmap)) { in pblk_recov_read_oob()
175 ppa = addr_to_gen_ppa(pblk, r_ptr_int, line->id); in pblk_recov_read_oob()
181 addr_to_gen_ppa(pblk, r_ptr_int, line->id); in pblk_recov_read_oob()
237 static int pblk_recov_pad_oob(struct pblk *pblk, struct pblk_line *line, in pblk_recov_pad_oob() argument
249 __le64 *lba_list = emeta_to_lbas(pblk, line->emeta->buf); in pblk_recov_pad_oob()
250 u64 w_ptr = line->cur_sec; in pblk_recov_pad_oob()
255 spin_lock(&line->lock); in pblk_recov_pad_oob()
256 left_line_ppas = line->left_msecs; in pblk_recov_pad_oob()
257 spin_unlock(&line->lock); in pblk_recov_pad_oob()
276 pblk_err(pblk, "corrupted pad line %d\n", line->id); in pblk_recov_pad_oob()
318 w_ptr = pblk_alloc_page(pblk, line, pblk->min_write_pgs); in pblk_recov_pad_oob()
319 ppa = addr_to_gen_ppa(pblk, w_ptr, line->id); in pblk_recov_pad_oob()
322 while (test_bit(pos, line->blk_bitmap)) { in pblk_recov_pad_oob()
324 ppa = addr_to_gen_ppa(pblk, w_ptr, line->id); in pblk_recov_pad_oob()
332 dev_ppa = addr_to_gen_ppa(pblk, w_ptr, line->id); in pblk_recov_pad_oob()
363 if (!pblk_line_is_full(line)) in pblk_recov_pad_oob()
364 pblk_err(pblk, "corrupted padded line: %d\n", line->id); in pblk_recov_pad_oob()
386 static int pblk_recov_scan_all_oob(struct pblk *pblk, struct pblk_line *line, in pblk_recov_scan_all_oob() argument
402 int left_ppas = pblk_calc_sec_in_line(pblk, line) - line->cur_sec; in pblk_recov_scan_all_oob()
411 /* we could recover up until the line write pointer */ in pblk_recov_scan_all_oob()
412 r_ptr = line->cur_sec; in pblk_recov_scan_all_oob()
447 w_ptr = pblk_alloc_page(pblk, line, pblk->min_write_pgs); in pblk_recov_scan_all_oob()
448 ppa = addr_to_gen_ppa(pblk, w_ptr, line->id); in pblk_recov_scan_all_oob()
451 while (test_bit(pos, line->blk_bitmap)) { in pblk_recov_scan_all_oob()
453 ppa = addr_to_gen_ppa(pblk, w_ptr, line->id); in pblk_recov_scan_all_oob()
459 addr_to_gen_ppa(pblk, w_ptr, line->id); in pblk_recov_scan_all_oob()
485 /* Reached the end of the written line */ in pblk_recov_scan_all_oob()
494 line->cur_sec -= nr_error_bits; in pblk_recov_scan_all_oob()
495 line->left_msecs += nr_error_bits; in pblk_recov_scan_all_oob()
496 bitmap_clear(line->map_bitmap, line->cur_sec, nr_error_bits); in pblk_recov_scan_all_oob()
499 if (pad_secs > line->left_msecs) in pblk_recov_scan_all_oob()
500 pad_secs = line->left_msecs; in pblk_recov_scan_all_oob()
502 ret = pblk_recov_pad_oob(pblk, line, pad_secs); in pblk_recov_scan_all_oob()
506 ret = pblk_recov_read_oob(pblk, line, p, r_ptr); in pblk_recov_scan_all_oob()
520 static int pblk_recov_scan_oob(struct pblk *pblk, struct pblk_line *line, in pblk_recov_scan_oob() argument
535 int left_ppas = pblk_calc_sec_in_line(pblk, line); in pblk_recov_scan_oob()
578 paddr = pblk_alloc_page(pblk, line, pblk->min_write_pgs); in pblk_recov_scan_oob()
579 ppa = addr_to_gen_ppa(pblk, paddr, line->id); in pblk_recov_scan_oob()
582 while (test_bit(pos, line->blk_bitmap)) { in pblk_recov_scan_oob()
584 ppa = addr_to_gen_ppa(pblk, paddr, line->id); in pblk_recov_scan_oob()
590 addr_to_gen_ppa(pblk, paddr, line->id); in pblk_recov_scan_oob()
602 /* Reached the end of the written line */ in pblk_recov_scan_oob()
610 line->cur_sec -= nr_error_bits; in pblk_recov_scan_oob()
611 line->left_msecs += nr_error_bits; in pblk_recov_scan_oob()
612 bitmap_clear(line->map_bitmap, line->cur_sec, nr_error_bits); in pblk_recov_scan_oob()
637 /* Scan line for lbas on out of bound area */
638 static int pblk_recov_l2p_from_oob(struct pblk *pblk, struct pblk_line *line) in pblk_recov_l2p_from_oob() argument
672 ret = pblk_recov_scan_oob(pblk, line, p, &done); in pblk_recov_l2p_from_oob()
679 ret = pblk_recov_scan_all_oob(pblk, line, p); in pblk_recov_l2p_from_oob()
686 if (pblk_line_is_full(line)) in pblk_recov_l2p_from_oob()
687 pblk_line_recov_close(pblk, line); in pblk_recov_l2p_from_oob()
699 struct pblk_line *line) in pblk_recov_line_add_ordered() argument
704 if (t->seq_nr > line->seq_nr) in pblk_recov_line_add_ordered()
707 __list_add(&line->list, t->list.prev, &t->list); in pblk_recov_line_add_ordered()
710 static u64 pblk_line_emeta_start(struct pblk *pblk, struct pblk_line *line) in pblk_line_emeta_start() argument
725 ppa = addr_to_gen_ppa(pblk, emeta_start, line->id); in pblk_line_emeta_start()
727 if (!test_bit(pos, line->blk_bitmap)) in pblk_line_emeta_start()
740 pblk_err(pblk, "line major version mismatch: %d, expected: %d\n", in pblk_recov_check_line_version()
747 pblk_info(pblk, "newer line minor version found: %d\n", in pblk_recov_check_line_version()
777 static int pblk_line_was_written(struct pblk_line *line, in pblk_line_was_written() argument
788 if (line->state == PBLK_LINESTATE_BAD) in pblk_line_was_written()
791 smeta_blk = find_first_zero_bit(line->blk_bitmap, lm->blk_per_line); in pblk_line_was_written()
796 chunk = &line->chks[pblk_ppa_to_pos(geo, bppa)]; in pblk_line_was_written()
808 struct pblk_line *line, *tline, *data_line = NULL; in pblk_recov_l2p() local
833 line = &pblk->lines[i]; in pblk_recov_l2p()
836 line->smeta = smeta; in pblk_recov_l2p()
837 line->lun_bitmap = ((void *)(smeta_buf)) + in pblk_recov_l2p()
840 if (!pblk_line_was_written(line, pblk)) in pblk_recov_l2p()
844 if (pblk_line_read_smeta(pblk, line)) in pblk_recov_l2p()
855 pblk_err(pblk, "found incompatible line version %u\n", in pblk_recov_l2p()
867 pblk_debug(pblk, "ignore line %u due to uuid mismatch\n", in pblk_recov_l2p()
872 /* Update line metadata */ in pblk_recov_l2p()
873 spin_lock(&line->lock); in pblk_recov_l2p()
874 line->id = le32_to_cpu(smeta_buf->header.id); in pblk_recov_l2p()
875 line->type = le16_to_cpu(smeta_buf->header.type); in pblk_recov_l2p()
876 line->seq_nr = le64_to_cpu(smeta_buf->seq_nr); in pblk_recov_l2p()
877 spin_unlock(&line->lock); in pblk_recov_l2p()
881 if (line->seq_nr >= l_mg->d_seq_nr) in pblk_recov_l2p()
882 l_mg->d_seq_nr = line->seq_nr + 1; in pblk_recov_l2p()
886 if (pblk_line_recov_alloc(pblk, line)) in pblk_recov_l2p()
889 pblk_recov_line_add_ordered(&recov_list, line); in pblk_recov_l2p()
891 pblk_debug(pblk, "recovering data line %d, seq:%llu\n", in pblk_recov_l2p()
892 line->id, smeta_buf->seq_nr); in pblk_recov_l2p()
907 list_for_each_entry_safe(line, tline, &recov_list, list) { in pblk_recov_l2p()
910 line->emeta_ssec = pblk_line_emeta_start(pblk, line); in pblk_recov_l2p()
911 line->emeta = emeta; in pblk_recov_l2p()
912 memset(line->emeta->buf, 0, lm->emeta_len[0]); in pblk_recov_l2p()
914 if (pblk_line_read_emeta(pblk, line, line->emeta->buf)) { in pblk_recov_l2p()
915 pblk_recov_l2p_from_oob(pblk, line); in pblk_recov_l2p()
919 if (pblk_recov_check_emeta(pblk, line->emeta->buf)) { in pblk_recov_l2p()
920 pblk_recov_l2p_from_oob(pblk, line); in pblk_recov_l2p()
924 if (pblk_recov_check_line_version(pblk, line->emeta->buf)) in pblk_recov_l2p()
927 pblk_recov_wa_counters(pblk, line->emeta->buf); in pblk_recov_l2p()
929 if (pblk_recov_l2p_from_emeta(pblk, line)) in pblk_recov_l2p()
930 pblk_recov_l2p_from_oob(pblk, line); in pblk_recov_l2p()
933 if (pblk_line_is_full(line)) { in pblk_recov_l2p()
936 spin_lock(&line->lock); in pblk_recov_l2p()
937 line->state = PBLK_LINESTATE_CLOSED; in pblk_recov_l2p()
938 move_list = pblk_line_gc_list(pblk, line); in pblk_recov_l2p()
939 spin_unlock(&line->lock); in pblk_recov_l2p()
942 list_move_tail(&line->list, move_list); in pblk_recov_l2p()
945 kfree(line->map_bitmap); in pblk_recov_l2p()
946 line->map_bitmap = NULL; in pblk_recov_l2p()
947 line->smeta = NULL; in pblk_recov_l2p()
948 line->emeta = NULL; in pblk_recov_l2p()
954 line->meta_line = meta_line; in pblk_recov_l2p()
955 data_line = line; in pblk_recov_l2p()
967 /* Allocate next line for preparation */ in pblk_recov_l2p()
989 * Pad current line
993 struct pblk_line *line; in pblk_recov_pad() local
999 line = l_mg->data_line; in pblk_recov_pad()
1000 left_msecs = line->left_msecs; in pblk_recov_pad()
1003 ret = pblk_recov_pad_oob(pblk, line, left_msecs); in pblk_recov_pad()
1009 pblk_line_close_meta(pblk, line); in pblk_recov_pad()