• Home
  • Raw
  • Download

Lines Matching +full:fails +full:- +full:without +full:- +full:test +full:- +full:cd

3  * Copyright (C) 2001-2004 Peter Osterlund <petero2@telia.com>
9 * Packet writing layer for ATAPI and SCSI CD-RW, DVD+RW, DVD-RW and
10 * DVD-RAM devices.
14 * At the lowest level, there is the standard driver for the CD/DVD device,
15 * typically ide-cd.c or sr.c. This driver can handle read and write requests,
25 * randomly read and written using 2kB-sized blocks.
39 * At the top layer there is a custom ->submit_bio function that forwards
64 #include <linux/backing-dev.h>
76 pr_err("%s: " fmt, pd->name, ##__VA_ARGS__)
78 pr_notice("%s: " fmt, pd->name, ##__VA_ARGS__)
80 pr_info("%s: " fmt, pd->name, ##__VA_ARGS__)
86 pd->name, __func__, ##__VA_ARGS__); \
88 pr_notice("%s: " fmt, pd->name, ##__VA_ARGS__); \
113 return (sector + pd->offset) & ~(sector_t)(pd->settings.size - 1); in get_zone()
130 p->pd = pd; in pkt_kobj_create()
131 error = kobject_init_and_add(&p->kobj, ktype, parent, "%s", name); in pkt_kobj_create()
133 kobject_put(&p->kobj); in pkt_kobj_create()
136 kobject_uevent(&p->kobj, KOBJ_ADD); in pkt_kobj_create()
145 kobject_put(&p->kobj); in pkt_kobj_remove()
167 /sys/class/pktcdvd/pktcdvd[0-7]/
210 struct pktcdvd_device *pd = to_pktcdvdkobj(kobj)->pd; in kobj_pkt_show()
213 if (strcmp(attr->name, "packets_started") == 0) { in kobj_pkt_show()
214 n = sprintf(data, "%lu\n", pd->stats.pkt_started); in kobj_pkt_show()
216 } else if (strcmp(attr->name, "packets_finished") == 0) { in kobj_pkt_show()
217 n = sprintf(data, "%lu\n", pd->stats.pkt_ended); in kobj_pkt_show()
219 } else if (strcmp(attr->name, "kb_written") == 0) { in kobj_pkt_show()
220 n = sprintf(data, "%lu\n", pd->stats.secs_w >> 1); in kobj_pkt_show()
222 } else if (strcmp(attr->name, "kb_read") == 0) { in kobj_pkt_show()
223 n = sprintf(data, "%lu\n", pd->stats.secs_r >> 1); in kobj_pkt_show()
225 } else if (strcmp(attr->name, "kb_read_gather") == 0) { in kobj_pkt_show()
226 n = sprintf(data, "%lu\n", pd->stats.secs_rg >> 1); in kobj_pkt_show()
228 } else if (strcmp(attr->name, "size") == 0) { in kobj_pkt_show()
229 spin_lock(&pd->lock); in kobj_pkt_show()
230 v = pd->bio_queue_size; in kobj_pkt_show()
231 spin_unlock(&pd->lock); in kobj_pkt_show()
234 } else if (strcmp(attr->name, "congestion_off") == 0) { in kobj_pkt_show()
235 spin_lock(&pd->lock); in kobj_pkt_show()
236 v = pd->write_congestion_off; in kobj_pkt_show()
237 spin_unlock(&pd->lock); in kobj_pkt_show()
240 } else if (strcmp(attr->name, "congestion_on") == 0) { in kobj_pkt_show()
241 spin_lock(&pd->lock); in kobj_pkt_show()
242 v = pd->write_congestion_on; in kobj_pkt_show()
243 spin_unlock(&pd->lock); in kobj_pkt_show()
255 *lo = *hi - 100; in init_write_congestion_marks()
257 *lo = min(*lo, *hi - 100); in init_write_congestion_marks()
261 *hi = -1; in init_write_congestion_marks()
262 *lo = -1; in init_write_congestion_marks()
270 struct pktcdvd_device *pd = to_pktcdvdkobj(kobj)->pd; in kobj_pkt_store()
273 if (strcmp(attr->name, "reset") == 0 && len > 0) { in kobj_pkt_store()
274 pd->stats.pkt_started = 0; in kobj_pkt_store()
275 pd->stats.pkt_ended = 0; in kobj_pkt_store()
276 pd->stats.secs_w = 0; in kobj_pkt_store()
277 pd->stats.secs_rg = 0; in kobj_pkt_store()
278 pd->stats.secs_r = 0; in kobj_pkt_store()
280 } else if (strcmp(attr->name, "congestion_off") == 0 in kobj_pkt_store()
282 spin_lock(&pd->lock); in kobj_pkt_store()
283 pd->write_congestion_off = val; in kobj_pkt_store()
284 init_write_congestion_marks(&pd->write_congestion_off, in kobj_pkt_store()
285 &pd->write_congestion_on); in kobj_pkt_store()
286 spin_unlock(&pd->lock); in kobj_pkt_store()
288 } else if (strcmp(attr->name, "congestion_on") == 0 in kobj_pkt_store()
290 spin_lock(&pd->lock); in kobj_pkt_store()
291 pd->write_congestion_on = val; in kobj_pkt_store()
292 init_write_congestion_marks(&pd->write_congestion_off, in kobj_pkt_store()
293 &pd->write_congestion_on); in kobj_pkt_store()
294 spin_unlock(&pd->lock); in kobj_pkt_store()
317 pd->dev = device_create(class_pktcdvd, NULL, MKDEV(0, 0), NULL, in pkt_sysfs_dev_new()
318 "%s", pd->name); in pkt_sysfs_dev_new()
319 if (IS_ERR(pd->dev)) in pkt_sysfs_dev_new()
320 pd->dev = NULL; in pkt_sysfs_dev_new()
322 if (pd->dev) { in pkt_sysfs_dev_new()
323 pd->kobj_stat = pkt_kobj_create(pd, "stat", in pkt_sysfs_dev_new()
324 &pd->dev->kobj, in pkt_sysfs_dev_new()
326 pd->kobj_wqueue = pkt_kobj_create(pd, "write_queue", in pkt_sysfs_dev_new()
327 &pd->dev->kobj, in pkt_sysfs_dev_new()
334 pkt_kobj_remove(pd->kobj_stat); in pkt_sysfs_dev_remove()
335 pkt_kobj_remove(pd->kobj_wqueue); in pkt_sysfs_dev_remove()
337 device_unregister(pd->dev); in pkt_sysfs_dev_remove()
364 pd->name, in device_map_show()
365 MAJOR(pd->pkt_dev), MINOR(pd->pkt_dev), in device_map_show()
366 MAJOR(pd->bdev->bd_dev), in device_map_show()
367 MINOR(pd->bdev->bd_dev)); in device_map_show()
382 return -ENODEV; in add_store()
391 return -EINVAL; in add_store()
403 return -EINVAL; in remove_store()
425 return -ENOMEM; in pkt_sysfs_init()
426 class_pktcdvd->name = DRIVER_NAME; in pkt_sysfs_init()
427 class_pktcdvd->owner = THIS_MODULE; in pkt_sysfs_init()
428 class_pktcdvd->class_release = class_pktcdvd_release; in pkt_sysfs_init()
429 class_pktcdvd->class_groups = class_pktcdvd_groups; in pkt_sysfs_init()
450 /sys/kernel/debug/pktcdvd[0-7]/
462 return single_open(file, pkt_debugfs_seq_show, inode->i_private); in pkt_debugfs_fops_open()
477 pd->dfs_d_root = debugfs_create_dir(pd->name, pkt_debugfs_root); in pkt_debugfs_dev_new()
478 if (!pd->dfs_d_root) in pkt_debugfs_dev_new()
481 pd->dfs_f_info = debugfs_create_file("info", 0444, in pkt_debugfs_dev_new()
482 pd->dfs_d_root, pd, &debug_fops); in pkt_debugfs_dev_new()
489 debugfs_remove(pd->dfs_f_info); in pkt_debugfs_dev_remove()
490 debugfs_remove(pd->dfs_d_root); in pkt_debugfs_dev_remove()
491 pd->dfs_f_info = NULL; in pkt_debugfs_dev_remove()
492 pd->dfs_d_root = NULL; in pkt_debugfs_dev_remove()
506 /* ----------------------------------------------------------*/
511 BUG_ON(atomic_read(&pd->cdrw.pending_bios) <= 0); in pkt_bio_finished()
512 if (atomic_dec_and_test(&pd->cdrw.pending_bios)) { in pkt_bio_finished()
514 atomic_set(&pd->iosched.attention, 1); in pkt_bio_finished()
515 wake_up(&pd->wqueue); in pkt_bio_finished()
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()
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()
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()
595 BUG_ON(!list_empty(&pd->cdrw.pkt_active_list)); in pkt_shrink_pktlist()
597 list_for_each_entry_safe(pkt, next, &pd->cdrw.pkt_free_list, list) { in pkt_shrink_pktlist()
600 INIT_LIST_HEAD(&pd->cdrw.pkt_free_list); in pkt_shrink_pktlist()
607 BUG_ON(!list_empty(&pd->cdrw.pkt_free_list)); in pkt_grow_pktlist()
610 pkt = pkt_alloc_packet_data(pd->settings.size >> 2); 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()
618 nr_packets--; in pkt_grow_pktlist()
625 struct rb_node *n = rb_next(&node->rb_node); in pkt_rbtree_next()
633 rb_erase(&node->rb_node, &pd->bio_queue); in pkt_rbtree_erase()
634 mempool_free(node, &pd->rb_pool); in pkt_rbtree_erase()
635 pd->bio_queue_size--; in pkt_rbtree_erase()
636 BUG_ON(pd->bio_queue_size < 0); in pkt_rbtree_erase()
640 * Find the first node in the pd->bio_queue rb tree with a starting sector >= s.
644 struct rb_node *n = pd->bio_queue.rb_node; in pkt_rbtree_find()
649 BUG_ON(pd->bio_queue_size > 0); in pkt_rbtree_find()
655 if (s <= tmp->bio->bi_iter.bi_sector) in pkt_rbtree_find()
656 next = n->rb_left; in pkt_rbtree_find()
658 next = n->rb_right; in pkt_rbtree_find()
664 if (s > tmp->bio->bi_iter.bi_sector) { in pkt_rbtree_find()
669 BUG_ON(s > tmp->bio->bi_iter.bi_sector); in pkt_rbtree_find()
674 * Insert a node into the pd->bio_queue rb tree.
678 struct rb_node **p = &pd->bio_queue.rb_node; in pkt_rbtree_insert()
680 sector_t s = node->bio->bi_iter.bi_sector; in pkt_rbtree_insert()
686 if (s < tmp->bio->bi_iter.bi_sector) in pkt_rbtree_insert()
687 p = &(*p)->rb_left; in pkt_rbtree_insert()
689 p = &(*p)->rb_right; in pkt_rbtree_insert()
691 rb_link_node(&node->rb_node, parent, p); in pkt_rbtree_insert()
692 rb_insert_color(&node->rb_node, &pd->bio_queue); in pkt_rbtree_insert()
693 pd->bio_queue_size++; in pkt_rbtree_insert()
702 struct request_queue *q = bdev_get_queue(pd->bdev); in pkt_generic_packet()
706 rq = blk_get_request(q, (cgc->data_direction == CGC_DATA_WRITE) ? in pkt_generic_packet()
711 if (cgc->buflen) { in pkt_generic_packet()
712 ret = blk_rq_map_kern(q, rq, cgc->buffer, cgc->buflen, in pkt_generic_packet()
718 scsi_req(rq)->cmd_len = COMMAND_SIZE(cgc->cmd[0]); in pkt_generic_packet()
719 memcpy(scsi_req(rq)->cmd, cgc->cmd, CDROM_PACKET_SIZE); in pkt_generic_packet()
721 rq->timeout = 60*HZ; in pkt_generic_packet()
722 if (cgc->quiet) in pkt_generic_packet()
723 rq->rq_flags |= RQF_QUIET; in pkt_generic_packet()
725 blk_execute_rq(rq->q, pd->bdev->bd_disk, rq, 0); in pkt_generic_packet()
726 if (scsi_req(rq)->result) in pkt_generic_packet()
727 ret = -EIO; in pkt_generic_packet()
751 struct scsi_sense_hdr *sshdr = cgc->sshdr; in pkt_dump_sense()
754 pkt_err(pd, "%*ph - sense %02x.%02x.%02x (%s)\n", in pkt_dump_sense()
755 CDROM_PACKET_SIZE, cgc->cmd, in pkt_dump_sense()
756 sshdr->sense_key, sshdr->asc, sshdr->ascq, in pkt_dump_sense()
757 sense_key_string(sshdr->sense_key)); in pkt_dump_sense()
759 pkt_err(pd, "%*ph - no sense\n", CDROM_PACKET_SIZE, cgc->cmd); in pkt_dump_sense()
774 * the IMMED bit -- we default to not setting it, although that in pkt_flush_cache()
809 * Queue a bio for processing by the low-level CD device. Must be called
814 spin_lock(&pd->iosched.lock); in pkt_queue_bio()
816 bio_list_add(&pd->iosched.read_queue, bio); in pkt_queue_bio()
818 bio_list_add(&pd->iosched.write_queue, bio); in pkt_queue_bio()
819 spin_unlock(&pd->iosched.lock); in pkt_queue_bio()
821 atomic_set(&pd->iosched.attention, 1); in pkt_queue_bio()
822 wake_up(&pd->wqueue); in pkt_queue_bio()
828 * - A cache flush command must be inserted before a read request if the
830 * - Switching between reading and writing is slow, so don't do it more often
832 * - Optimize for throughput at the expense of latency. This means that streaming
836 * - Set the read speed according to current usage pattern. When only reading
844 if (atomic_read(&pd->iosched.attention) == 0) in pkt_iosched_process_queue()
846 atomic_set(&pd->iosched.attention, 0); in pkt_iosched_process_queue()
852 spin_lock(&pd->iosched.lock); in pkt_iosched_process_queue()
853 reads_queued = !bio_list_empty(&pd->iosched.read_queue); in pkt_iosched_process_queue()
854 writes_queued = !bio_list_empty(&pd->iosched.write_queue); in pkt_iosched_process_queue()
855 spin_unlock(&pd->iosched.lock); in pkt_iosched_process_queue()
860 if (pd->iosched.writing) { in pkt_iosched_process_queue()
862 spin_lock(&pd->iosched.lock); in pkt_iosched_process_queue()
863 bio = bio_list_peek(&pd->iosched.write_queue); in pkt_iosched_process_queue()
864 spin_unlock(&pd->iosched.lock); in pkt_iosched_process_queue()
865 if (bio && (bio->bi_iter.bi_sector == in pkt_iosched_process_queue()
866 pd->iosched.last_write)) in pkt_iosched_process_queue()
869 if (atomic_read(&pd->cdrw.pending_bios) > 0) { in pkt_iosched_process_queue()
874 pd->iosched.writing = 0; in pkt_iosched_process_queue()
878 if (atomic_read(&pd->cdrw.pending_bios) > 0) { in pkt_iosched_process_queue()
882 pd->iosched.writing = 1; in pkt_iosched_process_queue()
886 spin_lock(&pd->iosched.lock); in pkt_iosched_process_queue()
887 if (pd->iosched.writing) in pkt_iosched_process_queue()
888 bio = bio_list_pop(&pd->iosched.write_queue); in pkt_iosched_process_queue()
890 bio = bio_list_pop(&pd->iosched.read_queue); in pkt_iosched_process_queue()
891 spin_unlock(&pd->iosched.lock); in pkt_iosched_process_queue()
897 pd->iosched.successive_reads += in pkt_iosched_process_queue()
898 bio->bi_iter.bi_size >> 10; in pkt_iosched_process_queue()
900 pd->iosched.successive_reads = 0; in pkt_iosched_process_queue()
901 pd->iosched.last_write = bio_end_sector(bio); in pkt_iosched_process_queue()
903 if (pd->iosched.successive_reads >= HI_SPEED_SWITCH) { in pkt_iosched_process_queue()
904 if (pd->read_speed == pd->write_speed) { in pkt_iosched_process_queue()
905 pd->read_speed = MAX_SPEED; in pkt_iosched_process_queue()
906 pkt_set_speed(pd, pd->write_speed, pd->read_speed); in pkt_iosched_process_queue()
909 if (pd->read_speed != pd->write_speed) { in pkt_iosched_process_queue()
910 pd->read_speed = pd->write_speed; in pkt_iosched_process_queue()
911 pkt_set_speed(pd, pd->write_speed, pd->read_speed); in pkt_iosched_process_queue()
915 atomic_inc(&pd->cdrw.pending_bios); in pkt_iosched_process_queue()
926 if ((pd->settings.size << 9) / CD_FRAMESIZE in pkt_set_segment_merging()
931 clear_bit(PACKET_MERGE_SEGS, &pd->flags); in pkt_set_segment_merging()
933 } else if ((pd->settings.size << 9) / PAGE_SIZE in pkt_set_segment_merging()
939 set_bit(PACKET_MERGE_SEGS, &pd->flags); in pkt_set_segment_merging()
943 return -EIO; in pkt_set_segment_merging()
949 struct packet_data *pkt = bio->bi_private; in pkt_end_io_read()
950 struct pktcdvd_device *pd = pkt->pd; in pkt_end_io_read()
954 bio, (unsigned long long)pkt->sector, in pkt_end_io_read()
955 (unsigned long long)bio->bi_iter.bi_sector, bio->bi_status); in pkt_end_io_read()
957 if (bio->bi_status) in pkt_end_io_read()
958 atomic_inc(&pkt->io_errors); in pkt_end_io_read()
959 if (atomic_dec_and_test(&pkt->io_wait)) { in pkt_end_io_read()
960 atomic_inc(&pkt->run_sm); in pkt_end_io_read()
961 wake_up(&pd->wqueue); in pkt_end_io_read()
968 struct packet_data *pkt = bio->bi_private; in pkt_end_io_packet_write()
969 struct pktcdvd_device *pd = pkt->pd; in pkt_end_io_packet_write()
972 pkt_dbg(2, pd, "id=%d, err=%d\n", pkt->id, bio->bi_status); in pkt_end_io_packet_write()
974 pd->stats.pkt_ended++; in pkt_end_io_packet_write()
977 atomic_dec(&pkt->io_wait); in pkt_end_io_packet_write()
978 atomic_inc(&pkt->run_sm); in pkt_end_io_packet_write()
979 wake_up(&pd->wqueue); in pkt_end_io_packet_write()
992 BUG_ON(bio_list_empty(&pkt->orig_bios)); in pkt_gather_data()
994 atomic_set(&pkt->io_wait, 0); in pkt_gather_data()
995 atomic_set(&pkt->io_errors, 0); in pkt_gather_data()
1001 spin_lock(&pkt->lock); in pkt_gather_data()
1002 bio_list_for_each(bio, &pkt->orig_bios) { in pkt_gather_data()
1003 int first_frame = (bio->bi_iter.bi_sector - pkt->sector) / in pkt_gather_data()
1005 int num_frames = bio->bi_iter.bi_size / CD_FRAMESIZE; in pkt_gather_data()
1006 pd->stats.secs_w += num_frames * (CD_FRAMESIZE >> 9); in pkt_gather_data()
1008 BUG_ON(first_frame + num_frames > pkt->frames); in pkt_gather_data()
1012 spin_unlock(&pkt->lock); in pkt_gather_data()
1014 if (pkt->cache_valid) { in pkt_gather_data()
1016 (unsigned long long)pkt->sector); in pkt_gather_data()
1023 for (f = 0; f < pkt->frames; f++) { in pkt_gather_data()
1029 bio = pkt->r_bios[f]; in pkt_gather_data()
1031 bio->bi_iter.bi_sector = pkt->sector + f * (CD_FRAMESIZE >> 9); in pkt_gather_data()
1032 bio_set_dev(bio, pd->bdev); in pkt_gather_data()
1033 bio->bi_end_io = pkt_end_io_read; in pkt_gather_data()
1034 bio->bi_private = pkt; in pkt_gather_data()
1039 f, pkt->pages[p], offset); in pkt_gather_data()
1040 if (!bio_add_page(bio, pkt->pages[p], CD_FRAMESIZE, offset)) in pkt_gather_data()
1043 atomic_inc(&pkt->io_wait); in pkt_gather_data()
1051 frames_read, (unsigned long long)pkt->sector); in pkt_gather_data()
1052 pd->stats.pkt_started++; in pkt_gather_data()
1053 pd->stats.secs_rg += frames_read * (CD_FRAMESIZE >> 9); in pkt_gather_data()
1064 list_for_each_entry(pkt, &pd->cdrw.pkt_free_list, list) { in pkt_get_packet_data()
1065 if (pkt->sector == zone || pkt->list.next == &pd->cdrw.pkt_free_list) { in pkt_get_packet_data()
1066 list_del_init(&pkt->list); in pkt_get_packet_data()
1067 if (pkt->sector != zone) in pkt_get_packet_data()
1068 pkt->cache_valid = 0; in pkt_get_packet_data()
1078 if (pkt->cache_valid) { in pkt_put_packet_data()
1079 list_add(&pkt->list, &pd->cdrw.pkt_free_list); in pkt_put_packet_data()
1081 list_add_tail(&pkt->list, &pd->cdrw.pkt_free_list); in pkt_put_packet_data()
1091 enum packet_data_state old_state = pkt->state; in pkt_set_state()
1092 pkt_dbg(2, pd, "pkt %2d : s=%6llx %s -> %s\n", in pkt_set_state()
1093 pkt->id, (unsigned long long)pkt->sector, in pkt_set_state()
1096 pkt->state = state; in pkt_set_state()
1101 * returns non-zero if any work was done.
1112 atomic_set(&pd->scan_queue, 0); in pkt_handle_queue()
1114 if (list_empty(&pd->cdrw.pkt_free_list)) { in pkt_handle_queue()
1122 spin_lock(&pd->lock); in pkt_handle_queue()
1123 first_node = pkt_rbtree_find(pd, pd->current_sector); in pkt_handle_queue()
1125 n = rb_first(&pd->bio_queue); in pkt_handle_queue()
1131 bio = node->bio; in pkt_handle_queue()
1132 zone = get_zone(bio->bi_iter.bi_sector, pd); in pkt_handle_queue()
1133 list_for_each_entry(p, &pd->cdrw.pkt_active_list, list) { in pkt_handle_queue()
1134 if (p->sector == zone) { in pkt_handle_queue()
1143 n = rb_first(&pd->bio_queue); in pkt_handle_queue()
1150 spin_unlock(&pd->lock); in pkt_handle_queue()
1158 pd->current_sector = zone + pd->settings.size; in pkt_handle_queue()
1159 pkt->sector = zone; in pkt_handle_queue()
1160 BUG_ON(pkt->frames != pd->settings.size >> 2); in pkt_handle_queue()
1161 pkt->write_size = 0; in pkt_handle_queue()
1167 spin_lock(&pd->lock); in pkt_handle_queue()
1170 bio = node->bio; in pkt_handle_queue()
1172 get_zone(bio->bi_iter.bi_sector, pd)); in pkt_handle_queue()
1173 if (get_zone(bio->bi_iter.bi_sector, pd) != zone) in pkt_handle_queue()
1176 spin_lock(&pkt->lock); in pkt_handle_queue()
1177 bio_list_add(&pkt->orig_bios, bio); in pkt_handle_queue()
1178 pkt->write_size += bio->bi_iter.bi_size / CD_FRAMESIZE; in pkt_handle_queue()
1179 spin_unlock(&pkt->lock); in pkt_handle_queue()
1183 wakeup = (pd->write_congestion_on > 0 in pkt_handle_queue()
1184 && pd->bio_queue_size <= pd->write_congestion_off); in pkt_handle_queue()
1185 spin_unlock(&pd->lock); in pkt_handle_queue()
1187 clear_bdi_congested(pd->disk->queue->backing_dev_info, in pkt_handle_queue()
1191 pkt->sleep_time = max(PACKET_WAIT_TIME, 1); in pkt_handle_queue()
1193 atomic_set(&pkt->run_sm, 1); in pkt_handle_queue()
1195 spin_lock(&pd->cdrw.active_list_lock); in pkt_handle_queue()
1196 list_add(&pkt->list, &pd->cdrw.pkt_active_list); in pkt_handle_queue()
1197 spin_unlock(&pd->cdrw.active_list_lock); in pkt_handle_queue()
1210 bio_reset(pkt->w_bio); in pkt_start_write()
1211 pkt->w_bio->bi_iter.bi_sector = pkt->sector; in pkt_start_write()
1212 bio_set_dev(pkt->w_bio, pd->bdev); in pkt_start_write()
1213 pkt->w_bio->bi_end_io = pkt_end_io_packet_write; in pkt_start_write()
1214 pkt->w_bio->bi_private = pkt; in pkt_start_write()
1217 for (f = 0; f < pkt->frames; f++) { in pkt_start_write()
1218 struct page *page = pkt->pages[(f * CD_FRAMESIZE) / PAGE_SIZE]; in pkt_start_write()
1221 if (!bio_add_page(pkt->w_bio, page, CD_FRAMESIZE, offset)) in pkt_start_write()
1224 pkt_dbg(2, pd, "vcnt=%d\n", pkt->w_bio->bi_vcnt); in pkt_start_write()
1227 * Fill-in bvec with data from orig_bios. in pkt_start_write()
1229 spin_lock(&pkt->lock); in pkt_start_write()
1230 bio_list_copy_data(pkt->w_bio, pkt->orig_bios.head); in pkt_start_write()
1233 spin_unlock(&pkt->lock); in pkt_start_write()
1236 pkt->write_size, (unsigned long long)pkt->sector); in pkt_start_write()
1238 if (test_bit(PACKET_MERGE_SEGS, &pd->flags) || (pkt->write_size < pkt->frames)) in pkt_start_write()
1239 pkt->cache_valid = 1; in pkt_start_write()
1241 pkt->cache_valid = 0; in pkt_start_write()
1244 atomic_set(&pkt->io_wait, 1); in pkt_start_write()
1245 bio_set_op_attrs(pkt->w_bio, REQ_OP_WRITE, 0); in pkt_start_write()
1246 pkt_queue_bio(pd, pkt->w_bio); in pkt_start_write()
1254 pkt->cache_valid = 0; in pkt_finish_packet()
1257 while ((bio = bio_list_pop(&pkt->orig_bios))) { in pkt_finish_packet()
1258 bio->bi_status = status; in pkt_finish_packet()
1265 pkt_dbg(2, pd, "pkt %d\n", pkt->id); in pkt_run_state_machine()
1268 switch (pkt->state) { in pkt_run_state_machine()
1270 if ((pkt->write_size < pkt->frames) && (pkt->sleep_time > 0)) in pkt_run_state_machine()
1273 pkt->sleep_time = 0; in pkt_run_state_machine()
1279 if (atomic_read(&pkt->io_wait) > 0) in pkt_run_state_machine()
1282 if (atomic_read(&pkt->io_errors) > 0) { in pkt_run_state_machine()
1290 if (atomic_read(&pkt->io_wait) > 0) in pkt_run_state_machine()
1293 if (!pkt->w_bio->bi_status) { in pkt_run_state_machine()
1306 pkt_finish_packet(pkt, pkt->w_bio->bi_status); in pkt_run_state_machine()
1323 list_for_each_entry(pkt, &pd->cdrw.pkt_active_list, list) { in pkt_handle_packets()
1324 if (atomic_read(&pkt->run_sm) > 0) { in pkt_handle_packets()
1325 atomic_set(&pkt->run_sm, 0); in pkt_handle_packets()
1333 spin_lock(&pd->cdrw.active_list_lock); in pkt_handle_packets()
1334 list_for_each_entry_safe(pkt, next, &pd->cdrw.pkt_active_list, list) { in pkt_handle_packets()
1335 if (pkt->state == PACKET_FINISHED_STATE) { in pkt_handle_packets()
1336 list_del(&pkt->list); in pkt_handle_packets()
1339 atomic_set(&pd->scan_queue, 1); in pkt_handle_packets()
1342 spin_unlock(&pd->cdrw.active_list_lock); in pkt_handle_packets()
1353 spin_lock(&pd->cdrw.active_list_lock); in pkt_count_states()
1354 list_for_each_entry(pkt, &pd->cdrw.pkt_active_list, list) { in pkt_count_states()
1355 states[pkt->state]++; in pkt_count_states()
1357 spin_unlock(&pd->cdrw.active_list_lock); in pkt_count_states()
1379 add_wait_queue(&pd->wqueue, &wait); in kcdrwd()
1384 if (atomic_read(&pd->scan_queue) > 0) in kcdrwd()
1388 list_for_each_entry(pkt, &pd->cdrw.pkt_active_list, list) { in kcdrwd()
1389 if (atomic_read(&pkt->run_sm) > 0) in kcdrwd()
1394 if (atomic_read(&pd->iosched.attention) != 0) in kcdrwd()
1407 list_for_each_entry(pkt, &pd->cdrw.pkt_active_list, list) { in kcdrwd()
1408 if (pkt->sleep_time && pkt->sleep_time < min_sleep_time) in kcdrwd()
1409 min_sleep_time = pkt->sleep_time; in kcdrwd()
1419 list_for_each_entry(pkt, &pd->cdrw.pkt_active_list, list) { in kcdrwd()
1420 if (!pkt->sleep_time) in kcdrwd()
1422 pkt->sleep_time -= min_sleep_time - residue; in kcdrwd()
1423 if (pkt->sleep_time <= 0) { in kcdrwd()
1424 pkt->sleep_time = 0; in kcdrwd()
1425 atomic_inc(&pkt->run_sm); in kcdrwd()
1434 remove_wait_queue(&pd->wqueue, &wait); in kcdrwd()
1462 pkt_info(pd, "%s packets, %u blocks, Mode-%c disc\n", in pkt_print_settings()
1463 pd->settings.fp ? "Fixed" : "Variable", in pkt_print_settings()
1464 pd->settings.size >> 2, in pkt_print_settings()
1465 pd->settings.block_mode == 8 ? '1' : '2'); in pkt_print_settings()
1470 memset(cgc->cmd, 0, sizeof(cgc->cmd)); in pkt_mode_sense()
1472 cgc->cmd[0] = GPCMD_MODE_SENSE_10; in pkt_mode_sense()
1473 cgc->cmd[2] = page_code | (page_control << 6); in pkt_mode_sense()
1474 cgc->cmd[7] = cgc->buflen >> 8; in pkt_mode_sense()
1475 cgc->cmd[8] = cgc->buflen & 0xff; in pkt_mode_sense()
1476 cgc->data_direction = CGC_DATA_READ; in pkt_mode_sense()
1482 memset(cgc->cmd, 0, sizeof(cgc->cmd)); in pkt_mode_select()
1483 memset(cgc->buffer, 0, 2); in pkt_mode_select()
1484 cgc->cmd[0] = GPCMD_MODE_SELECT_10; in pkt_mode_select()
1485 cgc->cmd[1] = 0x10; /* PF */ in pkt_mode_select()
1486 cgc->cmd[7] = cgc->buflen >> 8; in pkt_mode_select()
1487 cgc->cmd[8] = cgc->buflen & 0xff; in pkt_mode_select()
1488 cgc->data_direction = CGC_DATA_WRITE; in pkt_mode_select()
1510 cgc.buflen = be16_to_cpu(di->disc_information_length) + in pkt_get_disc_info()
1511 sizeof(di->disc_information_length); in pkt_get_disc_info()
1537 cgc.buflen = be16_to_cpu(ti->track_information_length) + in pkt_get_track_info()
1538 sizeof(ti->track_information_length); in pkt_get_track_info()
1566 last_track--; in pkt_get_last_written()
1580 *last_written -= (be32_to_cpu(ti.free_blocks) + 7); in pkt_get_last_written()
1586 * write mode select package based on pd->settings
1596 /* doesn't apply to DVD+RW or DVD-RAM */ in pkt_set_write_settings()
1597 if ((pd->mmc3_profile == 0x1a) || (pd->mmc3_profile == 0x12)) in pkt_set_write_settings()
1610 pd->mode_offset = (buffer[6] << 8) | (buffer[7] & 0xff); in pkt_set_write_settings()
1628 wp = (write_param_page *) &buffer[sizeof(struct mode_page_header) + pd->mode_offset]; in pkt_set_write_settings()
1630 wp->fp = pd->settings.fp; in pkt_set_write_settings()
1631 wp->track_mode = pd->settings.track_mode; in pkt_set_write_settings()
1632 wp->write_type = pd->settings.write_type; in pkt_set_write_settings()
1633 wp->data_block_type = pd->settings.block_mode; in pkt_set_write_settings()
1635 wp->multi_session = 0; in pkt_set_write_settings()
1638 wp->link_size = 7; in pkt_set_write_settings()
1639 wp->ls_v = 1; in pkt_set_write_settings()
1642 if (wp->data_block_type == PACKET_BLOCK_MODE1) { in pkt_set_write_settings()
1643 wp->session_format = 0; in pkt_set_write_settings()
1644 wp->subhdr2 = 0x20; in pkt_set_write_settings()
1645 } else if (wp->data_block_type == PACKET_BLOCK_MODE2) { in pkt_set_write_settings()
1646 wp->session_format = 0x20; in pkt_set_write_settings()
1647 wp->subhdr2 = 8; in pkt_set_write_settings()
1649 wp->mcn[0] = 0x80; in pkt_set_write_settings()
1650 memcpy(&wp->mcn[1], PACKET_MCN, sizeof(wp->mcn) - 1); in pkt_set_write_settings()
1656 pkt_err(pd, "write mode wrong %d\n", wp->data_block_type); in pkt_set_write_settings()
1659 wp->packet_size = cpu_to_be32(pd->settings.size >> 2); in pkt_set_write_settings()
1673 * 1 -- we can write to this track, 0 -- we can't
1677 switch (pd->mmc3_profile) { in pkt_writable_track()
1679 case 0x12: /* DVD-RAM */ in pkt_writable_track()
1680 /* The track is always writable on DVD+RW/DVD-RAM */ in pkt_writable_track()
1686 if (!ti->packet || !ti->fp) in pkt_writable_track()
1692 if (ti->rt == 0 && ti->blank == 0) in pkt_writable_track()
1695 if (ti->rt == 0 && ti->blank == 1) in pkt_writable_track()
1698 if (ti->rt == 1 && ti->blank == 0) in pkt_writable_track()
1701 pkt_err(pd, "bad state %d-%d-%d\n", ti->rt, ti->blank, ti->packet); in pkt_writable_track()
1706 * 1 -- we can write to this disc, 0 -- we can't
1710 switch (pd->mmc3_profile) { in pkt_writable_disc()
1711 case 0x0a: /* CD-RW */ in pkt_writable_disc()
1715 case 0x13: /* DVD-RW */ in pkt_writable_disc()
1716 case 0x12: /* DVD-RAM */ in pkt_writable_disc()
1720 pd->mmc3_profile); in pkt_writable_disc()
1728 if (di->disc_type == 0xff) { in pkt_writable_disc()
1729 pkt_notice(pd, "unknown disc - no track?\n"); in pkt_writable_disc()
1733 if (di->disc_type != 0x20 && di->disc_type != 0) { in pkt_writable_disc()
1734 pkt_err(pd, "wrong disc type (%x)\n", di->disc_type); in pkt_writable_disc()
1738 if (di->erasable == 0) { in pkt_writable_disc()
1743 if (di->border_status == PACKET_SESSION_RESERVED) { in pkt_writable_disc()
1763 pd->mmc3_profile = ret ? 0xffff : buf[6] << 8 | buf[7]; in pkt_probe_settings()
1775 return -EROFS; in pkt_probe_settings()
1777 pd->type = di.erasable ? PACKET_CDRW : PACKET_CDR; in pkt_probe_settings()
1788 return -EROFS; in pkt_probe_settings()
1795 pd->settings.size = be32_to_cpu(ti.fixed_packet_size) << 2; in pkt_probe_settings()
1796 if (pd->settings.size == 0) { in pkt_probe_settings()
1798 return -ENXIO; in pkt_probe_settings()
1800 if (pd->settings.size > PACKET_MAX_SECTORS) { in pkt_probe_settings()
1802 return -EROFS; in pkt_probe_settings()
1804 pd->settings.fp = ti.fp; in pkt_probe_settings()
1805 pd->offset = (be32_to_cpu(ti.track_start) << 2) & (pd->settings.size - 1); in pkt_probe_settings()
1808 pd->nwa = be32_to_cpu(ti.next_writable); in pkt_probe_settings()
1809 set_bit(PACKET_NWA_VALID, &pd->flags); in pkt_probe_settings()
1813 * in theory we could use lra on -RW media as well and just zero in pkt_probe_settings()
1815 * is just a no-go. we'll use that for -R, naturally. in pkt_probe_settings()
1818 pd->lra = be32_to_cpu(ti.last_rec_address); in pkt_probe_settings()
1819 set_bit(PACKET_LRA_VALID, &pd->flags); in pkt_probe_settings()
1821 pd->lra = 0xffffffff; in pkt_probe_settings()
1822 set_bit(PACKET_LRA_VALID, &pd->flags); in pkt_probe_settings()
1828 pd->settings.link_loss = 7; in pkt_probe_settings()
1829 pd->settings.write_type = 0; /* packet */ in pkt_probe_settings()
1830 pd->settings.track_mode = ti.track_mode; in pkt_probe_settings()
1837 pd->settings.block_mode = PACKET_BLOCK_MODE1; in pkt_probe_settings()
1840 pd->settings.block_mode = PACKET_BLOCK_MODE2; in pkt_probe_settings()
1844 return -EROFS; in pkt_probe_settings()
1862 cgc.buflen = pd->mode_offset + 12; in pkt_write_caching()
1873 buf[pd->mode_offset + 10] |= (!!set << 2); in pkt_write_caching()
1907 cap_buf = &buf[sizeof(struct mode_page_header) + pd->mode_offset]; in pkt_get_max_speed()
1913 cgc.buflen = pd->mode_offset + cap_buf[1] + 2 + in pkt_get_max_speed()
1939 /* These tables from cdrecord - I don't have orange book */
1940 /* standard speed CD-RW (1-4x) */
1945 /* high speed CD-RW (-10x) */
1950 /* ultra high speed CD-RW */
1996 pkt_notice(pd, "disc type is not CD-RW\n"); in pkt_media_speed()
2004 st = (buf[6] >> 3) & 0x7; /* disc sub-type */ in pkt_media_speed()
2020 pkt_notice(pd, "unknown disc sub-type %d\n", st); in pkt_media_speed()
2027 pkt_notice(pd, "unknown speed %d for sub-type %d\n", sp, st); in pkt_media_speed()
2065 return -EIO; in pkt_open_write()
2073 switch (pd->mmc3_profile) { in pkt_open_write()
2074 case 0x13: /* DVD-RW */ in pkt_open_write()
2076 case 0x12: /* DVD-RAM */ in pkt_open_write()
2092 return -EIO; in pkt_open_write()
2094 pd->write_speed = write_speed; in pkt_open_write()
2095 pd->read_speed = read_speed; in pkt_open_write()
2116 * We need to re-open the cdrom device without O_NONBLOCK to be able in pkt_open_dev()
2120 bdev = blkdev_get_by_dev(pd->bdev->bd_dev, FMODE_READ | FMODE_EXCL, pd); in pkt_open_dev()
2132 set_capacity(pd->disk, lba << 2); in pkt_open_dev()
2133 set_capacity(pd->bdev->bd_disk, lba << 2); in pkt_open_dev()
2134 bd_set_nr_sectors(pd->bdev, lba << 2); in pkt_open_dev()
2136 q = bdev_get_queue(pd->bdev); in pkt_open_dev()
2145 blk_queue_max_hw_sectors(q, pd->settings.size); in pkt_open_dev()
2146 set_bit(PACKET_WRITABLE, &pd->flags); in pkt_open_dev()
2149 clear_bit(PACKET_WRITABLE, &pd->flags); in pkt_open_dev()
2159 ret = -ENOMEM; in pkt_open_dev()
2185 blkdev_put(pd->bdev, FMODE_READ | FMODE_EXCL); in pkt_release_dev()
2206 pd = pkt_find_dev_from_minor(MINOR(bdev->bd_dev)); in pkt_open()
2208 ret = -ENODEV; in pkt_open()
2211 BUG_ON(pd->refcnt < 0); in pkt_open()
2213 pd->refcnt++; in pkt_open()
2214 if (pd->refcnt > 1) { in pkt_open()
2216 !test_bit(PACKET_WRITABLE, &pd->flags)) { in pkt_open()
2217 ret = -EBUSY; in pkt_open()
2236 pd->refcnt--; in pkt_open()
2245 struct pktcdvd_device *pd = disk->private_data; in pkt_close()
2249 pd->refcnt--; in pkt_close()
2250 BUG_ON(pd->refcnt < 0); in pkt_close()
2251 if (pd->refcnt == 0) { in pkt_close()
2252 int flush = test_bit(PACKET_WRITABLE, &pd->flags); in pkt_close()
2262 struct packet_stacked_data *psd = bio->bi_private; in pkt_end_io_read_cloned()
2263 struct pktcdvd_device *pd = psd->pd; in pkt_end_io_read_cloned()
2265 psd->bio->bi_status = bio->bi_status; in pkt_end_io_read_cloned()
2267 bio_endio(psd->bio); in pkt_end_io_read_cloned()
2277 psd->pd = pd; in pkt_make_request_read()
2278 psd->bio = bio; in pkt_make_request_read()
2279 bio_set_dev(cloned_bio, pd->bdev); in pkt_make_request_read()
2280 cloned_bio->bi_private = psd; in pkt_make_request_read()
2281 cloned_bio->bi_end_io = pkt_end_io_read_cloned; in pkt_make_request_read()
2282 pd->stats.secs_r += bio_sectors(bio); in pkt_make_request_read()
2288 struct pktcdvd_device *pd = q->queuedata; in pkt_make_request_write()
2294 zone = get_zone(bio->bi_iter.bi_sector, pd); in pkt_make_request_write()
2300 spin_lock(&pd->cdrw.active_list_lock); in pkt_make_request_write()
2302 list_for_each_entry(pkt, &pd->cdrw.pkt_active_list, list) { in pkt_make_request_write()
2303 if (pkt->sector == zone) { in pkt_make_request_write()
2304 spin_lock(&pkt->lock); in pkt_make_request_write()
2305 if ((pkt->state == PACKET_WAITING_STATE) || in pkt_make_request_write()
2306 (pkt->state == PACKET_READ_WAIT_STATE)) { in pkt_make_request_write()
2307 bio_list_add(&pkt->orig_bios, bio); in pkt_make_request_write()
2308 pkt->write_size += in pkt_make_request_write()
2309 bio->bi_iter.bi_size / CD_FRAMESIZE; in pkt_make_request_write()
2310 if ((pkt->write_size >= pkt->frames) && in pkt_make_request_write()
2311 (pkt->state == PACKET_WAITING_STATE)) { in pkt_make_request_write()
2312 atomic_inc(&pkt->run_sm); in pkt_make_request_write()
2313 wake_up(&pd->wqueue); in pkt_make_request_write()
2315 spin_unlock(&pkt->lock); in pkt_make_request_write()
2316 spin_unlock(&pd->cdrw.active_list_lock); in pkt_make_request_write()
2321 spin_unlock(&pkt->lock); in pkt_make_request_write()
2324 spin_unlock(&pd->cdrw.active_list_lock); in pkt_make_request_write()
2327 * Test if there is enough room left in the bio work queue in pkt_make_request_write()
2331 spin_lock(&pd->lock); in pkt_make_request_write()
2332 if (pd->write_congestion_on > 0 in pkt_make_request_write()
2333 && pd->bio_queue_size >= pd->write_congestion_on) { in pkt_make_request_write()
2334 set_bdi_congested(q->backing_dev_info, BLK_RW_ASYNC); in pkt_make_request_write()
2336 spin_unlock(&pd->lock); in pkt_make_request_write()
2338 spin_lock(&pd->lock); in pkt_make_request_write()
2339 } while(pd->bio_queue_size > pd->write_congestion_off); in pkt_make_request_write()
2341 spin_unlock(&pd->lock); in pkt_make_request_write()
2346 node = mempool_alloc(&pd->rb_pool, GFP_NOIO); in pkt_make_request_write()
2347 node->bio = bio; in pkt_make_request_write()
2348 spin_lock(&pd->lock); in pkt_make_request_write()
2349 BUG_ON(pd->bio_queue_size < 0); in pkt_make_request_write()
2350 was_empty = (pd->bio_queue_size == 0); in pkt_make_request_write()
2352 spin_unlock(&pd->lock); in pkt_make_request_write()
2357 atomic_set(&pd->scan_queue, 1); in pkt_make_request_write()
2360 wake_up(&pd->wqueue); in pkt_make_request_write()
2361 } else if (!list_empty(&pd->cdrw.pkt_free_list) && !blocked_bio) { in pkt_make_request_write()
2366 wake_up(&pd->wqueue); in pkt_make_request_write()
2378 pd = bio->bi_disk->queue->queuedata; in pkt_submit_bio()
2385 (unsigned long long)bio->bi_iter.bi_sector, in pkt_submit_bio()
2396 if (!test_bit(PACKET_WRITABLE, &pd->flags)) { in pkt_submit_bio()
2398 (unsigned long long)bio->bi_iter.bi_sector); in pkt_submit_bio()
2402 if (!bio->bi_iter.bi_size || (bio->bi_iter.bi_size % CD_FRAMESIZE)) { in pkt_submit_bio()
2408 sector_t zone = get_zone(bio->bi_iter.bi_sector, pd); in pkt_submit_bio()
2409 sector_t last_zone = get_zone(bio_end_sector(bio) - 1, pd); in pkt_submit_bio()
2412 BUG_ON(last_zone != zone + pd->settings.size); in pkt_submit_bio()
2414 split = bio_split(bio, last_zone - in pkt_submit_bio()
2415 bio->bi_iter.bi_sector, in pkt_submit_bio()
2422 pkt_make_request_write(bio->bi_disk->queue, split); in pkt_submit_bio()
2433 struct request_queue *q = pd->disk->queue; in pkt_init_queue()
2437 q->queuedata = pd; in pkt_init_queue()
2442 struct pktcdvd_device *pd = m->private; in pkt_seq_show()
2447 seq_printf(m, "Writer %s mapped to %s:\n", pd->name, in pkt_seq_show()
2448 bdevname(pd->bdev, bdev_buf)); in pkt_seq_show()
2451 seq_printf(m, "\tpacket size:\t\t%dkB\n", pd->settings.size / 2); in pkt_seq_show()
2453 if (pd->settings.write_type == 0) in pkt_seq_show()
2459 seq_printf(m, "\tpacket type:\t\t%s\n", pd->settings.fp ? "Fixed" : "Variable"); in pkt_seq_show()
2460 seq_printf(m, "\tlink loss:\t\t%d\n", pd->settings.link_loss); in pkt_seq_show()
2462 seq_printf(m, "\ttrack mode:\t\t%d\n", pd->settings.track_mode); in pkt_seq_show()
2464 if (pd->settings.block_mode == PACKET_BLOCK_MODE1) in pkt_seq_show()
2466 else if (pd->settings.block_mode == PACKET_BLOCK_MODE2) in pkt_seq_show()
2473 seq_printf(m, "\tpackets started:\t%lu\n", pd->stats.pkt_started); in pkt_seq_show()
2474 seq_printf(m, "\tpackets ended:\t\t%lu\n", pd->stats.pkt_ended); in pkt_seq_show()
2475 seq_printf(m, "\twritten:\t\t%lukB\n", pd->stats.secs_w >> 1); in pkt_seq_show()
2476 seq_printf(m, "\tread gather:\t\t%lukB\n", pd->stats.secs_rg >> 1); in pkt_seq_show()
2477 seq_printf(m, "\tread:\t\t\t%lukB\n", pd->stats.secs_r >> 1); in pkt_seq_show()
2480 seq_printf(m, "\treference count:\t%d\n", pd->refcnt); in pkt_seq_show()
2481 seq_printf(m, "\tflags:\t\t\t0x%lx\n", pd->flags); in pkt_seq_show()
2482 seq_printf(m, "\tread speed:\t\t%ukB/s\n", pd->read_speed); in pkt_seq_show()
2483 seq_printf(m, "\twrite speed:\t\t%ukB/s\n", pd->write_speed); in pkt_seq_show()
2484 seq_printf(m, "\tstart offset:\t\t%lu\n", pd->offset); in pkt_seq_show()
2485 seq_printf(m, "\tmode page offset:\t%u\n", pd->mode_offset); in pkt_seq_show()
2488 seq_printf(m, "\tbios queued:\t\t%d\n", pd->bio_queue_size); in pkt_seq_show()
2489 seq_printf(m, "\tbios pending:\t\t%d\n", atomic_read(&pd->cdrw.pending_bios)); in pkt_seq_show()
2490 seq_printf(m, "\tcurrent sector:\t\t0x%llx\n", (unsigned long long)pd->current_sector); in pkt_seq_show()
2497 pd->write_congestion_off, in pkt_seq_show()
2498 pd->write_congestion_on); in pkt_seq_show()
2508 if (pd->pkt_dev == dev) { in pkt_new_dev()
2510 return -EBUSY; in pkt_new_dev()
2516 if (pd2->bdev->bd_dev == dev) { in pkt_new_dev()
2518 bdevname(pd2->bdev, b)); in pkt_new_dev()
2519 return -EBUSY; in pkt_new_dev()
2521 if (pd2->pkt_dev == dev) { in pkt_new_dev()
2523 return -EBUSY; in pkt_new_dev()
2532 return -EINVAL; in pkt_new_dev()
2538 pd->bdev = bdev; in pkt_new_dev()
2543 atomic_set(&pd->cdrw.pending_bios, 0); in pkt_new_dev()
2544 pd->cdrw.thread = kthread_run(kcdrwd, pd, "%s", pd->name); in pkt_new_dev()
2545 if (IS_ERR(pd->cdrw.thread)) { in pkt_new_dev()
2550 proc_create_single_data(pd->name, 0, pkt_proc, pkt_seq_show, pd); in pkt_new_dev()
2558 return -ENOMEM; in pkt_new_dev()
2563 struct pktcdvd_device *pd = bdev->bd_disk->private_data; in pkt_ioctl()
2567 cmd, MAJOR(bdev->bd_dev), MINOR(bdev->bd_dev)); in pkt_ioctl()
2574 * have to unlock it or else the eject command fails. in pkt_ioctl()
2576 if (pd->refcnt == 1) in pkt_ioctl()
2580 * forward selected CDROM ioctls to CD-ROM, for UDF in pkt_ioctl()
2587 ret = __blkdev_driver_ioctl(pd->bdev, mode, cmd, arg); in pkt_ioctl()
2592 ret = -ENOTTY; in pkt_ioctl()
2602 struct pktcdvd_device *pd = disk->private_data; in pkt_check_events()
2607 if (!pd->bdev) in pkt_check_events()
2609 attached_disk = pd->bdev->bd_disk; in pkt_check_events()
2610 if (!attached_disk || !attached_disk->fops->check_events) in pkt_check_events()
2612 return attached_disk->fops->check_events(attached_disk, clearing); in pkt_check_events()
2617 return kasprintf(GFP_KERNEL, "pktcdvd/%s", disk->disk_name); in pkt_devnode()
2632 * Set up mapping from pktcdvd device to CD-ROM device.
2637 int ret = -ENOMEM; in pkt_setup_dev()
2648 ret = -EBUSY; in pkt_setup_dev()
2656 ret = mempool_init_kmalloc_pool(&pd->rb_pool, PKT_RB_POOL_SIZE, in pkt_setup_dev()
2661 INIT_LIST_HEAD(&pd->cdrw.pkt_free_list); in pkt_setup_dev()
2662 INIT_LIST_HEAD(&pd->cdrw.pkt_active_list); in pkt_setup_dev()
2663 spin_lock_init(&pd->cdrw.active_list_lock); in pkt_setup_dev()
2665 spin_lock_init(&pd->lock); in pkt_setup_dev()
2666 spin_lock_init(&pd->iosched.lock); in pkt_setup_dev()
2667 bio_list_init(&pd->iosched.read_queue); in pkt_setup_dev()
2668 bio_list_init(&pd->iosched.write_queue); in pkt_setup_dev()
2669 sprintf(pd->name, DRIVER_NAME"%d", idx); in pkt_setup_dev()
2670 init_waitqueue_head(&pd->wqueue); in pkt_setup_dev()
2671 pd->bio_queue = RB_ROOT; in pkt_setup_dev()
2673 pd->write_congestion_on = write_congestion_on; in pkt_setup_dev()
2674 pd->write_congestion_off = write_congestion_off; in pkt_setup_dev()
2676 ret = -ENOMEM; in pkt_setup_dev()
2680 pd->disk = disk; in pkt_setup_dev()
2681 disk->major = pktdev_major; in pkt_setup_dev()
2682 disk->first_minor = idx; in pkt_setup_dev()
2683 disk->fops = &pktcdvd_ops; in pkt_setup_dev()
2684 disk->flags = GENHD_FL_REMOVABLE; in pkt_setup_dev()
2685 strcpy(disk->disk_name, pd->name); in pkt_setup_dev()
2686 disk->private_data = pd; in pkt_setup_dev()
2687 disk->queue = blk_alloc_queue(NUMA_NO_NODE); in pkt_setup_dev()
2688 if (!disk->queue) in pkt_setup_dev()
2691 pd->pkt_dev = MKDEV(pktdev_major, idx); in pkt_setup_dev()
2697 disk->events = pd->bdev->bd_disk->events; in pkt_setup_dev()
2706 *pkt_dev = pd->pkt_dev; in pkt_setup_dev()
2714 mempool_exit(&pd->rb_pool); in pkt_setup_dev()
2723 * Tear down mapping from pktcdvd device to CD-ROM device.
2735 if (pd && (pd->pkt_dev == pkt_dev)) in pkt_remove_dev()
2740 ret = -ENXIO; in pkt_remove_dev()
2744 if (pd->refcnt > 0) { in pkt_remove_dev()
2745 ret = -EBUSY; in pkt_remove_dev()
2748 if (!IS_ERR(pd->cdrw.thread)) in pkt_remove_dev()
2749 kthread_stop(pd->cdrw.thread); in pkt_remove_dev()
2756 blkdev_put(pd->bdev, FMODE_READ | FMODE_NDELAY); in pkt_remove_dev()
2758 remove_proc_entry(pd->name, pkt_proc); in pkt_remove_dev()
2761 del_gendisk(pd->disk); in pkt_remove_dev()
2762 blk_cleanup_queue(pd->disk->queue); in pkt_remove_dev()
2763 put_disk(pd->disk); in pkt_remove_dev()
2765 mempool_exit(&pd->rb_pool); in pkt_remove_dev()
2782 pd = pkt_find_dev_from_minor(ctrl_cmd->dev_index); in pkt_get_status()
2784 ctrl_cmd->dev = new_encode_dev(pd->bdev->bd_dev); in pkt_get_status()
2785 ctrl_cmd->pkt_dev = new_encode_dev(pd->pkt_dev); in pkt_get_status()
2787 ctrl_cmd->dev = 0; in pkt_get_status()
2788 ctrl_cmd->pkt_dev = 0; in pkt_get_status()
2790 ctrl_cmd->num_devices = MAX_WRITERS; in pkt_get_status()
2803 return -ENOTTY; in pkt_ctl_ioctl()
2806 return -EFAULT; in pkt_ctl_ioctl()
2811 return -EPERM; in pkt_ctl_ioctl()
2817 return -EPERM; in pkt_ctl_ioctl()
2824 return -ENOTTY; in pkt_ctl_ioctl()
2828 return -EFAULT; in pkt_ctl_ioctl()
2920 MODULE_DESCRIPTION("Packet writing layer for CD/DVD drives");