Skip to contentSkip to conversation

Driver 'sd' needs updating - please use bus_type methods

Bug 9872 [email protected] 4 participants 13 messages Feb 7, 2008 – Jan 19, 2010 1 message not in the archive SCSI

lore
Share & tools
lore
#1 lore raw
In reply to a message not in the archive

http://bugzilla.kernel.org/show_bug.cgi?id=9872

[email protected] changed:

What |Removed |Added
----------------------------------------------------------------------------

         AssignedTo|[email protected]         |scsi_drivers-other@kernel-
                   |                            |bugs.osdl.org
Signature · 3 lines
Configure bugmail: http://bugzilla.kernel.org/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are the assignee for the bug, or are watching the assignee.
#2 lore raw
In reply to a message not in the archive

http://bugzilla.kernel.org/show_bug.cgi?id=9872

[email protected] changed:

What |Removed |Added
----------------------------------------------------------------------------

         AssignedTo|scsi_drivers-other@kernel-  |[email protected]
                   |bugs.osdl.org               |
Signature · 3 lines
Configure bugmail: http://bugzilla.kernel.org/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are the assignee for the bug, or are watching the assignee.
maintainer
#3 lore raw
Quoted 1 line · On Sat, 2008-05-03 at 17:22 -0700, [email protected] wrote:

http://bugzilla.kernel.org/show_bug.cgi?id=9872

This isn't a bug. There have been numerous discussions about fixing it.

The warning comes out of here in drivers/base/driver.c:

	if ((drv->bus->probe && drv->probe) ||
	    (drv->bus->remove && drv->remove) ||
	    (drv->bus->shutdown && drv->shutdown))
		printk(KERN_WARNING "Driver '%s' needs updating - please use "
			"bus_type methods\n", drv->name);

The problem is that SCSI drivers have both: SCSI uses the bus methods to trigger the probe and remove (as it must having a bus method) but it also uses the individual struct driver probe and remove methods to rethrow the events to the ULDs.

According to Kay and Greg, this is a legitimate way of operating, and they're not going to remove the driver methods (otherwise we'd just take them into struct scsi_driver), so we're stuck trying to find a way to prevent the base warning about this.

James

#5 lore raw
In reply to a message not in the archive

http://bugzilla.kernel.org/show_bug.cgi?id=9872

------- Comment #1 from [email protected] 2008-05-04 07:34 -------
Reply-To: [email protected]

Quoted 1 line · On Sat, 2008-05-03 at 17:22 -0700, [email protected] wrote:

http://bugzilla.kernel.org/show_bug.cgi?id=9872

This isn't a bug. There have been numerous discussions about fixing it.

The warning comes out of here in drivers/base/driver.c:

        if ((drv->bus->probe && drv->probe) ||
            (drv->bus->remove && drv->remove) ||
            (drv->bus->shutdown && drv->shutdown))
                printk(KERN_WARNING "Driver '%s' needs updating - please use "
                        "bus_type methods\n", drv->name);

The problem is that SCSI drivers have both: SCSI uses the bus methods to trigger the probe and remove (as it must having a bus method) but it also uses the individual struct driver probe and remove methods to rethrow the events to the ULDs.

According to Kay and Greg, this is a legitimate way of operating, and they're not going to remove the driver methods (otherwise we'd just take them into struct scsi_driver), so we're stuck trying to find a way to prevent the base warning about this.

James

Signature · 3 lines
Configure bugmail: http://bugzilla.kernel.org/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are the assignee for the bug, or are watching the assignee.
#4 lore raw
In reply to James Bottomley
Quoted 5 lines · James Bottomley
Quoted 1 line · On Sat, 2008-05-03 at 17:22 -0700, [email protected] wrote:

http://bugzilla.kernel.org/show_bug.cgi?id=9872

This isn't a bug. There have been numerous discussions about fixing it.

It is a kind of a "bug". The core does not call driver functions, if bus_type is provided. So the warning is fine according to the current logic of the core, telling you it will ignore things a driver asked for.

Quoted 8 lines

The warning comes out of here in drivers/base/driver.c:

	if ((drv->bus->probe && drv->probe) ||
	    (drv->bus->remove && drv->remove) ||
	    (drv->bus->shutdown && drv->shutdown))
		printk(KERN_WARNING "Driver '%s' needs updating - please use "
			"bus_type methods\n", drv->name);
Quoted 4 lines

