libata: clear drvdata in ata_host_release(), take#2

Clearing drvdata in ->remove_one causes NULL pointer deference. Clear
drvdata only in ata_host_release() after all resources are freed.

Signed-off-by: Tejun Heo <htejun@gmail.com>
Signed-off-by: Jeff Garzik <jeff@garzik.org>

authored by Tejun Heo and committed by Jeff Garzik 1aa56cca 7b965e08

+2 -4
+2 -1
drivers/ata/libata-core.c
··· 5680 5681 if (host->ops->host_stop) 5682 host->ops->host_stop(host); 5683 } 5684 5685 /** ··· 5904 5905 err_out: 5906 devres_release_group(dev, ata_device_add); 5907 - dev_set_drvdata(dev, NULL); 5908 VPRINTK("EXIT, returning %d\n", rc); 5909 return 0; 5910 }
··· 5680 5681 if (host->ops->host_stop) 5682 host->ops->host_stop(host); 5683 + 5684 + dev_set_drvdata(gendev, NULL); 5685 } 5686 5687 /** ··· 5902 5903 err_out: 5904 devres_release_group(dev, ata_device_add); 5905 VPRINTK("EXIT, returning %d\n", rc); 5906 return 0; 5907 }
-1
drivers/ata/pata_cs5520.c
··· 306 struct ata_host *host = dev_get_drvdata(dev); 307 308 ata_host_detach(host); 309 - dev_set_drvdata(dev, NULL); 310 } 311 312 /**
··· 306 struct ata_host *host = dev_get_drvdata(dev); 307 308 ata_host_detach(host); 309 } 310 311 /**
-1
drivers/ata/pata_isapnp.c
··· 128 struct ata_host *host = dev_get_drvdata(dev); 129 130 ata_host_detach(host); 131 - dev_set_drvdata(dev, NULL); 132 } 133 134 static struct pnp_device_id isapnp_devices[] = {
··· 128 struct ata_host *host = dev_get_drvdata(dev); 129 130 ata_host_detach(host); 131 } 132 133 static struct pnp_device_id isapnp_devices[] = {
-1
drivers/ata/pata_platform.c
··· 228 struct ata_host *host = dev_get_drvdata(dev); 229 230 ata_host_detach(host); 231 - dev_set_drvdata(dev, NULL); 232 233 return 0; 234 }
··· 228 struct ata_host *host = dev_get_drvdata(dev); 229 230 ata_host_detach(host); 231 232 return 0; 233 }