aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/scsi
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@woody.linux-foundation.org>2008-01-03 14:59:27 -0500
committerLinus Torvalds <torvalds@woody.linux-foundation.org>2008-01-03 14:59:27 -0500
commit3a62b5f3cdaa00413e25fa6d6b6816e2c67f92f6 (patch)
tree949e577cdb14a51de5075505502ed30d277f5c50 /drivers/scsi
parentb8c9a18712f7b617fda66d878ce3759c9e575ba0 (diff)
parent751bf4d7865e4ced406be93b04c7436d866d3684 (diff)
Merge git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi-rc-fixes-2.6
* git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi-rc-fixes-2.6: [SCSI] scsi_sysfs: restore prep_fn when ULD is removed
Diffstat (limited to 'drivers/scsi')
-rw-r--r--drivers/scsi/scsi_lib.c2
-rw-r--r--drivers/scsi/scsi_priv.h3
-rw-r--r--drivers/scsi/scsi_sysfs.c17
3 files changed, 21 insertions, 1 deletions
diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c
index 8df8267ce316..60f77c4b3946 100644
--- a/drivers/scsi/scsi_lib.c
+++ b/drivers/scsi/scsi_lib.c
@@ -1346,7 +1346,7 @@ int scsi_prep_return(struct request_queue *q, struct request *req, int ret)
1346} 1346}
1347EXPORT_SYMBOL(scsi_prep_return); 1347EXPORT_SYMBOL(scsi_prep_return);
1348 1348
1349static int scsi_prep_fn(struct request_queue *q, struct request *req) 1349int scsi_prep_fn(struct request_queue *q, struct request *req)
1350{ 1350{
1351 struct scsi_device *sdev = q->queuedata; 1351 struct scsi_device *sdev = q->queuedata;
1352 int ret = BLKPREP_KILL; 1352 int ret = BLKPREP_KILL;
diff --git a/drivers/scsi/scsi_priv.h b/drivers/scsi/scsi_priv.h
index ee8efe849bf4..1de52b6ded40 100644
--- a/drivers/scsi/scsi_priv.h
+++ b/drivers/scsi/scsi_priv.h
@@ -73,6 +73,9 @@ extern struct request_queue *scsi_alloc_queue(struct scsi_device *sdev);
73extern void scsi_free_queue(struct request_queue *q); 73extern void scsi_free_queue(struct request_queue *q);
74extern int scsi_init_queue(void); 74extern int scsi_init_queue(void);
75extern void scsi_exit_queue(void); 75extern void scsi_exit_queue(void);
76struct request_queue;
77struct request;
78extern int scsi_prep_fn(struct request_queue *, struct request *);
76 79
77/* scsi_proc.c */ 80/* scsi_proc.c */
78#ifdef CONFIG_SCSI_PROC_FS 81#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
376static 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
376struct bus_type scsi_bus_type = { 392struct 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
384int scsi_sysfs_register(void) 401int scsi_sysfs_register(void)