The problem is that SCSI drivers have both: SCSI uses the bus methods to trigger the probe and remove (as it must having a bus method) but it also uses the individual struct driver probe and remove methods to rethrow the events to the ULDs.

Looks like it does not use probe() on the bus. Now lets get rid of remove(). :)

Quoted 4 lines

According to Kay and Greg, this is a legitimate way of operating, and they're not going to remove the driver methods (otherwise we'd just take them into struct scsi_driver), so we're stuck trying to find a way to prevent the base warning about this.

Right, I guess, they are not going away, but you still should only use one of them, and not both at the same time.

How about the following patch? Which does not use driver core pointers, which are ignored by the core, to do private SCSI stuff.

Thanks,
Kay

From: Hannes Reinecke <[email protected]>
Subject: SCSI: do not use bus_type->remove() and driver->remove() at the same time

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().

---

 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(-)
drivers/scsi/scsi_lib.c +1 -0
index a82d2fe..16d21d2 100644
@@ -1267,6 +1267,7 @@ int scsi_prep_fn(struct request_queue *q, struct request *req)
 		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
drivers/scsi/scsi_priv.h +0 -1
index b33e725..8dd1e3b 100644
@@ -76,7 +76,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 *);
 
 /* scsi_proc.c */
 #ifdef CONFIG_SCSI_PROC_FS
drivers/scsi/scsi_sysfs.c +0 -17
index 049103f..ad0b88b 100644
@@ -410,29 +410,12 @@ static int scsi_bus_resume(struct device * dev)
 	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,
 };
 
 int scsi_sysfs_register(void)
drivers/scsi/sd.c +2 -0
index 01cefbb..672a17a 100644
@@ -1743,6 +1743,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);
drivers/scsi/sr.c +1 -0
index 7ee86d4..5860dc7 100644
@@ -901,6 +901,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);
include/scsi/scsi_driver.h +1 -0
index 1f5ca7f..9fd6702 100644
@@ -32,5 +32,6 @@ int scsi_setup_blk_pc_cmnd(struct scsi_device *sdev, struct request *req);
 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 */
#6 lore raw
In reply to a message not in the archive

http://bugzilla.kernel.org/show_bug.cgi?id=9872

------- Comment #2 from [email protected] 2008-05-05 09:24 -------

Quoted 5 lines · James Bottomley
Quoted 1 line · On Sat, 2008-05-03 at 17:22 -0700, [email protected] wrote:

http://bugzilla.kernel.org/show_bug.cgi?id=9872

This isn't a bug. There have been numerous discussions about fixing it.

It is a kind of a "bug". The core does not call driver functions, if bus_type is provided. So the warning is fine according to the current logic of the core, telling you it will ignore things a driver asked for.

Quoted 8 lines

The warning comes out of here in drivers/base/driver.c:

	if ((drv->bus->probe && drv->probe) ||
	    (drv->bus->remove && drv->remove) ||
	    (drv->bus->shutdown && drv->shutdown))
		printk(KERN_WARNING "Driver '%s' needs updating - please use "
			"bus_type methods\n", drv->name);
Quoted 4 lines

The problem is that SCSI drivers have both: SCSI uses the bus methods to trigger the probe and remove (as it must having a bus method) but it also uses the individual struct driver probe and remove methods to rethrow the events to the ULDs.

Looks like it does not use probe() on the bus. Now lets get rid of remove(). :)

Quoted 4 lines

According to Kay and Greg, this is a legitimate way of operating, and they're not going to remove the driver methods (otherwise we'd just take them into struct scsi_driver), so we're stuck trying to find a way to prevent the base warning about this.

Right, I guess, they are not going away, but you still should only use one of them, and not both at the same time.

How about the following patch? Which does not use driver core pointers, which are ignored by the core, to do private SCSI stuff.

Thanks,
Kay

From: Hannes Reinecke <[email protected]>
Subject: SCSI: do not use bus_type->remove() and driver->remove() at the same time

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().

---

 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(-)
drivers/scsi/scsi_lib.c +0 -0
index a82d2fe..16d21d2 100644
@@ -1267,6 +1267,7 @@ int scsi_prep_fn(struct request_queue *q, struct request

*req)

                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

drivers/scsi/scsi_priv.h +0 -1
index b33e725..8dd1e3b 100644
@@ -76,7 +76,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 *);
 
 /* scsi_proc.c */
 #ifdef CONFIG_SCSI_PROC_FS
