diff options
-rw-r--r-- | drivers/scsi/scsi_lib.c | 2 | ||||
-rw-r--r-- | drivers/scsi/scsi_priv.h | 3 | ||||
-rw-r--r-- | drivers/scsi/scsi_sysfs.c | 17 |
3 files changed, 21 insertions, 1 deletions
diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c index 0e81e4cf8876..a9ac5b1b1667 100644 --- a/drivers/scsi/scsi_lib.c +++ b/drivers/scsi/scsi_lib.c | |||
@@ -1332,7 +1332,7 @@ int scsi_prep_return(struct request_queue *q, struct request *req, int ret) | |||
1332 | } | 1332 | } |
1333 | EXPORT_SYMBOL(scsi_prep_return); | 1333 | EXPORT_SYMBOL(scsi_prep_return); |
1334 | 1334 | ||
1335 | static int scsi_prep_fn(struct request_queue *q, struct request *req) | 1335 | int scsi_prep_fn(struct request_queue *q, struct request *req) |
1336 | { | 1336 | { |
1337 | struct scsi_device *sdev = q->queuedata; | 1337 | struct scsi_device *sdev = q->queuedata; |
1338 | int ret = BLKPREP_KILL; | 1338 | int ret = BLKPREP_KILL; |
diff --git a/drivers/scsi/scsi_priv.h b/drivers/scsi/scsi_priv.h index eff005951895..3f34e9376b0a 100644 --- a/drivers/scsi/scsi_priv.h +++ b/drivers/scsi/scsi_priv.h | |||
@@ -74,6 +74,9 @@ extern struct request_queue *scsi_alloc_queue(struct scsi_device *sdev); | |||
74 | extern void scsi_free_queue(struct request_queue *q); | 74 | extern void scsi_free_queue(struct request_queue *q); |
75 | extern int scsi_init_queue(void); | 75 | extern int scsi_init_queue(void); |
76 | extern void scsi_exit_queue(void); | 76 | extern void scsi_exit_queue(void); |
77 | struct request_queue; | ||
78 | struct request; | ||
79 | extern int scsi_prep_fn(struct request_queue *, struct request *); | ||
77 | 80 | ||
78 | /* scsi_proc.c */ | 81 | /* scsi_proc.c */ |
79 | #ifdef CONFIG_SCSI_PROC_FS | 82 | #ifdef CONFIG_SCSI_PROC_FS |
diff --git a/drivers/scsi/scsi_sysfs.c b/drivers/scsi/scsi_sysfs.c index f374fdcb6815..00b386677392 100644 --- a/drivers/scsi/scsi_sysfs.c +++ b/drivers/scsi/scsi_sysfs.c | |||
@@ -373,12 +373,29 @@ static int scsi_bus_resume(struct device * dev) | |||
373 | return err; | 373 | return err; |
374 | } | 374 | } |
375 | 375 | ||
376 | static int scsi_bus_remove(struct device *dev) | ||
377 | { | ||
378 | struct device_driver *drv = dev->driver; | ||
379 | struct scsi_device *sdev = to_scsi_device(dev); | ||
380 | int err = 0; | ||
381 | |||
382 | /* reset the prep_fn back to the default since the | ||
383 | * driver may have altered it and it's being removed */ | ||
384 | blk_queue_prep_rq(sdev->request_queue, scsi_prep_fn); | ||
385 | |||
386 | if (drv && drv->remove) | ||
387 | err = drv->remove(dev); | ||
388 | |||
389 | return 0; | ||
390 | } | ||
391 | |||
376 | struct bus_type scsi_bus_type = { | 392 | struct bus_type scsi_bus_type = { |
377 | .name = "scsi", | 393 | .name = "scsi", |
378 | .match = scsi_bus_match, | 394 | .match = scsi_bus_match, |
379 | .uevent = scsi_bus_uevent, | 395 | .uevent = scsi_bus_uevent, |
380 | .suspend = scsi_bus_suspend, | 396 | .suspend = scsi_bus_suspend, |
381 | .resume = scsi_bus_resume, | 397 | .resume = scsi_bus_resume, |
398 | .remove = scsi_bus_remove, | ||
382 | }; | 399 | }; |
383 | 400 | ||
384 | int scsi_sysfs_register(void) | 401 | int scsi_sysfs_register(void) |