hc
2024-05-14 bedbef8ad3e75a304af6361af235302bcc61d06b
kernel/drivers/block/pktcdvd.c
....@@ -36,7 +36,7 @@
3636 * block device, assembling the pieces to full packets and queuing them to the
3737 * packet I/O scheduler.
3838 *
39
- * At the top layer there is a custom make_request_fn function that forwards
39
+ * At the top layer there is a custom ->submit_bio function that forwards
4040 * read requests directly to the iosched queue and puts write requests in the
4141 * unaligned write queue. A kernel thread performs the necessary read
4242 * gathering to convert the unaligned writes to aligned writes and then feeds
....@@ -913,7 +913,7 @@
913913 }
914914
915915 atomic_inc(&pd->cdrw.pending_bios);
916
- generic_make_request(bio);
916
+ submit_bio_noacct(bio);
917917 }
918918 }
919919
....@@ -1080,65 +1080,6 @@
10801080 } else {
10811081 list_add_tail(&pkt->list, &pd->cdrw.pkt_free_list);
10821082 }
1083
-}
1084
-
1085
-/*
1086
- * recover a failed write, query for relocation if possible
1087
- *
1088
- * returns 1 if recovery is possible, or 0 if not
1089
- *
1090
- */
1091
-static int pkt_start_recovery(struct packet_data *pkt)
1092
-{
1093
- /*
1094
- * FIXME. We need help from the file system to implement
1095
- * recovery handling.
1096
- */
1097
- return 0;
1098
-#if 0
1099
- struct request *rq = pkt->rq;
1100
- struct pktcdvd_device *pd = rq->rq_disk->private_data;
1101
- struct block_device *pkt_bdev;
1102
- struct super_block *sb = NULL;
1103
- unsigned long old_block, new_block;
1104
- sector_t new_sector;
1105
-
1106
- pkt_bdev = bdget(kdev_t_to_nr(pd->pkt_dev));
1107
- if (pkt_bdev) {
1108
- sb = get_super(pkt_bdev);
1109
- bdput(pkt_bdev);
1110
- }
1111
-
1112
- if (!sb)
1113
- return 0;
1114
-
1115
- if (!sb->s_op->relocate_blocks)
1116
- goto out;
1117
-
1118
- old_block = pkt->sector / (CD_FRAMESIZE >> 9);
1119
- if (sb->s_op->relocate_blocks(sb, old_block, &new_block))
1120
- goto out;
1121
-
1122
- new_sector = new_block * (CD_FRAMESIZE >> 9);
1123
- pkt->sector = new_sector;
1124
-
1125
- bio_reset(pkt->bio);
1126
- bio_set_dev(pkt->bio, pd->bdev);
1127
- bio_set_op_attrs(pkt->bio, REQ_OP_WRITE, 0);
1128
- pkt->bio->bi_iter.bi_sector = new_sector;
1129
- pkt->bio->bi_iter.bi_size = pkt->frames * CD_FRAMESIZE;
1130
- pkt->bio->bi_vcnt = pkt->frames;
1131
-
1132
- pkt->bio->bi_end_io = pkt_end_io_packet_write;
1133
- pkt->bio->bi_private = pkt;
1134
-
1135
- drop_super(sb);
1136
- return 1;
1137
-
1138
-out:
1139
- drop_super(sb);
1140
- return 0;
1141
-#endif
11421083 }
11431084
11441085 static inline void pkt_set_state(struct packet_data *pkt, enum packet_data_state state)
....@@ -1357,12 +1298,8 @@
13571298 break;
13581299
13591300 case PACKET_RECOVERY_STATE:
1360
- if (pkt_start_recovery(pkt)) {
1361
- pkt_start_write(pd, pkt);
1362
- } else {
1363
- pkt_dbg(2, pd, "No recovery possible\n");
1364
- pkt_set_state(pkt, PACKET_FINISHED_STATE);
1365
- }
1301
+ pkt_dbg(2, pd, "No recovery possible\n");
1302
+ pkt_set_state(pkt, PACKET_FINISHED_STATE);
13661303 break;
13671304
13681305 case PACKET_FINISHED_STATE:
....@@ -1613,7 +1550,7 @@
16131550 disc_information di;
16141551 track_information ti;
16151552 __u32 last_track;
1616
- int ret = -1;
1553
+ int ret;
16171554
16181555 ret = pkt_get_disc_info(pd, &di);
16191556 if (ret)
....@@ -2173,16 +2110,18 @@
21732110 int ret;
21742111 long lba;
21752112 struct request_queue *q;
2113
+ struct block_device *bdev;
21762114
21772115 /*
21782116 * We need to re-open the cdrom device without O_NONBLOCK to be able
21792117 * to read/write from/to it. It is already opened in O_NONBLOCK mode
2180
- * so bdget() can't fail.
2118
+ * so open should not fail.
21812119 */
2182
- bdget(pd->bdev->bd_dev);
2183
- ret = blkdev_get(pd->bdev, FMODE_READ | FMODE_EXCL, pd);
2184
- if (ret)
2120
+ bdev = blkdev_get_by_dev(pd->bdev->bd_dev, FMODE_READ | FMODE_EXCL, pd);
2121
+ if (IS_ERR(bdev)) {
2122
+ ret = PTR_ERR(bdev);
21852123 goto out;
2124
+ }
21862125
21872126 ret = pkt_get_last_written(pd, &lba);
21882127 if (ret) {
....@@ -2192,7 +2131,7 @@
21922131
21932132 set_capacity(pd->disk, lba << 2);
21942133 set_capacity(pd->bdev->bd_disk, lba << 2);
2195
- bd_set_size(pd->bdev, (loff_t)lba << 11);
2134
+ bd_set_nr_sectors(pd->bdev, lba << 2);
21962135
21972136 q = bdev_get_queue(pd->bdev);
21982137 if (write) {
....@@ -2203,9 +2142,7 @@
22032142 * Some CDRW drives can not handle writes larger than one packet,
22042143 * even if the size is a multiple of the packet size.
22052144 */
2206
- spin_lock_irq(q->queue_lock);
22072145 blk_queue_max_hw_sectors(q, pd->settings.size);
2208
- spin_unlock_irq(q->queue_lock);
22092146 set_bit(PACKET_WRITABLE, &pd->flags);
22102147 } else {
22112148 pkt_set_speed(pd, MAX_SPEED, MAX_SPEED);
....@@ -2228,7 +2165,7 @@
22282165 return 0;
22292166
22302167 out_putdev:
2231
- blkdev_put(pd->bdev, FMODE_READ | FMODE_EXCL);
2168
+ blkdev_put(bdev, FMODE_READ | FMODE_EXCL);
22322169 out:
22332170 return ret;
22342171 }
....@@ -2430,15 +2367,15 @@
24302367 }
24312368 }
24322369
2433
-static blk_qc_t pkt_make_request(struct request_queue *q, struct bio *bio)
2370
+static blk_qc_t pkt_submit_bio(struct bio *bio)
24342371 {
24352372 struct pktcdvd_device *pd;
24362373 char b[BDEVNAME_SIZE];
24372374 struct bio *split;
24382375
2439
- blk_queue_split(q, &bio);
2376
+ blk_queue_split(&bio);
24402377
2441
- pd = q->queuedata;
2378
+ pd = bio->bi_disk->queue->queuedata;
24422379 if (!pd) {
24432380 pr_err("%s incorrect request queue\n", bio_devname(bio, b));
24442381 goto end_io;
....@@ -2482,7 +2419,7 @@
24822419 split = bio;
24832420 }
24842421
2485
- pkt_make_request_write(q, split);
2422
+ pkt_make_request_write(bio->bi_disk->queue, split);
24862423 } while (split != bio);
24872424
24882425 return BLK_QC_T_NONE;
....@@ -2495,7 +2432,6 @@
24952432 {
24962433 struct request_queue *q = pd->disk->queue;
24972434
2498
- blk_queue_make_request(q, pkt_make_request);
24992435 blk_queue_logical_block_size(q, CD_FRAMESIZE);
25002436 blk_queue_max_hw_sectors(q, PACKET_MAX_SECTORS);
25012437 q->queuedata = pd;
....@@ -2566,7 +2502,6 @@
25662502 static int pkt_new_dev(struct pktcdvd_device *pd, dev_t dev)
25672503 {
25682504 int i;
2569
- int ret = 0;
25702505 char b[BDEVNAME_SIZE];
25712506 struct block_device *bdev;
25722507
....@@ -2589,12 +2524,9 @@
25892524 }
25902525 }
25912526
2592
- bdev = bdget(dev);
2593
- if (!bdev)
2594
- return -ENOMEM;
2595
- ret = blkdev_get(bdev, FMODE_READ | FMODE_NDELAY, NULL);
2596
- if (ret)
2597
- return ret;
2527
+ bdev = blkdev_get_by_dev(dev, FMODE_READ | FMODE_NDELAY, NULL);
2528
+ if (IS_ERR(bdev))
2529
+ return PTR_ERR(bdev);
25982530 if (!blk_queue_scsi_passthrough(bdev_get_queue(bdev))) {
25992531 blkdev_put(bdev, FMODE_READ | FMODE_NDELAY);
26002532 return -EINVAL;
....@@ -2612,7 +2544,6 @@
26122544 pd->cdrw.thread = kthread_run(kcdrwd, pd, "%s", pd->name);
26132545 if (IS_ERR(pd->cdrw.thread)) {
26142546 pkt_err(pd, "can't start kernel thread\n");
2615
- ret = -ENOMEM;
26162547 goto out_mem;
26172548 }
26182549
....@@ -2624,7 +2555,7 @@
26242555 blkdev_put(bdev, FMODE_READ | FMODE_NDELAY);
26252556 /* This is safe: open() is still holding a reference. */
26262557 module_put(THIS_MODULE);
2627
- return ret;
2558
+ return -ENOMEM;
26282559 }
26292560
26302561 static int pkt_ioctl(struct block_device *bdev, fmode_t mode, unsigned int cmd, unsigned long arg)
....@@ -2644,7 +2575,7 @@
26442575 */
26452576 if (pd->refcnt == 1)
26462577 pkt_lock_door(pd, 0);
2647
- /* fallthru */
2578
+ fallthrough;
26482579 /*
26492580 * forward selected CDROM ioctls to CD-ROM, for UDF
26502581 */
....@@ -2681,18 +2612,21 @@
26812612 return attached_disk->fops->check_events(attached_disk, clearing);
26822613 }
26832614
2615
+static char *pkt_devnode(struct gendisk *disk, umode_t *mode)
2616
+{
2617
+ return kasprintf(GFP_KERNEL, "pktcdvd/%s", disk->disk_name);
2618
+}
2619
+
26842620 static const struct block_device_operations pktcdvd_ops = {
26852621 .owner = THIS_MODULE,
2622
+ .submit_bio = pkt_submit_bio,
26862623 .open = pkt_open,
26872624 .release = pkt_close,
26882625 .ioctl = pkt_ioctl,
2626
+ .compat_ioctl = blkdev_compat_ptr_ioctl,
26892627 .check_events = pkt_check_events,
2628
+ .devnode = pkt_devnode,
26902629 };
2691
-
2692
-static char *pktcdvd_devnode(struct gendisk *gd, umode_t *mode)
2693
-{
2694
- return kasprintf(GFP_KERNEL, "pktcdvd/%s", gd->disk_name);
2695
-}
26962630
26972631 /*
26982632 * Set up mapping from pktcdvd device to CD-ROM device.
....@@ -2749,9 +2683,8 @@
27492683 disk->fops = &pktcdvd_ops;
27502684 disk->flags = GENHD_FL_REMOVABLE;
27512685 strcpy(disk->disk_name, pd->name);
2752
- disk->devnode = pktcdvd_devnode;
27532686 disk->private_data = pd;
2754
- disk->queue = blk_alloc_queue(GFP_KERNEL);
2687
+ disk->queue = blk_alloc_queue(NUMA_NO_NODE);
27552688 if (!disk->queue)
27562689 goto out_mem2;
27572690
....@@ -2762,7 +2695,6 @@
27622695
27632696 /* inherit events of the host device */
27642697 disk->events = pd->bdev->bd_disk->events;
2765
- disk->async_events = pd->bdev->bd_disk->async_events;
27662698
27672699 add_disk(disk);
27682700