drivers/scsi/scsi_sysfs.c +0 -17
index 049103f..ad0b88b 100644
@@ -410,29 +410,12 @@ static int scsi_bus_resume(struct device * dev)
        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,
 };
 
 int scsi_sysfs_register(void)
drivers/scsi/sd.c +2 -0
index 01cefbb..672a17a 100644
@@ -1743,6 +1743,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);
drivers/scsi/sr.c +1 -0
index 7ee86d4..5860dc7 100644
@@ -901,6 +901,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);
include/scsi/scsi_driver.h +0 -0
index 1f5ca7f..9fd6702 100644
@@ -32,5 +32,6 @@ int scsi_setup_blk_pc_cmnd(struct scsi_device *sdev, struct

request *req);
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 */

Signature · 3 lines
Configure bugmail: http://bugzilla.kernel.org/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are the assignee for the bug, or are watching the assignee.
#7 lore raw
In reply to a message not in the archive

http://bugzilla.kernel.org/show_bug.cgi?id=9872

[email protected] changed:

What |Removed |Added
----------------------------------------------------------------------------
CC| |[email protected]

------- Comment #3 from [email protected] 2008-06-01 23:46 ------- Russel, did you get chance to test Kay's patch in #2?

Are there plans to submit the patch?
Thanks.

Signature · 3 lines
Configure bugmail: http://bugzilla.kernel.org/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are the assignee for the bug, or are watching the assignee.
#8 lore raw
In reply to a message not in the archive

http://bugzilla.kernel.org/show_bug.cgi?id=9872

------- Comment #4 from [email protected] 2008-06-05 16:52 ------- (In reply to comment #3)

Quoted 1 line

Russel, did you get chance to test Kay's patch in #2?

I did. It worked. I had to patch the files by hand because
of some difference in version, I guess.

Signature · 3 lines
Configure bugmail: http://bugzilla.kernel.org/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are the assignee for the bug, or are watching the assignee.
#9 lore raw
In reply to a message not in the archive

http://bugzilla.kernel.org/show_bug.cgi?id=9872

[email protected] changed:

What |Removed |Added
----------------------------------------------------------------------------

             Status|CLOSED                      |REOPENED
         Resolution|CODE_FIX                    |

------- Comment #5 from [email protected] 2009-03-24 04:24 ------- Oops didn't mean to close this

Signature · 3 lines
Configure bugmail: http://bugzilla.kernel.org/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are the assignee for the bug, or are watching the assignee.
#10 lore raw
In reply to a message not in the archive

http://bugzilla.kernel.org/show_bug.cgi?id=9872

[email protected] changed:

What |Removed |Added
----------------------------------------------------------------------------

      KernelVersion|2.6.27                      |2.6.29
Signature · 3 lines
Configure bugmail: http://bugzilla.kernel.org/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are the assignee for the bug, or are watching the assignee.
#11 lore raw
In reply to a message not in the archive

http://bugzilla.kernel.org/show_bug.cgi?id=9872

[email protected] changed:

What |Removed |Added
----------------------------------------------------------------------------

             Status|NEW                         |CLOSED
      KernelVersion|2.6.24                      |2.6.27
         Resolution|                            |CODE_FIX
Signature · 3 lines
Configure bugmail: http://bugzilla.kernel.org/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are the assignee for the bug, or are watching the assignee.
#12 lore raw
In reply to a message not in the archive

http://bugzilla.kernel.org/show_bug.cgi?id=9872

Pacho Ramos <[email protected]> changed:

What |Removed |Added
----------------------------------------------------------------------------

                 CC|                            |[email protected]
                   |                            |ovi.es

--- Comment #6 from Pacho Ramos <[email protected]> 2009-07-18 12:34:56 --- I still get this with kernel-2.6.30 :-/

Signature · 3 lines
Configure bugmail: http://bugzilla.kernel.org/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are the assignee for the bug.
#13 lore raw
In reply to a message not in the archive

http://bugzilla.kernel.org/show_bug.cgi?id=9872

Alan <[email protected]> changed:

What |Removed |Added
----------------------------------------------------------------------------

                 CC|                            |[email protected]
     Kernel Version|2.6.29                      |2.6.30
         Regression|---                         |No
Signature · 3 lines
Configure bugmail: http://bugzilla.kernel.org/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are the assignee for the bug.