scsi: don't use disk->private_data to find the scsi_driver
authorChristoph Hellwig <hch@lst.de>
Tue, 8 Mar 2022 05:51:49 +0000 (06:51 +0100)
committerJens Axboe <axboe@kernel.dk>
Wed, 9 Mar 2022 02:40:00 +0000 (19:40 -0700)
Requiring every ULP to have the scsi_drive as first member of the
private data is rather fragile and not necessary anyway.  Just use
the driver hanging off the SCSI device instead.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Bart Van Assche <bvanassche@acm.org>
Reviewed-by: Chaitanya Kulkarni <kch@nvidia.com>
Reviewed-by: Ming Lei <ming.lei@redhat.com>
Reviewed-by: Martin K. Petersen <martin.petersen@oracle.com>
Link: https://lore.kernel.org/r/20220308055200.735835-4-hch@lst.de
Signed-off-by: Jens Axboe <axboe@kernel.dk>
drivers/scsi/sd.c
drivers/scsi/sd.h
drivers/scsi/sr.c
drivers/scsi/sr.h
drivers/scsi/st.c
drivers/scsi/st.h
include/scsi/scsi_cmnd.h
include/scsi/scsi_driver.h

index 2d648d2..2a1e19e 100644 (file)
@@ -3515,7 +3515,6 @@ static int sd_probe(struct device *dev)
        }
 
        sdkp->device = sdp;
-       sdkp->driver = &sd_template;
        sdkp->disk = gd;
        sdkp->index = index;
        sdkp->max_retries = SD_MAX_RETRIES;
@@ -3548,7 +3547,7 @@ static int sd_probe(struct device *dev)
        gd->minors = SD_MINORS;
 
        gd->fops = &sd_fops;
-       gd->private_data = &sdkp->driver;
+       gd->private_data = sdkp;
 
        /* defaults, until the device tells us otherwise */
        sdp->sector_size = 512;
index 2e5932b..303aa1c 100644 (file)
@@ -68,7 +68,6 @@ enum {
 };
 
 struct scsi_disk {
-       struct scsi_driver *driver;     /* always &sd_template */
        struct scsi_device *device;
        struct device   dev;
        struct gendisk  *disk;
@@ -131,7 +130,7 @@ struct scsi_disk {
 
 static inline struct scsi_disk *scsi_disk(struct gendisk *disk)
 {
-       return container_of(disk->private_data, struct scsi_disk, driver);
+       return disk->private_data;
 }
 
 #define sd_printk(prefix, sdsk, fmt, a...)                             \
index f925b1f..569bda7 100644 (file)
@@ -147,7 +147,7 @@ static void sr_kref_release(struct kref *kref);
 
 static inline struct scsi_cd *scsi_cd(struct gendisk *disk)
 {
-       return container_of(disk->private_data, struct scsi_cd, driver);
+       return disk->private_data;
 }
 
 static int sr_runtime_suspend(struct device *dev)
@@ -692,7 +692,6 @@ static int sr_probe(struct device *dev)
 
        cd->device = sdev;
        cd->disk = disk;
-       cd->driver = &sr_template;
        cd->capacity = 0x1fffff;
        cd->device->changed = 1;        /* force recheck CD type */
        cd->media_present = 1;
@@ -713,7 +712,7 @@ static int sr_probe(struct device *dev)
        sr_vendor_init(cd);
 
        set_capacity(disk, cd->capacity);
-       disk->private_data = &cd->driver;
+       disk->private_data = cd;
 
        if (register_cdrom(disk, &cd->cdi))
                goto fail_minor;
index 1609f02..d80af3f 100644 (file)
@@ -32,7 +32,6 @@ struct scsi_device;
 
 
 typedef struct scsi_cd {
-       struct scsi_driver *driver;
        unsigned capacity;      /* size in blocks                       */
        struct scsi_device *device;
        unsigned int vendor;    /* vendor code, see sr_vendor.c         */
index e869e90..ebe9412 100644 (file)
@@ -4276,7 +4276,6 @@ static int st_probe(struct device *dev)
                goto out_buffer_free;
        }
        kref_init(&tpnt->kref);
-       tpnt->driver = &st_template;
 
        tpnt->device = SDp;
        if (SDp->scsi_level <= 2)
index c0ef0d9..7a68eab 100644 (file)
@@ -117,7 +117,6 @@ struct scsi_tape_stats {
 
 /* The tape drive descriptor */
 struct scsi_tape {
-       struct scsi_driver *driver;
        struct scsi_device *device;
        struct mutex lock;      /* For serialization */
        struct completion wait; /* For SCSI commands */
index 6794d73..e3a4c67 100644 (file)
@@ -13,7 +13,6 @@
 #include <scsi/scsi_request.h>
 
 struct Scsi_Host;
-struct scsi_driver;
 
 /*
  * MAX_COMMAND_SIZE is:
@@ -159,14 +158,6 @@ static inline void *scsi_cmd_priv(struct scsi_cmnd *cmd)
        return cmd + 1;
 }
 
-/* make sure not to use it with passthrough commands */
-static inline struct scsi_driver *scsi_cmd_to_driver(struct scsi_cmnd *cmd)
-{
-       struct request *rq = scsi_cmd_to_rq(cmd);
-
-       return *(struct scsi_driver **)rq->q->disk->private_data;
-}
-
 void scsi_done(struct scsi_cmnd *cmd);
 
 extern void scsi_finish_command(struct scsi_cmnd *cmd);
index 6dffa85..4ce1988 100644 (file)
@@ -4,11 +4,10 @@
 
 #include <linux/blk_types.h>
 #include <linux/device.h>
+#include <scsi/scsi_cmnd.h>
 
 struct module;
 struct request;
-struct scsi_cmnd;
-struct scsi_device;
 
 struct scsi_driver {
        struct device_driver    gendrv;
@@ -31,4 +30,10 @@ extern int scsi_register_interface(struct class_interface *);
 #define scsi_unregister_interface(intf) \
        class_interface_unregister(intf)
 
+/* make sure not to use it with passthrough commands */
+static inline struct scsi_driver *scsi_cmd_to_driver(struct scsi_cmnd *cmd)
+{
+       return to_scsi_driver(cmd->device->sdev_gendev.driver);
+}
+
 #endif /* _SCSI_SCSI_DRIVER_H */