Lines Matching refs:line
38 static int pblk_recov_l2p_from_emeta(struct pblk *pblk, struct pblk_line *line) in pblk_recov_l2p_from_emeta() argument
43 struct pblk_emeta *emeta = line->emeta; in pblk_recov_l2p_from_emeta()
54 data_start = pblk_line_smeta_start(pblk, line) + lm->smeta_sec; in pblk_recov_l2p_from_emeta()
55 data_end = line->emeta_ssec; in pblk_recov_l2p_from_emeta()
62 ppa = addr_to_gen_ppa(pblk, i, line->id); in pblk_recov_l2p_from_emeta()
66 if (test_bit(pos, line->blk_bitmap)) in pblk_recov_l2p_from_emeta()
70 spin_lock(&line->lock); in pblk_recov_l2p_from_emeta()
71 if (test_and_set_bit(i, line->invalid_bitmap)) in pblk_recov_l2p_from_emeta()
74 le32_add_cpu(line->vsc, -1); in pblk_recov_l2p_from_emeta()
75 spin_unlock(&line->lock); in pblk_recov_l2p_from_emeta()
86 line->id, nr_valid_lbas, nr_lbas); in pblk_recov_l2p_from_emeta()
88 line->left_msecs = 0; in pblk_recov_l2p_from_emeta()
93 static void pblk_update_line_wp(struct pblk *pblk, struct pblk_line *line, in pblk_update_line_wp() argument
100 __pblk_alloc_page(pblk, line, pblk->min_write_pgs); in pblk_update_line_wp()
103 if (written_secs > line->left_msecs) { in pblk_update_line_wp()
108 line->left_msecs = 0; in pblk_update_line_wp()
111 line->left_msecs -= written_secs; in pblk_update_line_wp()
116 static u64 pblk_sec_in_open_line(struct pblk *pblk, struct pblk_line *line) in pblk_sec_in_open_line() argument
119 int nr_bb = bitmap_weight(line->blk_bitmap, lm->blk_per_line); in pblk_sec_in_open_line()
125 struct nvm_chk_meta *chunk = &line->chks[i]; in pblk_sec_in_open_line()
135 pblk_err(pblk, "recovery line %d is bad\n", line->id); in pblk_sec_in_open_line()
137 pblk_update_line_wp(pblk, line, written_secs - lm->smeta_sec); in pblk_sec_in_open_line()
173 static int pblk_recov_pad_line(struct pblk *pblk, struct pblk_line *line, in pblk_recov_pad_line() argument
183 __le64 *lba_list = emeta_to_lbas(pblk, line->emeta->buf); in pblk_recov_pad_line()
184 u64 w_ptr = line->cur_sec; in pblk_recov_pad_line()
189 spin_lock(&line->lock); in pblk_recov_pad_line()
190 left_line_ppas = line->left_msecs; in pblk_recov_pad_line()
191 spin_unlock(&line->lock); in pblk_recov_pad_line()
210 pblk_err(pblk, "corrupted pad line %d\n", line->id); in pblk_recov_pad_line()
236 w_ptr = pblk_alloc_page(pblk, line, pblk->min_write_pgs); in pblk_recov_pad_line()
237 ppa = addr_to_gen_ppa(pblk, w_ptr, line->id); in pblk_recov_pad_line()
240 while (test_bit(pos, line->blk_bitmap)) { in pblk_recov_pad_line()
242 ppa = addr_to_gen_ppa(pblk, w_ptr, line->id); in pblk_recov_pad_line()
251 dev_ppa = addr_to_gen_ppa(pblk, w_ptr, line->id); in pblk_recov_pad_line()
282 if (!pblk_line_is_full(line)) in pblk_recov_pad_line()
283 pblk_err(pblk, "corrupted padded line: %d\n", line->id); in pblk_recov_pad_line()
291 static int pblk_pad_distance(struct pblk *pblk, struct pblk_line *line) in pblk_pad_distance() argument
297 return (distance > line->left_msecs) ? line->left_msecs : distance; in pblk_pad_distance()
302 struct pblk_line *line, in pblk_get_stripe_chunk() argument
315 return &line->chks[pos]; in pblk_get_stripe_chunk()
319 struct pblk_line *line) in pblk_line_wps_are_unbalanced() argument
327 i = find_first_zero_bit(line->blk_bitmap, blk_in_line); in pblk_line_wps_are_unbalanced()
335 chunk = pblk_get_stripe_chunk(pblk, line, i); in pblk_line_wps_are_unbalanced()
342 i = find_next_zero_bit(line->blk_bitmap, blk_in_line, i + 1); in pblk_line_wps_are_unbalanced()
344 chunk = pblk_get_stripe_chunk(pblk, line, i); in pblk_line_wps_are_unbalanced()
348 i = find_next_zero_bit(line->blk_bitmap, blk_in_line, i + 1); in pblk_line_wps_are_unbalanced()
354 static int pblk_recov_scan_oob(struct pblk *pblk, struct pblk_line *line, in pblk_recov_scan_oob() argument
366 u64 paddr = pblk_line_smeta_start(pblk, line) + lm->smeta_sec; in pblk_recov_scan_oob()
371 u64 left_ppas = pblk_sec_in_open_line(pblk, line) - lm->smeta_sec; in pblk_recov_scan_oob()
373 if (pblk_line_wps_are_unbalanced(pblk, line)) in pblk_recov_scan_oob()
374 pblk_warn(pblk, "recovering unbalanced line (%d)\n", line->id); in pblk_recov_scan_oob()
383 lba_list = emeta_to_lbas(pblk, line->emeta->buf); in pblk_recov_scan_oob()
409 ppa = addr_to_gen_ppa(pblk, paddr, line->id); in pblk_recov_scan_oob()
412 while (test_bit(pos, line->blk_bitmap)) { in pblk_recov_scan_oob()
414 ppa = addr_to_gen_ppa(pblk, paddr, line->id); in pblk_recov_scan_oob()
420 addr_to_gen_ppa(pblk, paddr + j, line->id); in pblk_recov_scan_oob()
440 pad_distance = pblk_pad_distance(pblk, line); in pblk_recov_scan_oob()
441 ret = pblk_recov_pad_line(pblk, line, pad_distance); in pblk_recov_scan_oob()
461 line->nr_valid_lbas++; in pblk_recov_scan_oob()
470 WARN_ON(padded && !pblk_line_is_full(line)); in pblk_recov_scan_oob()
477 static int pblk_recov_l2p_from_oob(struct pblk *pblk, struct pblk_line *line) in pblk_recov_l2p_from_oob() argument
512 ret = pblk_recov_scan_oob(pblk, line, p); in pblk_recov_l2p_from_oob()
518 if (pblk_line_is_full(line)) in pblk_recov_l2p_from_oob()
519 pblk_line_recov_close(pblk, line); in pblk_recov_l2p_from_oob()
532 struct pblk_line *line) in pblk_recov_line_add_ordered() argument
537 if (t->seq_nr > line->seq_nr) in pblk_recov_line_add_ordered()
540 __list_add(&line->list, t->list.prev, &t->list); in pblk_recov_line_add_ordered()
543 static u64 pblk_line_emeta_start(struct pblk *pblk, struct pblk_line *line) in pblk_line_emeta_start() argument
558 ppa = addr_to_gen_ppa(pblk, emeta_start, line->id); in pblk_line_emeta_start()
560 if (!test_bit(pos, line->blk_bitmap)) in pblk_line_emeta_start()
610 static int pblk_line_was_written(struct pblk_line *line, in pblk_line_was_written() argument
621 if (line->state == PBLK_LINESTATE_BAD) in pblk_line_was_written()
624 smeta_blk = find_first_zero_bit(line->blk_bitmap, lm->blk_per_line); in pblk_line_was_written()
629 chunk = &line->chks[pblk_ppa_to_pos(geo, bppa)]; in pblk_line_was_written()
639 static bool pblk_line_is_open(struct pblk *pblk, struct pblk_line *line) in pblk_line_is_open() argument
645 if (line->chks[i].state & NVM_CHK_ST_OPEN) in pblk_line_is_open()
655 struct pblk_line *line, *tline, *data_line = NULL; in pblk_recov_l2p() local
680 line = &pblk->lines[i]; in pblk_recov_l2p()
683 line->smeta = smeta; in pblk_recov_l2p()
684 line->lun_bitmap = ((void *)(smeta_buf)) + in pblk_recov_l2p()
687 if (!pblk_line_was_written(line, pblk)) in pblk_recov_l2p()
691 if (pblk_line_smeta_read(pblk, line)) in pblk_recov_l2p()
722 spin_lock(&line->lock); in pblk_recov_l2p()
723 line->id = le32_to_cpu(smeta_buf->header.id); in pblk_recov_l2p()
724 line->type = le16_to_cpu(smeta_buf->header.type); in pblk_recov_l2p()
725 line->seq_nr = le64_to_cpu(smeta_buf->seq_nr); in pblk_recov_l2p()
726 spin_unlock(&line->lock); in pblk_recov_l2p()
730 if (line->seq_nr >= l_mg->d_seq_nr) in pblk_recov_l2p()
731 l_mg->d_seq_nr = line->seq_nr + 1; in pblk_recov_l2p()
735 if (pblk_line_recov_alloc(pblk, line)) in pblk_recov_l2p()
738 pblk_recov_line_add_ordered(&recov_list, line); in pblk_recov_l2p()
741 line->id, smeta_buf->seq_nr); in pblk_recov_l2p()
756 list_for_each_entry_safe(line, tline, &recov_list, list) { in pblk_recov_l2p()
759 line->emeta_ssec = pblk_line_emeta_start(pblk, line); in pblk_recov_l2p()
760 line->emeta = emeta; in pblk_recov_l2p()
761 memset(line->emeta->buf, 0, lm->emeta_len[0]); in pblk_recov_l2p()
763 if (pblk_line_is_open(pblk, line)) { in pblk_recov_l2p()
764 pblk_recov_l2p_from_oob(pblk, line); in pblk_recov_l2p()
768 if (pblk_line_emeta_read(pblk, line, line->emeta->buf)) { in pblk_recov_l2p()
769 pblk_recov_l2p_from_oob(pblk, line); in pblk_recov_l2p()
773 if (pblk_recov_check_emeta(pblk, line->emeta->buf)) { in pblk_recov_l2p()
774 pblk_recov_l2p_from_oob(pblk, line); in pblk_recov_l2p()
778 if (pblk_recov_check_line_version(pblk, line->emeta->buf)) in pblk_recov_l2p()
781 pblk_recov_wa_counters(pblk, line->emeta->buf); in pblk_recov_l2p()
783 if (pblk_recov_l2p_from_emeta(pblk, line)) in pblk_recov_l2p()
784 pblk_recov_l2p_from_oob(pblk, line); in pblk_recov_l2p()
787 if (pblk_line_is_full(line)) { in pblk_recov_l2p()
790 spin_lock(&line->lock); in pblk_recov_l2p()
791 line->state = PBLK_LINESTATE_CLOSED; in pblk_recov_l2p()
792 trace_pblk_line_state(pblk_disk_name(pblk), line->id, in pblk_recov_l2p()
793 line->state); in pblk_recov_l2p()
794 move_list = pblk_line_gc_list(pblk, line); in pblk_recov_l2p()
795 spin_unlock(&line->lock); in pblk_recov_l2p()
798 list_move_tail(&line->list, move_list); in pblk_recov_l2p()
801 mempool_free(line->map_bitmap, l_mg->bitmap_pool); in pblk_recov_l2p()
802 line->map_bitmap = NULL; in pblk_recov_l2p()
803 line->smeta = NULL; in pblk_recov_l2p()
804 line->emeta = NULL; in pblk_recov_l2p()
806 spin_lock(&line->lock); in pblk_recov_l2p()
807 line->state = PBLK_LINESTATE_OPEN; in pblk_recov_l2p()
808 spin_unlock(&line->lock); in pblk_recov_l2p()
810 line->emeta->mem = 0; in pblk_recov_l2p()
811 atomic_set(&line->emeta->sync, 0); in pblk_recov_l2p()
813 trace_pblk_line_state(pblk_disk_name(pblk), line->id, in pblk_recov_l2p()
814 line->state); in pblk_recov_l2p()
816 data_line = line; in pblk_recov_l2p()
817 line->meta_line = meta_line; in pblk_recov_l2p()
857 struct pblk_line *line; in pblk_recov_pad() local
863 line = l_mg->data_line; in pblk_recov_pad()
864 left_msecs = line->left_msecs; in pblk_recov_pad()
867 ret = pblk_recov_pad_line(pblk, line, left_msecs); in pblk_recov_pad()
873 pblk_line_close_meta(pblk, line); in pblk_recov_pad()