[SCSI] a4000t, zorro7xx, mvme16x, bvme6000,sim710: xxx_device_remove seems buggy
Fix drivers misusing dev_to_shost Some drivers were using dev_to_shost to go from a struct device to the corresponding shost. Unfortunately, dev_to_shost only looks up the tree to find an shost (it's designed to go from a scsi_device or a scsi_target to the parent scsi_host), and these drivers were calling it with the parent of the scsi_host. I've fixed this by saving a pointer to the Scsi_Host in the drvdata, which matches what most scsi drivers do. Signed-off-by: Matthew Wilcox <matthew@wil.cx> Cc: Geert Uytterhoeven <geert@linux-m68k.org> Signed-off-by: James Bottomley <James.Bottomley@SteelEye.com>
This commit is contained in:
parent
88e2f98e1b
commit
3ac709c113
|
@ -79,6 +79,7 @@ static int __devinit a4000t_probe(struct device *dev)
|
||||||
goto out_put_host;
|
goto out_put_host;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
dev_set_drvdata(dev, host);
|
||||||
scsi_scan_host(host);
|
scsi_scan_host(host);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -95,7 +96,7 @@ static int __devinit a4000t_probe(struct device *dev)
|
||||||
|
|
||||||
static __devexit int a4000t_device_remove(struct device *dev)
|
static __devexit int a4000t_device_remove(struct device *dev)
|
||||||
{
|
{
|
||||||
struct Scsi_Host *host = dev_to_shost(dev);
|
struct Scsi_Host *host = dev_get_drvdata(dev);
|
||||||
struct NCR_700_Host_Parameters *hostdata = shost_priv(host);
|
struct NCR_700_Host_Parameters *hostdata = shost_priv(host);
|
||||||
|
|
||||||
scsi_remove_host(host);
|
scsi_remove_host(host);
|
||||||
|
|
|
@ -74,6 +74,7 @@ bvme6000_probe(struct device *dev)
|
||||||
goto out_put_host;
|
goto out_put_host;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
dev_set_drvdata(dev, host);
|
||||||
scsi_scan_host(host);
|
scsi_scan_host(host);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -89,7 +90,7 @@ bvme6000_probe(struct device *dev)
|
||||||
static __devexit int
|
static __devexit int
|
||||||
bvme6000_device_remove(struct device *dev)
|
bvme6000_device_remove(struct device *dev)
|
||||||
{
|
{
|
||||||
struct Scsi_Host *host = dev_to_shost(dev);
|
struct Scsi_Host *host = dev_get_drvdata(dev);
|
||||||
struct NCR_700_Host_Parameters *hostdata = shost_priv(host);
|
struct NCR_700_Host_Parameters *hostdata = shost_priv(host);
|
||||||
|
|
||||||
scsi_remove_host(host);
|
scsi_remove_host(host);
|
||||||
|
|
|
@ -89,6 +89,7 @@ mvme16x_probe(struct device *dev)
|
||||||
out_be32(0xfff4202c, v);
|
out_be32(0xfff4202c, v);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
dev_set_drvdata(dev, host);
|
||||||
scsi_scan_host(host);
|
scsi_scan_host(host);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -104,7 +105,7 @@ mvme16x_probe(struct device *dev)
|
||||||
static __devexit int
|
static __devexit int
|
||||||
mvme16x_device_remove(struct device *dev)
|
mvme16x_device_remove(struct device *dev)
|
||||||
{
|
{
|
||||||
struct Scsi_Host *host = dev_to_shost(dev);
|
struct Scsi_Host *host = dev_get_drvdata(dev);
|
||||||
struct NCR_700_Host_Parameters *hostdata = shost_priv(host);
|
struct NCR_700_Host_Parameters *hostdata = shost_priv(host);
|
||||||
|
|
||||||
/* Disable scsi chip ints */
|
/* Disable scsi chip ints */
|
||||||
|
|
|
@ -139,6 +139,7 @@ sim710_probe_common(struct device *dev, unsigned long base_addr,
|
||||||
goto out_put_host;
|
goto out_put_host;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
dev_set_drvdata(dev, host);
|
||||||
scsi_scan_host(host);
|
scsi_scan_host(host);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -156,7 +157,7 @@ sim710_probe_common(struct device *dev, unsigned long base_addr,
|
||||||
static __devexit int
|
static __devexit int
|
||||||
sim710_device_remove(struct device *dev)
|
sim710_device_remove(struct device *dev)
|
||||||
{
|
{
|
||||||
struct Scsi_Host *host = dev_to_shost(dev);
|
struct Scsi_Host *host = dev_get_drvdata(dev);
|
||||||
struct NCR_700_Host_Parameters *hostdata =
|
struct NCR_700_Host_Parameters *hostdata =
|
||||||
(struct NCR_700_Host_Parameters *)host->hostdata[0];
|
(struct NCR_700_Host_Parameters *)host->hostdata[0];
|
||||||
|
|
||||||
|
|
|
@ -130,6 +130,7 @@ static int __devinit zorro7xx_init_one(struct zorro_dev *z,
|
||||||
goto out_put_host;
|
goto out_put_host;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
zorro_set_drvdata(z, host);
|
||||||
scsi_scan_host(host);
|
scsi_scan_host(host);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -148,7 +149,7 @@ static int __devinit zorro7xx_init_one(struct zorro_dev *z,
|
||||||
|
|
||||||
static __devexit void zorro7xx_remove_one(struct zorro_dev *z)
|
static __devexit void zorro7xx_remove_one(struct zorro_dev *z)
|
||||||
{
|
{
|
||||||
struct Scsi_Host *host = dev_to_shost(&z->dev);
|
struct Scsi_Host *host = zorro_get_drvdata(z);
|
||||||
struct NCR_700_Host_Parameters *hostdata = shost_priv(host);
|
struct NCR_700_Host_Parameters *hostdata = shost_priv(host);
|
||||||
|
|
||||||
scsi_remove_host(host);
|
scsi_remove_host(host);
|
||||||
|
|
Loading…
Reference in New Issue