diff options
author | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2008-01-03 14:59:27 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2008-01-03 14:59:27 -0500 |
commit | 3a62b5f3cdaa00413e25fa6d6b6816e2c67f92f6 (patch) | |
tree | 949e577cdb14a51de5075505502ed30d277f5c50 /drivers | |
parent | b8c9a18712f7b617fda66d878ce3759c9e575ba0 (diff) | |
parent | 751bf4d7865e4ced406be93b04c7436d866d3684 (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')
-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 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 | } |
1347 | EXPORT_SYMBOL(scsi_prep_return); | 1347 | EXPORT_SYMBOL(scsi_prep_return); |
1348 | 1348 | ||
1349 | static int scsi_prep_fn(struct request_queue *q, struct request *req) | 1349 | int 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); | |||
73 | extern void scsi_free_queue(struct request_queue *q); | 73 | extern void scsi_free_queue(struct request_queue *q); |
74 | extern int scsi_init_queue(void); | 74 | extern int scsi_init_queue(void); |
75 | extern void scsi_exit_queue(void); | 75 | extern void scsi_exit_queue(void); |
76 | struct request_queue; | ||
77 | struct request; | ||
78 | extern 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 | ||
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) |