]> git.ipfire.org Git - people/pmueller/ipfire-2.x.git/blobdiff - src/patches/suse-2.6.27.31/patches.fixes/sd-needs-updating
Reenabled linux-xen, added patches for Xen Kernel Version 2.6.27.31,
[people/pmueller/ipfire-2.x.git] / src / patches / suse-2.6.27.31 / patches.fixes / sd-needs-updating
diff --git a/src/patches/suse-2.6.27.31/patches.fixes/sd-needs-updating b/src/patches/suse-2.6.27.31/patches.fixes/sd-needs-updating
new file mode 100644 (file)
index 0000000..1da0a6b
--- /dev/null
@@ -0,0 +1,104 @@
+Subject: Driver 'sd' needs updating
+From: Hannes Reinecke <hare@suse.de>
+Date: Tue Oct 7 16:17:19 2008 +0200:
+Git: 2ec147acf8022cc363266fde3e8f5f89149926c8
+References: bnc#406656
+
+If a driver sets blk_queue_prep_rq(), it should clean it up itself, 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().
+
+Signed-off-by: Hannes Reinecke <hare@suse.de>
+Signed-off-by: Kay Sievers <kay.sievers@vrfy.org>
+
+---
+ drivers/scsi/scsi_lib.c    |    1 +
+ drivers/scsi/scsi_priv.h   |    1 -
+ drivers/scsi/scsi_sysfs.c  |   17 -----------------
+ drivers/scsi/sd.c          |    2 ++
+ drivers/scsi/sr.c          |    1 +
+ include/scsi/scsi_driver.h |    1 +
+ 6 files changed, 5 insertions(+), 18 deletions(-)
+
+--- a/drivers/scsi/scsi_lib.c
++++ b/drivers/scsi/scsi_lib.c
+@@ -1338,6 +1338,7 @@ int scsi_prep_fn(struct request_queue *q
+               ret = scsi_setup_blk_pc_cmnd(sdev, req);
+       return scsi_prep_return(q, req, ret);
+ }
++EXPORT_SYMBOL(scsi_prep_fn);
+ /*
+  * scsi_dev_queue_ready: if we can send requests to sdev, return 1 else
+--- a/drivers/scsi/scsi_priv.h
++++ b/drivers/scsi/scsi_priv.h
+@@ -74,7 +74,6 @@ extern int scsi_init_queue(void);
+ extern void scsi_exit_queue(void);
+ struct request_queue;
+ struct request;
+-extern int scsi_prep_fn(struct request_queue *, struct request *);
+ extern struct kmem_cache *scsi_sdb_cache;
+ /* scsi_proc.c */
+--- a/drivers/scsi/scsi_sysfs.c
++++ b/drivers/scsi/scsi_sysfs.c
+@@ -420,29 +420,12 @@ static int scsi_bus_resume(struct device
+       return err;
+ }
+-static int scsi_bus_remove(struct device *dev)
+-{
+-      struct device_driver *drv = dev->driver;
+-      struct scsi_device *sdev = to_scsi_device(dev);
+-      int err = 0;
+-
+-      /* reset the prep_fn back to the default since the
+-       * driver may have altered it and it's being removed */
+-      blk_queue_prep_rq(sdev->request_queue, scsi_prep_fn);
+-
+-      if (drv && drv->remove)
+-              err = drv->remove(dev);
+-
+-      return 0;
+-}
+-
+ struct bus_type scsi_bus_type = {
+         .name         = "scsi",
+         .match                = scsi_bus_match,
+       .uevent         = scsi_bus_uevent,
+       .suspend        = scsi_bus_suspend,
+       .resume         = scsi_bus_resume,
+-      .remove         = scsi_bus_remove,
+ };
+ EXPORT_SYMBOL_GPL(scsi_bus_type);
+--- a/drivers/scsi/sd.c
++++ b/drivers/scsi/sd.c
+@@ -1914,6 +1914,8 @@ static int sd_remove(struct device *dev)
+ {
+       struct scsi_disk *sdkp = dev_get_drvdata(dev);
++      blk_queue_prep_rq(sdkp->device->request_queue, scsi_prep_fn);
++
+       device_del(&sdkp->dev);
+       del_gendisk(sdkp->disk);
+       sd_shutdown(dev);
+--- a/drivers/scsi/sr.c
++++ b/drivers/scsi/sr.c
+@@ -895,6 +895,7 @@ static int sr_remove(struct device *dev)
+ {
+       struct scsi_cd *cd = dev_get_drvdata(dev);
++      blk_queue_prep_rq(cd->device->request_queue, scsi_prep_fn);
+       del_gendisk(cd->disk);
+       mutex_lock(&sr_ref_mutex);
+--- a/include/scsi/scsi_driver.h
++++ b/include/scsi/scsi_driver.h
+@@ -32,5 +32,6 @@ int scsi_setup_blk_pc_cmnd(struct scsi_d
+ int scsi_setup_fs_cmnd(struct scsi_device *sdev, struct request *req);
+ int scsi_prep_state_check(struct scsi_device *sdev, struct request *req);
+ int scsi_prep_return(struct request_queue *q, struct request *req, int ret);
++int scsi_prep_fn(struct request_queue *, struct request *);
+ #endif /* _SCSI_SCSI_DRIVER_H */