Lines Matching refs:line
32 struct pblk_line *line; in pblk_line_mark_bb() local
35 line = &pblk->lines[pblk_ppa_to_line(*ppa)]; in pblk_line_mark_bb()
39 line->id, pos); in pblk_line_mark_bb()
46 static void pblk_mark_bb(struct pblk *pblk, struct pblk_line *line, in pblk_mark_bb() argument
54 pblk_debug(pblk, "erase failed: line:%d, pos:%d\n", line->id, pos); in pblk_mark_bb()
57 atomic_dec(&line->blk_in_line); in pblk_mark_bb()
58 if (test_and_set_bit(pos, line->blk_bitmap)) in pblk_mark_bb()
60 line->id, pos); in pblk_mark_bb()
80 struct pblk_line *line; in __pblk_end_io_erase() local
83 line = &pblk->lines[pblk_ppa_to_line(rqd->ppa_addr)]; in __pblk_end_io_erase()
85 chunk = &line->chks[pos]; in __pblk_end_io_erase()
87 atomic_dec(&line->left_seblks); in __pblk_end_io_erase()
91 pblk_mark_bb(pblk, line, rqd->ppa_addr); in __pblk_end_io_erase()
151 void __pblk_map_invalidate(struct pblk *pblk, struct pblk_line *line, in __pblk_map_invalidate() argument
161 spin_lock(&line->lock); in __pblk_map_invalidate()
162 WARN_ON(line->state == PBLK_LINESTATE_FREE); in __pblk_map_invalidate()
164 if (test_and_set_bit(paddr, line->invalid_bitmap)) { in __pblk_map_invalidate()
166 spin_unlock(&line->lock); in __pblk_map_invalidate()
169 le32_add_cpu(line->vsc, -1); in __pblk_map_invalidate()
171 if (line->state == PBLK_LINESTATE_CLOSED) in __pblk_map_invalidate()
172 move_list = pblk_line_gc_list(pblk, line); in __pblk_map_invalidate()
173 spin_unlock(&line->lock); in __pblk_map_invalidate()
177 spin_lock(&line->lock); in __pblk_map_invalidate()
179 if (line->state == PBLK_LINESTATE_GC) { in __pblk_map_invalidate()
180 spin_unlock(&line->lock); in __pblk_map_invalidate()
184 spin_unlock(&line->lock); in __pblk_map_invalidate()
186 list_move_tail(&line->list, move_list); in __pblk_map_invalidate()
193 struct pblk_line *line; in pblk_map_invalidate() local
204 line = &pblk->lines[line_id]; in pblk_map_invalidate()
207 __pblk_map_invalidate(pblk, line, paddr); in pblk_map_invalidate()
370 struct list_head *pblk_line_gc_list(struct pblk *pblk, struct pblk_line *line) in pblk_line_gc_list() argument
375 int vsc = le32_to_cpu(*line->vsc); in pblk_line_gc_list()
377 lockdep_assert_held(&line->lock); in pblk_line_gc_list()
379 if (line->w_err_gc->has_write_err) { in pblk_line_gc_list()
380 if (line->gc_group != PBLK_LINEGC_WERR) { in pblk_line_gc_list()
381 line->gc_group = PBLK_LINEGC_WERR; in pblk_line_gc_list()
386 if (line->gc_group != PBLK_LINEGC_FULL) { in pblk_line_gc_list()
387 line->gc_group = PBLK_LINEGC_FULL; in pblk_line_gc_list()
391 if (line->gc_group != PBLK_LINEGC_HIGH) { in pblk_line_gc_list()
392 line->gc_group = PBLK_LINEGC_HIGH; in pblk_line_gc_list()
396 if (line->gc_group != PBLK_LINEGC_MID) { in pblk_line_gc_list()
397 line->gc_group = PBLK_LINEGC_MID; in pblk_line_gc_list()
400 } else if (vsc < line->sec_in_line) { in pblk_line_gc_list()
401 if (line->gc_group != PBLK_LINEGC_LOW) { in pblk_line_gc_list()
402 line->gc_group = PBLK_LINEGC_LOW; in pblk_line_gc_list()
405 } else if (vsc == line->sec_in_line) { in pblk_line_gc_list()
406 if (line->gc_group != PBLK_LINEGC_EMPTY) { in pblk_line_gc_list()
407 line->gc_group = PBLK_LINEGC_EMPTY; in pblk_line_gc_list()
411 line->state = PBLK_LINESTATE_CORRUPT; in pblk_line_gc_list()
412 line->gc_group = PBLK_LINEGC_NONE; in pblk_line_gc_list()
415 line->id, vsc, in pblk_line_gc_list()
416 line->sec_in_line, in pblk_line_gc_list()
560 void pblk_dealloc_page(struct pblk *pblk, struct pblk_line *line, int nr_secs) in pblk_dealloc_page() argument
565 spin_lock(&line->lock); in pblk_dealloc_page()
566 addr = find_next_zero_bit(line->map_bitmap, in pblk_dealloc_page()
567 pblk->lm.sec_per_line, line->cur_sec); in pblk_dealloc_page()
568 line->cur_sec = addr - nr_secs; in pblk_dealloc_page()
570 for (i = 0; i < nr_secs; i++, line->cur_sec--) in pblk_dealloc_page()
571 WARN_ON(!test_and_clear_bit(line->cur_sec, line->map_bitmap)); in pblk_dealloc_page()
572 spin_unlock(&line->lock); in pblk_dealloc_page()
575 u64 __pblk_alloc_page(struct pblk *pblk, struct pblk_line *line, int nr_secs) in __pblk_alloc_page() argument
580 lockdep_assert_held(&line->lock); in __pblk_alloc_page()
583 if (line->cur_sec + nr_secs > pblk->lm.sec_per_line) { in __pblk_alloc_page()
585 nr_secs = pblk->lm.sec_per_line - line->cur_sec; in __pblk_alloc_page()
588 line->cur_sec = addr = find_next_zero_bit(line->map_bitmap, in __pblk_alloc_page()
589 pblk->lm.sec_per_line, line->cur_sec); in __pblk_alloc_page()
590 for (i = 0; i < nr_secs; i++, line->cur_sec++) in __pblk_alloc_page()
591 WARN_ON(test_and_set_bit(line->cur_sec, line->map_bitmap)); in __pblk_alloc_page()
596 u64 pblk_alloc_page(struct pblk *pblk, struct pblk_line *line, int nr_secs) in pblk_alloc_page() argument
603 spin_lock(&line->lock); in pblk_alloc_page()
604 addr = __pblk_alloc_page(pblk, line, nr_secs); in pblk_alloc_page()
605 line->left_msecs -= nr_secs; in pblk_alloc_page()
606 WARN(line->left_msecs < 0, "pblk: page allocation out of bounds\n"); in pblk_alloc_page()
607 spin_unlock(&line->lock); in pblk_alloc_page()
612 u64 pblk_lookup_page(struct pblk *pblk, struct pblk_line *line) in pblk_lookup_page() argument
616 spin_lock(&line->lock); in pblk_lookup_page()
617 paddr = find_next_zero_bit(line->map_bitmap, in pblk_lookup_page()
618 pblk->lm.sec_per_line, line->cur_sec); in pblk_lookup_page()
619 spin_unlock(&line->lock); in pblk_lookup_page()
628 static int pblk_line_submit_emeta_io(struct pblk *pblk, struct pblk_line *line, in pblk_line_submit_emeta_io() argument
641 int id = line->id; in pblk_line_submit_emeta_io()
693 spin_lock(&line->lock); in pblk_line_submit_emeta_io()
694 paddr = __pblk_alloc_page(pblk, line, min); in pblk_line_submit_emeta_io()
695 spin_unlock(&line->lock); in pblk_line_submit_emeta_io()
712 while (test_bit(pos, line->blk_bitmap)) { in pblk_line_submit_emeta_io()
716 line->id); in pblk_line_submit_emeta_io()
728 line->id); in pblk_line_submit_emeta_io()
736 addr_to_gen_ppa(pblk, paddr, line->id); in pblk_line_submit_emeta_io()
765 u64 pblk_line_smeta_start(struct pblk *pblk, struct pblk_line *line) in pblk_line_smeta_start() argument
773 bit = find_first_zero_bit(line->blk_bitmap, lm->blk_per_line); in pblk_line_smeta_start()
780 static int pblk_line_submit_smeta_io(struct pblk *pblk, struct pblk_line *line, in pblk_line_submit_smeta_io() argument
796 lba_list = emeta_to_lbas(pblk, line->emeta->buf); in pblk_line_submit_smeta_io()
814 bio = bio_map_kern(dev->q, line->smeta, lm->smeta_len, GFP_KERNEL); in pblk_line_submit_smeta_io()
831 rqd.ppa_list[i] = addr_to_gen_ppa(pblk, paddr, line->id); in pblk_line_submit_smeta_io()
868 int pblk_line_read_smeta(struct pblk *pblk, struct pblk_line *line) in pblk_line_read_smeta() argument
870 u64 bpaddr = pblk_line_smeta_start(pblk, line); in pblk_line_read_smeta()
872 return pblk_line_submit_smeta_io(pblk, line, bpaddr, PBLK_READ_RECOV); in pblk_line_read_smeta()
875 int pblk_line_read_emeta(struct pblk *pblk, struct pblk_line *line, in pblk_line_read_emeta() argument
878 return pblk_line_submit_emeta_io(pblk, line, emeta_buf, in pblk_line_read_emeta()
879 line->emeta_ssec, PBLK_READ); in pblk_line_read_emeta()
924 int pblk_line_erase(struct pblk *pblk, struct pblk_line *line) in pblk_line_erase() argument
932 spin_lock(&line->lock); in pblk_line_erase()
933 bit = find_next_zero_bit(line->erase_bitmap, lm->blk_per_line, in pblk_line_erase()
936 spin_unlock(&line->lock); in pblk_line_erase()
941 ppa.a.blk = line->id; in pblk_line_erase()
943 atomic_dec(&line->left_eblks); in pblk_line_erase()
944 WARN_ON(test_and_set_bit(bit, line->erase_bitmap)); in pblk_line_erase()
945 spin_unlock(&line->lock); in pblk_line_erase()
949 pblk_err(pblk, "failed to erase line %d\n", line->id); in pblk_line_erase()
957 static void pblk_line_setup_metadata(struct pblk_line *line, in pblk_line_setup_metadata() argument
975 line->meta_line = meta_line; in pblk_line_setup_metadata()
977 line->smeta = l_mg->sline_meta[meta_line]; in pblk_line_setup_metadata()
978 line->emeta = l_mg->eline_meta[meta_line]; in pblk_line_setup_metadata()
980 memset(line->smeta, 0, lm->smeta_len); in pblk_line_setup_metadata()
981 memset(line->emeta->buf, 0, lm->emeta_len[0]); in pblk_line_setup_metadata()
983 line->emeta->mem = 0; in pblk_line_setup_metadata()
984 atomic_set(&line->emeta->sync, 0); in pblk_line_setup_metadata()
990 static int pblk_line_init_metadata(struct pblk *pblk, struct pblk_line *line, in pblk_line_init_metadata() argument
997 struct pblk_emeta *emeta = line->emeta; in pblk_line_init_metadata()
999 struct line_smeta *smeta_buf = (struct line_smeta *)line->smeta; in pblk_line_init_metadata()
1006 bitmap_weight(line->blk_bitmap, lm->blk_per_line); in pblk_line_init_metadata()
1009 spin_lock(&line->lock); in pblk_line_init_metadata()
1010 line->state = PBLK_LINESTATE_BAD; in pblk_line_init_metadata()
1011 spin_unlock(&line->lock); in pblk_line_init_metadata()
1013 list_add_tail(&line->list, &l_mg->bad_list); in pblk_line_init_metadata()
1016 pblk_debug(pblk, "line %d is bad\n", line->id); in pblk_line_init_metadata()
1022 line->lun_bitmap = ((void *)(smeta_buf)) + sizeof(struct line_smeta); in pblk_line_init_metadata()
1025 bitmap_set(line->lun_bitmap, 0, lm->lun_bitmap_len); in pblk_line_init_metadata()
1029 smeta_buf->header.id = cpu_to_le32(line->id); in pblk_line_init_metadata()
1030 smeta_buf->header.type = cpu_to_le16(line->type); in pblk_line_init_metadata()
1035 smeta_buf->seq_nr = cpu_to_le64(line->seq_nr); in pblk_line_init_metadata()
1040 memcpy(line->lun_bitmap, cur->lun_bitmap, lm->lun_bitmap_len); in pblk_line_init_metadata()
1042 cur->emeta->buf->next_id = cpu_to_le32(line->id); in pblk_line_init_metadata()
1061 emeta_buf->seq_nr = cpu_to_le64(line->seq_nr); in pblk_line_init_metadata()
1062 emeta_buf->nr_lbas = cpu_to_le64(line->sec_in_line); in pblk_line_init_metadata()
1071 static int pblk_line_alloc_bitmaps(struct pblk *pblk, struct pblk_line *line) in pblk_line_alloc_bitmaps() argument
1075 line->map_bitmap = kzalloc(lm->sec_bitmap_len, GFP_KERNEL); in pblk_line_alloc_bitmaps()
1076 if (!line->map_bitmap) in pblk_line_alloc_bitmaps()
1080 line->invalid_bitmap = kmalloc(lm->sec_bitmap_len, GFP_KERNEL); in pblk_line_alloc_bitmaps()
1081 if (!line->invalid_bitmap) { in pblk_line_alloc_bitmaps()
1082 kfree(line->map_bitmap); in pblk_line_alloc_bitmaps()
1083 line->map_bitmap = NULL; in pblk_line_alloc_bitmaps()
1093 static int pblk_line_init_bb(struct pblk *pblk, struct pblk_line *line, in pblk_line_init_bb() argument
1104 line->sec_in_line = lm->sec_per_line; in pblk_line_init_bb()
1107 while ((bit = find_next_bit(line->blk_bitmap, lm->blk_per_line, in pblk_line_init_bb()
1112 bitmap_or(line->map_bitmap, line->map_bitmap, l_mg->bb_aux, in pblk_line_init_bb()
1114 line->sec_in_line -= geo->clba; in pblk_line_init_bb()
1118 bit = find_first_zero_bit(line->blk_bitmap, lm->blk_per_line); in pblk_line_init_bb()
1120 bitmap_set(line->map_bitmap, off, lm->smeta_sec); in pblk_line_init_bb()
1121 line->sec_in_line -= lm->smeta_sec; in pblk_line_init_bb()
1122 line->smeta_ssec = off; in pblk_line_init_bb()
1123 line->cur_sec = off + lm->smeta_sec; in pblk_line_init_bb()
1125 if (init && pblk_line_submit_smeta_io(pblk, line, off, PBLK_WRITE)) { in pblk_line_init_bb()
1130 bitmap_copy(line->invalid_bitmap, line->map_bitmap, lm->sec_per_line); in pblk_line_init_bb()
1139 if (!test_bit(off, line->invalid_bitmap)) { in pblk_line_init_bb()
1140 bitmap_set(line->invalid_bitmap, off, geo->ws_opt); in pblk_line_init_bb()
1145 line->emeta_ssec = off; in pblk_line_init_bb()
1146 line->sec_in_line -= lm->emeta_sec[0]; in pblk_line_init_bb()
1147 line->nr_valid_lbas = 0; in pblk_line_init_bb()
1148 line->left_msecs = line->sec_in_line; in pblk_line_init_bb()
1149 *line->vsc = cpu_to_le32(line->sec_in_line); in pblk_line_init_bb()
1151 if (lm->sec_per_line - line->sec_in_line != in pblk_line_init_bb()
1152 bitmap_weight(line->invalid_bitmap, lm->sec_per_line)) { in pblk_line_init_bb()
1153 spin_lock(&line->lock); in pblk_line_init_bb()
1154 line->state = PBLK_LINESTATE_BAD; in pblk_line_init_bb()
1155 spin_unlock(&line->lock); in pblk_line_init_bb()
1157 list_add_tail(&line->list, &l_mg->bad_list); in pblk_line_init_bb()
1158 pblk_err(pblk, "unexpected line %d is bad\n", line->id); in pblk_line_init_bb()
1166 static int pblk_prepare_new_line(struct pblk *pblk, struct pblk_line *line) in pblk_prepare_new_line() argument
1171 int blk_to_erase = atomic_read(&line->blk_in_line); in pblk_prepare_new_line()
1177 int state = line->chks[pos].state; in pblk_prepare_new_line()
1182 line->erase_bitmap); in pblk_prepare_new_line()
1190 static int pblk_line_prepare(struct pblk *pblk, struct pblk_line *line) in pblk_line_prepare() argument
1193 int blk_in_line = atomic_read(&line->blk_in_line); in pblk_line_prepare()
1197 bitmap_copy(line->erase_bitmap, line->blk_bitmap, lm->blk_per_line); in pblk_line_prepare()
1199 spin_lock(&line->lock); in pblk_line_prepare()
1204 if (line->state == PBLK_LINESTATE_NEW) { in pblk_line_prepare()
1205 blk_to_erase = pblk_prepare_new_line(pblk, line); in pblk_line_prepare()
1206 line->state = PBLK_LINESTATE_FREE; in pblk_line_prepare()
1212 spin_unlock(&line->lock); in pblk_line_prepare()
1216 if (line->state != PBLK_LINESTATE_FREE) { in pblk_line_prepare()
1218 line->id, line->state); in pblk_line_prepare()
1219 spin_unlock(&line->lock); in pblk_line_prepare()
1223 line->state = PBLK_LINESTATE_OPEN; in pblk_line_prepare()
1225 atomic_set(&line->left_eblks, blk_to_erase); in pblk_line_prepare()
1226 atomic_set(&line->left_seblks, blk_to_erase); in pblk_line_prepare()
1228 line->meta_distance = lm->meta_distance; in pblk_line_prepare()
1229 spin_unlock(&line->lock); in pblk_line_prepare()
1231 kref_init(&line->ref); in pblk_line_prepare()
1236 int pblk_line_recov_alloc(struct pblk *pblk, struct pblk_line *line) in pblk_line_recov_alloc() argument
1242 l_mg->data_line = line; in pblk_line_recov_alloc()
1243 list_del(&line->list); in pblk_line_recov_alloc()
1245 ret = pblk_line_prepare(pblk, line); in pblk_line_recov_alloc()
1247 list_add(&line->list, &l_mg->free_list); in pblk_line_recov_alloc()
1253 ret = pblk_line_alloc_bitmaps(pblk, line); in pblk_line_recov_alloc()
1257 if (!pblk_line_init_bb(pblk, line, 0)) { in pblk_line_recov_alloc()
1258 list_add(&line->list, &l_mg->free_list); in pblk_line_recov_alloc()
1262 pblk_rl_free_lines_dec(&pblk->rl, line, true); in pblk_line_recov_alloc()
1266 void pblk_line_recov_close(struct pblk *pblk, struct pblk_line *line) in pblk_line_recov_close() argument
1268 kfree(line->map_bitmap); in pblk_line_recov_close()
1269 line->map_bitmap = NULL; in pblk_line_recov_close()
1270 line->smeta = NULL; in pblk_line_recov_close()
1271 line->emeta = NULL; in pblk_line_recov_close()
1274 static void pblk_line_reinit(struct pblk_line *line) in pblk_line_reinit() argument
1276 *line->vsc = cpu_to_le32(EMPTY_ENTRY); in pblk_line_reinit()
1278 line->map_bitmap = NULL; in pblk_line_reinit()
1279 line->invalid_bitmap = NULL; in pblk_line_reinit()
1280 line->smeta = NULL; in pblk_line_reinit()
1281 line->emeta = NULL; in pblk_line_reinit()
1284 void pblk_line_free(struct pblk_line *line) in pblk_line_free() argument
1286 kfree(line->map_bitmap); in pblk_line_free()
1287 kfree(line->invalid_bitmap); in pblk_line_free()
1289 pblk_line_reinit(line); in pblk_line_free()
1296 struct pblk_line *line; in pblk_line_get() local
1307 line = list_first_entry(&l_mg->free_list, struct pblk_line, list); in pblk_line_get()
1308 list_del(&line->list); in pblk_line_get()
1311 bit = find_first_zero_bit(line->blk_bitmap, lm->blk_per_line); in pblk_line_get()
1313 spin_lock(&line->lock); in pblk_line_get()
1314 line->state = PBLK_LINESTATE_BAD; in pblk_line_get()
1315 spin_unlock(&line->lock); in pblk_line_get()
1317 list_add_tail(&line->list, &l_mg->bad_list); in pblk_line_get()
1319 pblk_debug(pblk, "line %d is bad\n", line->id); in pblk_line_get()
1323 ret = pblk_line_prepare(pblk, line); in pblk_line_get()
1327 list_add(&line->list, &l_mg->bad_list); in pblk_line_get()
1330 list_add(&line->list, &l_mg->corrupt_list); in pblk_line_get()
1333 pblk_err(pblk, "failed to prepare line %d\n", line->id); in pblk_line_get()
1334 list_add(&line->list, &l_mg->free_list); in pblk_line_get()
1340 return line; in pblk_line_get()
1344 struct pblk_line *line) in pblk_line_retry() argument
1358 retry_line->map_bitmap = line->map_bitmap; in pblk_line_retry()
1359 retry_line->invalid_bitmap = line->invalid_bitmap; in pblk_line_retry()
1360 retry_line->smeta = line->smeta; in pblk_line_retry()
1361 retry_line->emeta = line->emeta; in pblk_line_retry()
1362 retry_line->meta_line = line->meta_line; in pblk_line_retry()
1364 pblk_line_reinit(line); in pblk_line_retry()
1369 pblk_rl_free_lines_dec(&pblk->rl, line, false); in pblk_line_retry()
1387 struct pblk_line *line; in pblk_line_get_first_data() local
1390 line = pblk_line_get(pblk); in pblk_line_get_first_data()
1391 if (!line) { in pblk_line_get_first_data()
1396 line->seq_nr = l_mg->d_seq_nr++; in pblk_line_get_first_data()
1397 line->type = PBLK_LINETYPE_DATA; in pblk_line_get_first_data()
1398 l_mg->data_line = line; in pblk_line_get_first_data()
1400 pblk_line_setup_metadata(line, l_mg, &pblk->lm); in pblk_line_get_first_data()
1418 if (pblk_line_alloc_bitmaps(pblk, line)) in pblk_line_get_first_data()
1421 if (pblk_line_erase(pblk, line)) { in pblk_line_get_first_data()
1422 line = pblk_line_retry(pblk, line); in pblk_line_get_first_data()
1423 if (!line) in pblk_line_get_first_data()
1428 if (!pblk_line_init_metadata(pblk, line, NULL)) { in pblk_line_get_first_data()
1429 line = pblk_line_retry(pblk, line); in pblk_line_get_first_data()
1430 if (!line) in pblk_line_get_first_data()
1436 if (!pblk_line_init_bb(pblk, line, 1)) { in pblk_line_get_first_data()
1437 line = pblk_line_retry(pblk, line); in pblk_line_get_first_data()
1438 if (!line) in pblk_line_get_first_data()
1444 pblk_rl_free_lines_dec(&pblk->rl, line, true); in pblk_line_get_first_data()
1446 return line; in pblk_line_get_first_data()
1449 static void pblk_stop_writes(struct pblk *pblk, struct pblk_line *line) in pblk_stop_writes() argument
1461 struct pblk_line *line, *tline; in pblk_line_close_meta_sync() local
1473 list_for_each_entry_safe(line, tline, &list, list) { in pblk_line_close_meta_sync()
1474 struct pblk_emeta *emeta = line->emeta; in pblk_line_close_meta_sync()
1479 ret = pblk_submit_meta_io(pblk, line); in pblk_line_close_meta_sync()
1482 line->id, ret); in pblk_line_close_meta_sync()
1607 static void __pblk_line_put(struct pblk *pblk, struct pblk_line *line) in __pblk_line_put() argument
1612 spin_lock(&line->lock); in __pblk_line_put()
1613 WARN_ON(line->state != PBLK_LINESTATE_GC); in __pblk_line_put()
1614 line->state = PBLK_LINESTATE_FREE; in __pblk_line_put()
1615 line->gc_group = PBLK_LINEGC_NONE; in __pblk_line_put()
1616 pblk_line_free(line); in __pblk_line_put()
1618 if (line->w_err_gc->has_write_err) { in __pblk_line_put()
1620 line->w_err_gc->has_write_err = 0; in __pblk_line_put()
1623 spin_unlock(&line->lock); in __pblk_line_put()
1627 list_add_tail(&line->list, &l_mg->free_list); in __pblk_line_put()
1631 pblk_rl_free_lines_inc(&pblk->rl, line); in __pblk_line_put()
1639 struct pblk_line *line = line_put_ws->line; in pblk_line_put_ws() local
1641 __pblk_line_put(pblk, line); in pblk_line_put_ws()
1647 struct pblk_line *line = container_of(ref, struct pblk_line, ref); in pblk_line_put() local
1648 struct pblk *pblk = line->pblk; in pblk_line_put()
1650 __pblk_line_put(pblk, line); in pblk_line_put()
1655 struct pblk_line *line = container_of(ref, struct pblk_line, ref); in pblk_line_put_wq() local
1656 struct pblk *pblk = line->pblk; in pblk_line_put_wq()
1664 line_put_ws->line = line; in pblk_line_put_wq()
1710 int pblk_line_is_full(struct pblk_line *line) in pblk_line_is_full() argument
1712 return (line->left_msecs == 0); in pblk_line_is_full()
1721 void pblk_line_close(struct pblk *pblk, struct pblk_line *line) in pblk_line_close() argument
1731 WARN(!bitmap_full(line->map_bitmap, lm->sec_per_line), in pblk_line_close()
1732 "pblk: corrupt closed line %d\n", line->id); in pblk_line_close()
1736 WARN_ON(!test_and_clear_bit(line->meta_line, &l_mg->meta_bitmap)); in pblk_line_close()
1740 spin_lock(&line->lock); in pblk_line_close()
1741 WARN_ON(line->state != PBLK_LINESTATE_OPEN); in pblk_line_close()
1742 line->state = PBLK_LINESTATE_CLOSED; in pblk_line_close()
1743 move_list = pblk_line_gc_list(pblk, line); in pblk_line_close()
1745 list_add_tail(&line->list, move_list); in pblk_line_close()
1747 kfree(line->map_bitmap); in pblk_line_close()
1748 line->map_bitmap = NULL; in pblk_line_close()
1749 line->smeta = NULL; in pblk_line_close()
1750 line->emeta = NULL; in pblk_line_close()
1755 int state = line->chks[pos].state; in pblk_line_close()
1761 spin_unlock(&line->lock); in pblk_line_close()
1765 void pblk_line_close_meta(struct pblk *pblk, struct pblk_line *line) in pblk_line_close_meta() argument
1769 struct pblk_emeta *emeta = line->emeta; in pblk_line_close_meta()
1775 memcpy(emeta_to_bb(emeta_buf), line->blk_bitmap, lm->blk_bitmap_len); in pblk_line_close_meta()
1781 emeta_buf->nr_valid_lbas = cpu_to_le64(line->nr_valid_lbas); in pblk_line_close_meta()
1785 spin_lock(&line->lock); in pblk_line_close_meta()
1790 if (line->emeta_ssec != line->cur_sec) in pblk_line_close_meta()
1791 line->emeta_ssec = line->cur_sec; in pblk_line_close_meta()
1793 list_add_tail(&line->list, &l_mg->emeta_list); in pblk_line_close_meta()
1794 spin_unlock(&line->lock); in pblk_line_close_meta()
1802 static void pblk_save_lba_list(struct pblk *pblk, struct pblk_line *line) in pblk_save_lba_list() argument
1807 struct pblk_w_err_gc *w_err_gc = line->w_err_gc; in pblk_save_lba_list()
1808 struct pblk_emeta *emeta = line->emeta; in pblk_save_lba_list()
1821 struct pblk_line *line = line_ws->line; in pblk_line_close_ws() local
1822 struct pblk_w_err_gc *w_err_gc = line->w_err_gc; in pblk_line_close_ws()
1828 pblk_save_lba_list(pblk, line); in pblk_line_close_ws()
1830 pblk_line_close(pblk, line); in pblk_line_close_ws()
1834 void pblk_gen_run_ws(struct pblk *pblk, struct pblk_line *line, void *priv, in pblk_gen_run_ws() argument
1843 line_ws->line = line; in pblk_gen_run_ws()
2064 struct pblk_line *line = &pblk->lines[line_id]; in pblk_lookup_l2p_seq() local
2066 kref_get(&line->ref); in pblk_lookup_l2p_seq()