Lines Matching refs:pkt
524 struct packet_data *pkt; in pkt_alloc_packet_data() local
526 pkt = kzalloc(sizeof(struct packet_data), GFP_KERNEL); in pkt_alloc_packet_data()
527 if (!pkt) in pkt_alloc_packet_data()
530 pkt->frames = frames; in pkt_alloc_packet_data()
531 pkt->w_bio = bio_kmalloc(GFP_KERNEL, frames); in pkt_alloc_packet_data()
532 if (!pkt->w_bio) in pkt_alloc_packet_data()
536 pkt->pages[i] = alloc_page(GFP_KERNEL|__GFP_ZERO); in pkt_alloc_packet_data()
537 if (!pkt->pages[i]) in pkt_alloc_packet_data()
541 spin_lock_init(&pkt->lock); in pkt_alloc_packet_data()
542 bio_list_init(&pkt->orig_bios); in pkt_alloc_packet_data()
549 pkt->r_bios[i] = bio; in pkt_alloc_packet_data()
552 return pkt; in pkt_alloc_packet_data()
556 struct bio *bio = pkt->r_bios[i]; in pkt_alloc_packet_data()
563 if (pkt->pages[i]) in pkt_alloc_packet_data()
564 __free_page(pkt->pages[i]); in pkt_alloc_packet_data()
565 bio_put(pkt->w_bio); in pkt_alloc_packet_data()
567 kfree(pkt); in pkt_alloc_packet_data()
575 static void pkt_free_packet_data(struct packet_data *pkt) in pkt_free_packet_data() argument
579 for (i = 0; i < pkt->frames; i++) { in pkt_free_packet_data()
580 struct bio *bio = pkt->r_bios[i]; in pkt_free_packet_data()
584 for (i = 0; i < pkt->frames / FRAMES_PER_PAGE; i++) in pkt_free_packet_data()
585 __free_page(pkt->pages[i]); in pkt_free_packet_data()
586 bio_put(pkt->w_bio); in pkt_free_packet_data()
587 kfree(pkt); in pkt_free_packet_data()
592 struct packet_data *pkt, *next; in pkt_shrink_pktlist() local
596 list_for_each_entry_safe(pkt, next, &pd->cdrw.pkt_free_list, list) { in pkt_shrink_pktlist()
597 pkt_free_packet_data(pkt); in pkt_shrink_pktlist()
604 struct packet_data *pkt; in pkt_grow_pktlist() local
609 pkt = pkt_alloc_packet_data(pd->settings.size >> 2); in pkt_grow_pktlist()
610 if (!pkt) { in pkt_grow_pktlist()
614 pkt->id = nr_packets; in pkt_grow_pktlist()
615 pkt->pd = pd; in pkt_grow_pktlist()
616 list_add(&pkt->list, &pd->cdrw.pkt_free_list); in pkt_grow_pktlist()
953 static void pkt_make_local_copy(struct packet_data *pkt, struct bio_vec *bvec) in pkt_make_local_copy() argument
960 for (f = 0; f < pkt->frames; f++) { in pkt_make_local_copy()
961 if (bvec[f].bv_page != pkt->pages[p]) { in pkt_make_local_copy()
963 void *vto = page_address(pkt->pages[p]) + offs; in pkt_make_local_copy()
966 bvec[f].bv_page = pkt->pages[p]; in pkt_make_local_copy()
981 struct packet_data *pkt = bio->bi_private; in pkt_end_io_read() local
982 struct pktcdvd_device *pd = pkt->pd; in pkt_end_io_read()
986 bio, (unsigned long long)pkt->sector, in pkt_end_io_read()
990 atomic_inc(&pkt->io_errors); in pkt_end_io_read()
991 if (atomic_dec_and_test(&pkt->io_wait)) { in pkt_end_io_read()
992 atomic_inc(&pkt->run_sm); in pkt_end_io_read()
1000 struct packet_data *pkt = bio->bi_private; in pkt_end_io_packet_write() local
1001 struct pktcdvd_device *pd = pkt->pd; in pkt_end_io_packet_write()
1004 pkt_dbg(2, pd, "id=%d, err=%d\n", pkt->id, err); in pkt_end_io_packet_write()
1009 atomic_dec(&pkt->io_wait); in pkt_end_io_packet_write()
1010 atomic_inc(&pkt->run_sm); in pkt_end_io_packet_write()
1017 static void pkt_gather_data(struct pktcdvd_device *pd, struct packet_data *pkt) in pkt_gather_data() argument
1024 BUG_ON(bio_list_empty(&pkt->orig_bios)); in pkt_gather_data()
1026 atomic_set(&pkt->io_wait, 0); in pkt_gather_data()
1027 atomic_set(&pkt->io_errors, 0); in pkt_gather_data()
1033 spin_lock(&pkt->lock); in pkt_gather_data()
1034 bio_list_for_each(bio, &pkt->orig_bios) { in pkt_gather_data()
1035 int first_frame = (bio->bi_iter.bi_sector - pkt->sector) / in pkt_gather_data()
1040 BUG_ON(first_frame + num_frames > pkt->frames); in pkt_gather_data()
1044 spin_unlock(&pkt->lock); in pkt_gather_data()
1046 if (pkt->cache_valid) { in pkt_gather_data()
1048 (unsigned long long)pkt->sector); in pkt_gather_data()
1055 for (f = 0; f < pkt->frames; f++) { in pkt_gather_data()
1061 bio = pkt->r_bios[f]; in pkt_gather_data()
1063 bio->bi_iter.bi_sector = pkt->sector + f * (CD_FRAMESIZE >> 9); in pkt_gather_data()
1066 bio->bi_private = pkt; in pkt_gather_data()
1071 f, pkt->pages[p], offset); in pkt_gather_data()
1072 if (!bio_add_page(bio, pkt->pages[p], CD_FRAMESIZE, offset)) in pkt_gather_data()
1075 atomic_inc(&pkt->io_wait); in pkt_gather_data()
1083 frames_read, (unsigned long long)pkt->sector); in pkt_gather_data()
1094 struct packet_data *pkt; in pkt_get_packet_data() local
1096 list_for_each_entry(pkt, &pd->cdrw.pkt_free_list, list) { in pkt_get_packet_data()
1097 if (pkt->sector == zone || pkt->list.next == &pd->cdrw.pkt_free_list) { in pkt_get_packet_data()
1098 list_del_init(&pkt->list); in pkt_get_packet_data()
1099 if (pkt->sector != zone) in pkt_get_packet_data()
1100 pkt->cache_valid = 0; in pkt_get_packet_data()
1101 return pkt; in pkt_get_packet_data()
1108 static void pkt_put_packet_data(struct pktcdvd_device *pd, struct packet_data *pkt) in pkt_put_packet_data() argument
1110 if (pkt->cache_valid) { in pkt_put_packet_data()
1111 list_add(&pkt->list, &pd->cdrw.pkt_free_list); in pkt_put_packet_data()
1113 list_add_tail(&pkt->list, &pd->cdrw.pkt_free_list); in pkt_put_packet_data()
1123 static int pkt_start_recovery(struct packet_data *pkt) in pkt_start_recovery() argument
1131 struct request *rq = pkt->rq; in pkt_start_recovery()
1150 old_block = pkt->sector / (CD_FRAMESIZE >> 9); in pkt_start_recovery()
1155 pkt->sector = new_sector; in pkt_start_recovery()
1157 bio_reset(pkt->bio); in pkt_start_recovery()
1158 pkt->bio->bi_bdev = pd->bdev; in pkt_start_recovery()
1159 pkt->bio->bi_rw = REQ_WRITE; in pkt_start_recovery()
1160 pkt->bio->bi_iter.bi_sector = new_sector; in pkt_start_recovery()
1161 pkt->bio->bi_iter.bi_size = pkt->frames * CD_FRAMESIZE; in pkt_start_recovery()
1162 pkt->bio->bi_vcnt = pkt->frames; in pkt_start_recovery()
1164 pkt->bio->bi_end_io = pkt_end_io_packet_write; in pkt_start_recovery()
1165 pkt->bio->bi_private = pkt; in pkt_start_recovery()
1176 static inline void pkt_set_state(struct packet_data *pkt, enum packet_data_state state) in pkt_set_state() argument
1182 enum packet_data_state old_state = pkt->state; in pkt_set_state()
1184 pkt->id, (unsigned long long)pkt->sector, in pkt_set_state()
1187 pkt->state = state; in pkt_set_state()
1196 struct packet_data *pkt, *p; in pkt_handle_queue() local
1247 pkt = pkt_get_packet_data(pd, zone); in pkt_handle_queue()
1250 pkt->sector = zone; in pkt_handle_queue()
1251 BUG_ON(pkt->frames != pd->settings.size >> 2); in pkt_handle_queue()
1252 pkt->write_size = 0; in pkt_handle_queue()
1267 spin_lock(&pkt->lock); in pkt_handle_queue()
1268 bio_list_add(&pkt->orig_bios, bio); in pkt_handle_queue()
1269 pkt->write_size += bio->bi_iter.bi_size / CD_FRAMESIZE; in pkt_handle_queue()
1270 spin_unlock(&pkt->lock); in pkt_handle_queue()
1282 pkt->sleep_time = max(PACKET_WAIT_TIME, 1); in pkt_handle_queue()
1283 pkt_set_state(pkt, PACKET_WAITING_STATE); in pkt_handle_queue()
1284 atomic_set(&pkt->run_sm, 1); in pkt_handle_queue()
1287 list_add(&pkt->list, &pd->cdrw.pkt_active_list); in pkt_handle_queue()
1297 static void pkt_start_write(struct pktcdvd_device *pd, struct packet_data *pkt) in pkt_start_write() argument
1300 struct bio_vec *bvec = pkt->w_bio->bi_io_vec; in pkt_start_write()
1302 bio_reset(pkt->w_bio); in pkt_start_write()
1303 pkt->w_bio->bi_iter.bi_sector = pkt->sector; in pkt_start_write()
1304 pkt->w_bio->bi_bdev = pd->bdev; in pkt_start_write()
1305 pkt->w_bio->bi_end_io = pkt_end_io_packet_write; in pkt_start_write()
1306 pkt->w_bio->bi_private = pkt; in pkt_start_write()
1309 for (f = 0; f < pkt->frames; f++) { in pkt_start_write()
1310 bvec[f].bv_page = pkt->pages[(f * CD_FRAMESIZE) / PAGE_SIZE]; in pkt_start_write()
1312 if (!bio_add_page(pkt->w_bio, bvec[f].bv_page, CD_FRAMESIZE, bvec[f].bv_offset)) in pkt_start_write()
1315 pkt_dbg(2, pd, "vcnt=%d\n", pkt->w_bio->bi_vcnt); in pkt_start_write()
1320 spin_lock(&pkt->lock); in pkt_start_write()
1321 bio_copy_data(pkt->w_bio, pkt->orig_bios.head); in pkt_start_write()
1323 pkt_set_state(pkt, PACKET_WRITE_WAIT_STATE); in pkt_start_write()
1324 spin_unlock(&pkt->lock); in pkt_start_write()
1327 pkt->write_size, (unsigned long long)pkt->sector); in pkt_start_write()
1329 if (test_bit(PACKET_MERGE_SEGS, &pd->flags) || (pkt->write_size < pkt->frames)) { in pkt_start_write()
1330 pkt_make_local_copy(pkt, bvec); in pkt_start_write()
1331 pkt->cache_valid = 1; in pkt_start_write()
1333 pkt->cache_valid = 0; in pkt_start_write()
1337 atomic_set(&pkt->io_wait, 1); in pkt_start_write()
1338 pkt->w_bio->bi_rw = WRITE; in pkt_start_write()
1339 pkt_queue_bio(pd, pkt->w_bio); in pkt_start_write()
1342 static void pkt_finish_packet(struct packet_data *pkt, int uptodate) in pkt_finish_packet() argument
1347 pkt->cache_valid = 0; in pkt_finish_packet()
1350 while ((bio = bio_list_pop(&pkt->orig_bios))) in pkt_finish_packet()
1354 static void pkt_run_state_machine(struct pktcdvd_device *pd, struct packet_data *pkt) in pkt_run_state_machine() argument
1358 pkt_dbg(2, pd, "pkt %d\n", pkt->id); in pkt_run_state_machine()
1361 switch (pkt->state) { in pkt_run_state_machine()
1363 if ((pkt->write_size < pkt->frames) && (pkt->sleep_time > 0)) in pkt_run_state_machine()
1366 pkt->sleep_time = 0; in pkt_run_state_machine()
1367 pkt_gather_data(pd, pkt); in pkt_run_state_machine()
1368 pkt_set_state(pkt, PACKET_READ_WAIT_STATE); in pkt_run_state_machine()
1372 if (atomic_read(&pkt->io_wait) > 0) in pkt_run_state_machine()
1375 if (atomic_read(&pkt->io_errors) > 0) { in pkt_run_state_machine()
1376 pkt_set_state(pkt, PACKET_RECOVERY_STATE); in pkt_run_state_machine()
1378 pkt_start_write(pd, pkt); in pkt_run_state_machine()
1383 if (atomic_read(&pkt->io_wait) > 0) in pkt_run_state_machine()
1386 if (test_bit(BIO_UPTODATE, &pkt->w_bio->bi_flags)) { in pkt_run_state_machine()
1387 pkt_set_state(pkt, PACKET_FINISHED_STATE); in pkt_run_state_machine()
1389 pkt_set_state(pkt, PACKET_RECOVERY_STATE); in pkt_run_state_machine()
1394 if (pkt_start_recovery(pkt)) { in pkt_run_state_machine()
1395 pkt_start_write(pd, pkt); in pkt_run_state_machine()
1398 pkt_set_state(pkt, PACKET_FINISHED_STATE); in pkt_run_state_machine()
1403 uptodate = test_bit(BIO_UPTODATE, &pkt->w_bio->bi_flags); in pkt_run_state_machine()
1404 pkt_finish_packet(pkt, uptodate); 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()
2363 struct packet_data *pkt; in pkt_make_request_write() local
2375 list_for_each_entry(pkt, &pd->cdrw.pkt_active_list, list) { in pkt_make_request_write()
2376 if (pkt->sector == zone) { in pkt_make_request_write()
2377 spin_lock(&pkt->lock); in pkt_make_request_write()
2378 if ((pkt->state == PACKET_WAITING_STATE) || in pkt_make_request_write()
2379 (pkt->state == PACKET_READ_WAIT_STATE)) { in pkt_make_request_write()
2380 bio_list_add(&pkt->orig_bios, bio); in pkt_make_request_write()
2381 pkt->write_size += in pkt_make_request_write()
2383 if ((pkt->write_size >= pkt->frames) && in pkt_make_request_write()
2384 (pkt->state == PACKET_WAITING_STATE)) { in pkt_make_request_write()
2385 atomic_inc(&pkt->run_sm); in pkt_make_request_write()
2388 spin_unlock(&pkt->lock); in pkt_make_request_write()
2394 spin_unlock(&pkt->lock); in pkt_make_request_write()