Lines Matching refs:pkt
525 struct packet_data *pkt; in pkt_alloc_packet_data() local
527 pkt = kzalloc(sizeof(struct packet_data), GFP_KERNEL); in pkt_alloc_packet_data()
528 if (!pkt) in pkt_alloc_packet_data()
531 pkt->frames = frames; in pkt_alloc_packet_data()
532 pkt->w_bio = bio_kmalloc(GFP_KERNEL, frames); in pkt_alloc_packet_data()
533 if (!pkt->w_bio) in pkt_alloc_packet_data()
537 pkt->pages[i] = alloc_page(GFP_KERNEL|__GFP_ZERO); in pkt_alloc_packet_data()
538 if (!pkt->pages[i]) in pkt_alloc_packet_data()
542 spin_lock_init(&pkt->lock); in pkt_alloc_packet_data()
543 bio_list_init(&pkt->orig_bios); in pkt_alloc_packet_data()
550 pkt->r_bios[i] = bio; in pkt_alloc_packet_data()
553 return pkt; in pkt_alloc_packet_data()
557 struct bio *bio = pkt->r_bios[i]; in pkt_alloc_packet_data()
564 if (pkt->pages[i]) in pkt_alloc_packet_data()
565 __free_page(pkt->pages[i]); in pkt_alloc_packet_data()
566 bio_put(pkt->w_bio); in pkt_alloc_packet_data()
568 kfree(pkt); in pkt_alloc_packet_data()
576 static void pkt_free_packet_data(struct packet_data *pkt) in pkt_free_packet_data() argument
580 for (i = 0; i < pkt->frames; i++) { in pkt_free_packet_data()
581 struct bio *bio = pkt->r_bios[i]; in pkt_free_packet_data()
585 for (i = 0; i < pkt->frames / FRAMES_PER_PAGE; i++) in pkt_free_packet_data()
586 __free_page(pkt->pages[i]); in pkt_free_packet_data()
587 bio_put(pkt->w_bio); in pkt_free_packet_data()
588 kfree(pkt); in pkt_free_packet_data()
593 struct packet_data *pkt, *next; in pkt_shrink_pktlist() local
597 list_for_each_entry_safe(pkt, next, &pd->cdrw.pkt_free_list, list) { in pkt_shrink_pktlist()
598 pkt_free_packet_data(pkt); in pkt_shrink_pktlist()
605 struct packet_data *pkt; in pkt_grow_pktlist() local
610 pkt = pkt_alloc_packet_data(pd->settings.size >> 2); in pkt_grow_pktlist()
611 if (!pkt) { in pkt_grow_pktlist()
615 pkt->id = nr_packets; in pkt_grow_pktlist()
616 pkt->pd = pd; in pkt_grow_pktlist()
617 list_add(&pkt->list, &pd->cdrw.pkt_free_list); in pkt_grow_pktlist()
954 static void pkt_make_local_copy(struct packet_data *pkt, struct bio_vec *bvec) in pkt_make_local_copy() argument
961 for (f = 0; f < pkt->frames; f++) { in pkt_make_local_copy()
962 if (bvec[f].bv_page != pkt->pages[p]) { in pkt_make_local_copy()
964 void *vto = page_address(pkt->pages[p]) + offs; in pkt_make_local_copy()
967 bvec[f].bv_page = pkt->pages[p]; in pkt_make_local_copy()
982 struct packet_data *pkt = bio->bi_private; in pkt_end_io_read() local
983 struct pktcdvd_device *pd = pkt->pd; in pkt_end_io_read()
987 bio, (unsigned long long)pkt->sector, in pkt_end_io_read()
991 atomic_inc(&pkt->io_errors); in pkt_end_io_read()
992 if (atomic_dec_and_test(&pkt->io_wait)) { in pkt_end_io_read()
993 atomic_inc(&pkt->run_sm); in pkt_end_io_read()
1001 struct packet_data *pkt = bio->bi_private; in pkt_end_io_packet_write() local
1002 struct pktcdvd_device *pd = pkt->pd; in pkt_end_io_packet_write()
1005 pkt_dbg(2, pd, "id=%d, err=%d\n", pkt->id, bio->bi_error); in pkt_end_io_packet_write()
1010 atomic_dec(&pkt->io_wait); in pkt_end_io_packet_write()
1011 atomic_inc(&pkt->run_sm); in pkt_end_io_packet_write()
1018 static void pkt_gather_data(struct pktcdvd_device *pd, struct packet_data *pkt) in pkt_gather_data() argument
1025 BUG_ON(bio_list_empty(&pkt->orig_bios)); in pkt_gather_data()
1027 atomic_set(&pkt->io_wait, 0); in pkt_gather_data()
1028 atomic_set(&pkt->io_errors, 0); in pkt_gather_data()
1034 spin_lock(&pkt->lock); in pkt_gather_data()
1035 bio_list_for_each(bio, &pkt->orig_bios) { in pkt_gather_data()
1036 int first_frame = (bio->bi_iter.bi_sector - pkt->sector) / in pkt_gather_data()
1041 BUG_ON(first_frame + num_frames > pkt->frames); in pkt_gather_data()
1045 spin_unlock(&pkt->lock); in pkt_gather_data()
1047 if (pkt->cache_valid) { in pkt_gather_data()
1049 (unsigned long long)pkt->sector); in pkt_gather_data()
1056 for (f = 0; f < pkt->frames; f++) { in pkt_gather_data()
1062 bio = pkt->r_bios[f]; in pkt_gather_data()
1064 bio->bi_iter.bi_sector = pkt->sector + f * (CD_FRAMESIZE >> 9); in pkt_gather_data()
1067 bio->bi_private = pkt; in pkt_gather_data()
1072 f, pkt->pages[p], offset); in pkt_gather_data()
1073 if (!bio_add_page(bio, pkt->pages[p], CD_FRAMESIZE, offset)) in pkt_gather_data()
1076 atomic_inc(&pkt->io_wait); in pkt_gather_data()
1084 frames_read, (unsigned long long)pkt->sector); in pkt_gather_data()
1095 struct packet_data *pkt; in pkt_get_packet_data() local
1097 list_for_each_entry(pkt, &pd->cdrw.pkt_free_list, list) { in pkt_get_packet_data()
1098 if (pkt->sector == zone || pkt->list.next == &pd->cdrw.pkt_free_list) { in pkt_get_packet_data()
1099 list_del_init(&pkt->list); in pkt_get_packet_data()
1100 if (pkt->sector != zone) in pkt_get_packet_data()
1101 pkt->cache_valid = 0; in pkt_get_packet_data()
1102 return pkt; in pkt_get_packet_data()
1109 static void pkt_put_packet_data(struct pktcdvd_device *pd, struct packet_data *pkt) in pkt_put_packet_data() argument
1111 if (pkt->cache_valid) { in pkt_put_packet_data()
1112 list_add(&pkt->list, &pd->cdrw.pkt_free_list); in pkt_put_packet_data()
1114 list_add_tail(&pkt->list, &pd->cdrw.pkt_free_list); in pkt_put_packet_data()
1124 static int pkt_start_recovery(struct packet_data *pkt) in pkt_start_recovery() argument
1132 struct request *rq = pkt->rq; in pkt_start_recovery()
1151 old_block = pkt->sector / (CD_FRAMESIZE >> 9); in pkt_start_recovery()
1156 pkt->sector = new_sector; in pkt_start_recovery()
1158 bio_reset(pkt->bio); in pkt_start_recovery()
1159 pkt->bio->bi_bdev = pd->bdev; in pkt_start_recovery()
1160 pkt->bio->bi_rw = REQ_WRITE; in pkt_start_recovery()
1161 pkt->bio->bi_iter.bi_sector = new_sector; in pkt_start_recovery()
1162 pkt->bio->bi_iter.bi_size = pkt->frames * CD_FRAMESIZE; in pkt_start_recovery()
1163 pkt->bio->bi_vcnt = pkt->frames; in pkt_start_recovery()
1165 pkt->bio->bi_end_io = pkt_end_io_packet_write; in pkt_start_recovery()
1166 pkt->bio->bi_private = pkt; in pkt_start_recovery()
1177 static inline void pkt_set_state(struct packet_data *pkt, enum packet_data_state state) in pkt_set_state() argument
1183 enum packet_data_state old_state = pkt->state; in pkt_set_state()
1185 pkt->id, (unsigned long long)pkt->sector, in pkt_set_state()
1188 pkt->state = state; in pkt_set_state()
1197 struct packet_data *pkt, *p; in pkt_handle_queue() local
1248 pkt = pkt_get_packet_data(pd, zone); in pkt_handle_queue()
1251 pkt->sector = zone; in pkt_handle_queue()
1252 BUG_ON(pkt->frames != pd->settings.size >> 2); in pkt_handle_queue()
1253 pkt->write_size = 0; in pkt_handle_queue()
1268 spin_lock(&pkt->lock); in pkt_handle_queue()
1269 bio_list_add(&pkt->orig_bios, bio); in pkt_handle_queue()
1270 pkt->write_size += bio->bi_iter.bi_size / CD_FRAMESIZE; in pkt_handle_queue()
1271 spin_unlock(&pkt->lock); in pkt_handle_queue()
1283 pkt->sleep_time = max(PACKET_WAIT_TIME, 1); in pkt_handle_queue()
1284 pkt_set_state(pkt, PACKET_WAITING_STATE); in pkt_handle_queue()
1285 atomic_set(&pkt->run_sm, 1); in pkt_handle_queue()
1288 list_add(&pkt->list, &pd->cdrw.pkt_active_list); in pkt_handle_queue()
1298 static void pkt_start_write(struct pktcdvd_device *pd, struct packet_data *pkt) in pkt_start_write() argument
1301 struct bio_vec *bvec = pkt->w_bio->bi_io_vec; in pkt_start_write()
1303 bio_reset(pkt->w_bio); in pkt_start_write()
1304 pkt->w_bio->bi_iter.bi_sector = pkt->sector; in pkt_start_write()
1305 pkt->w_bio->bi_bdev = pd->bdev; in pkt_start_write()
1306 pkt->w_bio->bi_end_io = pkt_end_io_packet_write; in pkt_start_write()
1307 pkt->w_bio->bi_private = pkt; in pkt_start_write()
1310 for (f = 0; f < pkt->frames; f++) { in pkt_start_write()
1311 bvec[f].bv_page = pkt->pages[(f * CD_FRAMESIZE) / PAGE_SIZE]; in pkt_start_write()
1313 if (!bio_add_page(pkt->w_bio, bvec[f].bv_page, CD_FRAMESIZE, bvec[f].bv_offset)) in pkt_start_write()
1316 pkt_dbg(2, pd, "vcnt=%d\n", pkt->w_bio->bi_vcnt); in pkt_start_write()
1321 spin_lock(&pkt->lock); in pkt_start_write()
1322 bio_copy_data(pkt->w_bio, pkt->orig_bios.head); in pkt_start_write()
1324 pkt_set_state(pkt, PACKET_WRITE_WAIT_STATE); in pkt_start_write()
1325 spin_unlock(&pkt->lock); in pkt_start_write()
1328 pkt->write_size, (unsigned long long)pkt->sector); in pkt_start_write()
1330 if (test_bit(PACKET_MERGE_SEGS, &pd->flags) || (pkt->write_size < pkt->frames)) { in pkt_start_write()
1331 pkt_make_local_copy(pkt, bvec); in pkt_start_write()
1332 pkt->cache_valid = 1; in pkt_start_write()
1334 pkt->cache_valid = 0; in pkt_start_write()
1338 atomic_set(&pkt->io_wait, 1); in pkt_start_write()
1339 pkt->w_bio->bi_rw = WRITE; in pkt_start_write()
1340 pkt_queue_bio(pd, pkt->w_bio); in pkt_start_write()
1343 static void pkt_finish_packet(struct packet_data *pkt, int error) in pkt_finish_packet() argument
1348 pkt->cache_valid = 0; in pkt_finish_packet()
1351 while ((bio = bio_list_pop(&pkt->orig_bios))) { in pkt_finish_packet()
1357 static void pkt_run_state_machine(struct pktcdvd_device *pd, struct packet_data *pkt) in pkt_run_state_machine() argument
1359 pkt_dbg(2, pd, "pkt %d\n", pkt->id); in pkt_run_state_machine()
1362 switch (pkt->state) { in pkt_run_state_machine()
1364 if ((pkt->write_size < pkt->frames) && (pkt->sleep_time > 0)) in pkt_run_state_machine()
1367 pkt->sleep_time = 0; in pkt_run_state_machine()
1368 pkt_gather_data(pd, pkt); in pkt_run_state_machine()
1369 pkt_set_state(pkt, PACKET_READ_WAIT_STATE); in pkt_run_state_machine()
1373 if (atomic_read(&pkt->io_wait) > 0) in pkt_run_state_machine()
1376 if (atomic_read(&pkt->io_errors) > 0) { in pkt_run_state_machine()
1377 pkt_set_state(pkt, PACKET_RECOVERY_STATE); in pkt_run_state_machine()
1379 pkt_start_write(pd, pkt); in pkt_run_state_machine()
1384 if (atomic_read(&pkt->io_wait) > 0) in pkt_run_state_machine()
1387 if (!pkt->w_bio->bi_error) { in pkt_run_state_machine()
1388 pkt_set_state(pkt, PACKET_FINISHED_STATE); in pkt_run_state_machine()
1390 pkt_set_state(pkt, PACKET_RECOVERY_STATE); in pkt_run_state_machine()
1395 if (pkt_start_recovery(pkt)) { in pkt_run_state_machine()
1396 pkt_start_write(pd, pkt); in pkt_run_state_machine()
1399 pkt_set_state(pkt, PACKET_FINISHED_STATE); in pkt_run_state_machine()
1404 pkt_finish_packet(pkt, pkt->w_bio->bi_error); in pkt_run_state_machine()
1416 struct packet_data *pkt, *next; in pkt_handle_packets() local
1421 list_for_each_entry(pkt, &pd->cdrw.pkt_active_list, list) { in pkt_handle_packets()
1422 if (atomic_read(&pkt->run_sm) > 0) { in pkt_handle_packets()
1423 atomic_set(&pkt->run_sm, 0); in pkt_handle_packets()
1424 pkt_run_state_machine(pd, pkt); in pkt_handle_packets()
1432 list_for_each_entry_safe(pkt, next, &pd->cdrw.pkt_active_list, list) { in pkt_handle_packets()
1433 if (pkt->state == PACKET_FINISHED_STATE) { in pkt_handle_packets()
1434 list_del(&pkt->list); in pkt_handle_packets()
1435 pkt_put_packet_data(pd, pkt); in pkt_handle_packets()
1436 pkt_set_state(pkt, PACKET_IDLE_STATE); in pkt_handle_packets()
1445 struct packet_data *pkt; in pkt_count_states() local
1452 list_for_each_entry(pkt, &pd->cdrw.pkt_active_list, list) { in pkt_count_states()
1453 states[pkt->state]++; in pkt_count_states()
1465 struct packet_data *pkt; in kcdrwd() local
1486 list_for_each_entry(pkt, &pd->cdrw.pkt_active_list, list) { in kcdrwd()
1487 if (atomic_read(&pkt->run_sm) > 0) in kcdrwd()
1505 list_for_each_entry(pkt, &pd->cdrw.pkt_active_list, list) { in kcdrwd()
1506 if (pkt->sleep_time && pkt->sleep_time < min_sleep_time) in kcdrwd()
1507 min_sleep_time = pkt->sleep_time; in kcdrwd()
1517 list_for_each_entry(pkt, &pd->cdrw.pkt_active_list, list) { in kcdrwd()
1518 if (!pkt->sleep_time) in kcdrwd()
1520 pkt->sleep_time -= min_sleep_time - residue; in kcdrwd()
1521 if (pkt->sleep_time <= 0) { in kcdrwd()
1522 pkt->sleep_time = 0; in kcdrwd()
1523 atomic_inc(&pkt->run_sm); in kcdrwd()
2364 struct packet_data *pkt; in pkt_make_request_write() local
2376 list_for_each_entry(pkt, &pd->cdrw.pkt_active_list, list) { in pkt_make_request_write()
2377 if (pkt->sector == zone) { in pkt_make_request_write()
2378 spin_lock(&pkt->lock); in pkt_make_request_write()
2379 if ((pkt->state == PACKET_WAITING_STATE) || in pkt_make_request_write()
2380 (pkt->state == PACKET_READ_WAIT_STATE)) { in pkt_make_request_write()
2381 bio_list_add(&pkt->orig_bios, bio); in pkt_make_request_write()
2382 pkt->write_size += in pkt_make_request_write()
2384 if ((pkt->write_size >= pkt->frames) && in pkt_make_request_write()
2385 (pkt->state == PACKET_WAITING_STATE)) { in pkt_make_request_write()
2386 atomic_inc(&pkt->run_sm); in pkt_make_request_write()
2389 spin_unlock(&pkt->lock); in pkt_make_request_write()
2395 spin_unlock(&pkt->lock); in pkt_make_request_write()