Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

sd, sr: fix Driver 'sd' needs updating message

If a SCSI ULD driver sets blk_queue_prep_rq(), it should clean it
up itself on remove(), and not from the bus callbacks. This
removes the need to hook into bus->remove(), which should not
be used at the same time as driver->remove().

[jejb: fix sdkp initialisation problem due to mismerge]
Signed-off-by: Hannes Reinecke <hare@suse.de>
Signed-off-by: Kay Sievers <kay.sievers@vrfy.org>
Signed-off-by: James Bottomley <James.Bottomley@HansenPartnership.com>

authored by

Hannes Reinecke and committed by
James Bottomley
b391277a 24add1c4

+4 -18
+1
drivers/scsi/scsi_lib.c
··· 1207 1207 ret = scsi_setup_blk_pc_cmnd(sdev, req); 1208 1208 return scsi_prep_return(q, req, ret); 1209 1209 } 1210 + EXPORT_SYMBOL(scsi_prep_fn); 1210 1211 1211 1212 /* 1212 1213 * scsi_dev_queue_ready: if we can send requests to sdev, return 1 else
-1
drivers/scsi/scsi_priv.h
··· 87 87 extern void scsi_exit_queue(void); 88 88 struct request_queue; 89 89 struct request; 90 - extern int scsi_prep_fn(struct request_queue *, struct request *); 91 90 extern struct kmem_cache *scsi_sdb_cache; 92 91 93 92 /* scsi_proc.c */
-17
drivers/scsi/scsi_sysfs.c
··· 420 420 return err; 421 421 } 422 422 423 - static int scsi_bus_remove(struct device *dev) 424 - { 425 - struct device_driver *drv = dev->driver; 426 - struct scsi_device *sdev = to_scsi_device(dev); 427 - int err = 0; 428 - 429 - /* reset the prep_fn back to the default since the 430 - * driver may have altered it and it's being removed */ 431 - blk_queue_prep_rq(sdev->request_queue, scsi_prep_fn); 432 - 433 - if (drv && drv->remove) 434 - err = drv->remove(dev); 435 - 436 - return 0; 437 - } 438 - 439 423 struct bus_type scsi_bus_type = { 440 424 .name = "scsi", 441 425 .match = scsi_bus_match, 442 426 .uevent = scsi_bus_uevent, 443 427 .suspend = scsi_bus_suspend, 444 428 .resume = scsi_bus_resume, 445 - .remove = scsi_bus_remove, 446 429 }; 447 430 EXPORT_SYMBOL_GPL(scsi_bus_type); 448 431
+1
drivers/scsi/sd.c
··· 2123 2123 2124 2124 async_synchronize_full(); 2125 2125 sdkp = dev_get_drvdata(dev); 2126 + blk_queue_prep_rq(sdkp->device->request_queue, scsi_prep_fn); 2126 2127 device_del(&sdkp->dev); 2127 2128 del_gendisk(sdkp->disk); 2128 2129 sd_shutdown(dev);
+1
drivers/scsi/sr.c
··· 881 881 { 882 882 struct scsi_cd *cd = dev_get_drvdata(dev); 883 883 884 + blk_queue_prep_rq(cd->device->request_queue, scsi_prep_fn); 884 885 del_gendisk(cd->disk); 885 886 886 887 mutex_lock(&sr_ref_mutex);
+1
include/scsi/scsi_driver.h
··· 32 32 int scsi_setup_fs_cmnd(struct scsi_device *sdev, struct request *req); 33 33 int scsi_prep_state_check(struct scsi_device *sdev, struct request *req); 34 34 int scsi_prep_return(struct request_queue *q, struct request *req, int ret); 35 + int scsi_prep_fn(struct request_queue *, struct request *); 35 36 36 37 #endif /* _SCSI_SCSI_DRIVER_H */