aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/scsi/libsas/sas_discover.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/scsi/libsas/sas_discover.c')
-rw-r--r--drivers/scsi/libsas/sas_discover.c11
1 files changed, 6 insertions, 5 deletions
diff --git a/drivers/scsi/libsas/sas_discover.c b/drivers/scsi/libsas/sas_discover.c
index 658f16cc2f03..13b5891f9961 100644
--- a/drivers/scsi/libsas/sas_discover.c
+++ b/drivers/scsi/libsas/sas_discover.c
@@ -151,6 +151,7 @@ static int sas_get_port_device(struct asd_sas_port *port)
151 sas_device_set_phy(dev, port->port); 151 sas_device_set_phy(dev, port->port);
152 152
153 dev->rphy = rphy; 153 dev->rphy = rphy;
154 get_device(&dev->rphy->dev);
154 155
155 if (dev_is_sata(dev) || dev->dev_type == SAS_END_DEV) 156 if (dev_is_sata(dev) || dev->dev_type == SAS_END_DEV)
156 list_add_tail(&dev->disco_list_node, &port->disco_list); 157 list_add_tail(&dev->disco_list_node, &port->disco_list);
@@ -255,6 +256,9 @@ void sas_free_device(struct kref *kref)
255{ 256{
256 struct domain_device *dev = container_of(kref, typeof(*dev), kref); 257 struct domain_device *dev = container_of(kref, typeof(*dev), kref);
257 258
259 put_device(&dev->rphy->dev);
260 dev->rphy = NULL;
261
258 if (dev->parent) 262 if (dev->parent)
259 sas_put_device(dev->parent); 263 sas_put_device(dev->parent);
260 264
@@ -301,7 +305,6 @@ static void sas_destruct_devices(struct work_struct *work)
301 305
302 sas_remove_children(&dev->rphy->dev); 306 sas_remove_children(&dev->rphy->dev);
303 sas_rphy_delete(dev->rphy); 307 sas_rphy_delete(dev->rphy);
304 dev->rphy = NULL;
305 sas_unregister_common_dev(port, dev); 308 sas_unregister_common_dev(port, dev);
306 } 309 }
307} 310}
@@ -313,11 +316,11 @@ void sas_unregister_dev(struct asd_sas_port *port, struct domain_device *dev)
313 /* this rphy never saw sas_rphy_add */ 316 /* this rphy never saw sas_rphy_add */
314 list_del_init(&dev->disco_list_node); 317 list_del_init(&dev->disco_list_node);
315 sas_rphy_free(dev->rphy); 318 sas_rphy_free(dev->rphy);
316 dev->rphy = NULL;
317 sas_unregister_common_dev(port, dev); 319 sas_unregister_common_dev(port, dev);
320 return;
318 } 321 }
319 322
320 if (dev->rphy && !test_and_set_bit(SAS_DEV_DESTROY, &dev->state)) { 323 if (!test_and_set_bit(SAS_DEV_DESTROY, &dev->state)) {
321 sas_rphy_unlink(dev->rphy); 324 sas_rphy_unlink(dev->rphy);
322 list_move_tail(&dev->disco_list_node, &port->destroy_list); 325 list_move_tail(&dev->disco_list_node, &port->destroy_list);
323 sas_discover_event(dev->port, DISCE_DESTRUCT); 326 sas_discover_event(dev->port, DISCE_DESTRUCT);
@@ -417,8 +420,6 @@ static void sas_discover_domain(struct work_struct *work)
417 420
418 if (error) { 421 if (error) {
419 sas_rphy_free(dev->rphy); 422 sas_rphy_free(dev->rphy);
420 dev->rphy = NULL;
421
422 list_del_init(&dev->disco_list_node); 423 list_del_init(&dev->disco_list_node);
423 spin_lock_irq(&port->dev_list_lock); 424 spin_lock_irq(&port->dev_list_lock);
424 list_del_init(&dev->dev_list_node); 425 list_del_init(&dev->dev_list_node);