block: add a cdrom_device_info pointer to struct gendisk
authorChristoph Hellwig <hch@lst.de>
Sat, 25 Apr 2020 07:57:00 +0000 (09:57 +0200)
committerJens Axboe <axboe@kernel.dk>
Mon, 4 May 2020 16:13:42 +0000 (10:13 -0600)
Add a pointer to the CDROM information structure to struct gendisk.
This will allow various removable media file systems to call directly
into the CDROM layer instead of abusing ioctls with kernel pointers.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Damien Le Moal <damien.lemoal@wdc.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
drivers/block/paride/pcd.c
drivers/cdrom/cdrom.c
drivers/cdrom/gdrom.c
drivers/ide/ide-cd.c
drivers/scsi/sr.c
include/linux/cdrom.h
include/linux/genhd.h

index cda5cf917e9afaee700470b00e26d8aaeb7fffef..5124eca90e833717fe62b29dc765a04f9a288a40 100644 (file)
@@ -1032,7 +1032,7 @@ static int __init pcd_init(void)
 
        for (unit = 0, cd = pcd; unit < PCD_UNITS; unit++, cd++) {
                if (cd->present) {
-                       register_cdrom(&cd->info);
+                       register_cdrom(cd->disk, &cd->info);
                        cd->disk->private_data = cd;
                        add_disk(cd->disk);
                }
index faca0f346fff2afe0afff8c593fffe71e9884156..a1d2112fd283f072861b37c2376ea182f5c0bbc5 100644 (file)
@@ -586,7 +586,7 @@ static int cdrom_mrw_set_lba_space(struct cdrom_device_info *cdi, int space)
        return 0;
 }
 
-int register_cdrom(struct cdrom_device_info *cdi)
+int register_cdrom(struct gendisk *disk, struct cdrom_device_info *cdi)
 {
        static char banner_printed;
        const struct cdrom_device_ops *cdo = cdi->ops;
@@ -601,6 +601,9 @@ int register_cdrom(struct cdrom_device_info *cdi)
                cdrom_sysctl_register();
        }
 
+       cdi->disk = disk;
+       disk->cdi = cdi;
+
        ENSURE(cdo, drive_status, CDC_DRIVE_STATUS);
        if (cdo->check_events == NULL && cdo->media_changed == NULL)
                WARN_ON_ONCE(cdo->capability & (CDC_MEDIA_CHANGED | CDC_SELECT_DISC));
index c51292c2a131e0133872258e11470b6c5c58b73a..09b0cd292720fab25fa64d9fb3e4f0adc88a8cbc 100644 (file)
@@ -770,7 +770,7 @@ static int probe_gdrom(struct platform_device *devptr)
                goto probe_fail_no_disk;
        }
        probe_gdrom_setupdisk();
-       if (register_cdrom(gd.cd_info)) {
+       if (register_cdrom(gd.disk, gd.cd_info)) {
                err = -ENODEV;
                goto probe_fail_cdrom_register;
        }
index dcf8b51b47fda9f10b91a1ffbbccde87d14e79b0..40e124eb918aad86edcbd8e6fe37243252d833f8 100644 (file)
@@ -1305,8 +1305,7 @@ static int ide_cdrom_register(ide_drive_t *drive, int nslots)
        if (drive->atapi_flags & IDE_AFLAG_NO_SPEED_SELECT)
                devinfo->mask |= CDC_SELECT_SPEED;
 
-       devinfo->disk = info->disk;
-       return register_cdrom(devinfo);
+       return register_cdrom(info->disk, devinfo);
 }
 
 static int ide_cdrom_probe_capabilities(ide_drive_t *drive)
index d2fe3fa470f95fb1d0a872d0c0763b4c075a9b9f..f9b589d60a46088d9a5e34bca215f0eaa2b1998c 100644 (file)
@@ -794,9 +794,8 @@ static int sr_probe(struct device *dev)
        set_capacity(disk, cd->capacity);
        disk->private_data = &cd->driver;
        disk->queue = sdev->request_queue;
-       cd->cdi.disk = disk;
 
-       if (register_cdrom(&cd->cdi))
+       if (register_cdrom(disk, &cd->cdi))
                goto fail_put;
 
        /*
index 528271c60018277870b7b91f9912b59ff84f753c..4f74ce050253d5d7165b8d4779182da842ecbff0 100644 (file)
@@ -104,7 +104,7 @@ extern unsigned int cdrom_check_events(struct cdrom_device_info *cdi,
                                       unsigned int clearing);
 extern int cdrom_media_changed(struct cdrom_device_info *);
 
-extern int register_cdrom(struct cdrom_device_info *cdi);
+extern int register_cdrom(struct gendisk *disk, struct cdrom_device_info *cdi);
 extern void unregister_cdrom(struct cdrom_device_info *cdi);
 
 typedef struct {
index 058d895544c75ae63c5f6fb17ff1bd1ebd006e29..f9c226f9546afe4ea17296a34b35e9f7b9ae1ebe 100644 (file)
@@ -217,11 +217,20 @@ struct gendisk {
 #ifdef  CONFIG_BLK_DEV_INTEGRITY
        struct kobject integrity_kobj;
 #endif /* CONFIG_BLK_DEV_INTEGRITY */
+#if IS_ENABLED(CONFIG_CDROM)
+       struct cdrom_device_info *cdi;
+#endif
        int node_id;
        struct badblocks *bb;
        struct lockdep_map lockdep_map;
 };
 
+#if IS_REACHABLE(CONFIG_CDROM)
+#define disk_to_cdi(disk)      ((disk)->cdi)
+#else
+#define disk_to_cdi(disk)      NULL
+#endif
+
 static inline struct gendisk *part_to_disk(struct hd_struct *part)
 {
        if (likely(part)) {