diff options
-rw-r--r-- | drivers/scsi/mvsas/mv_sas.c | 24 |
1 files changed, 14 insertions, 10 deletions
diff --git a/drivers/scsi/mvsas/mv_sas.c b/drivers/scsi/mvsas/mv_sas.c index 6c1f223a8e1d..ac52f7c99513 100644 --- a/drivers/scsi/mvsas/mv_sas.c +++ b/drivers/scsi/mvsas/mv_sas.c | |||
@@ -1344,19 +1344,23 @@ void mvs_dev_gone_notify(struct domain_device *dev) | |||
1344 | { | 1344 | { |
1345 | unsigned long flags = 0; | 1345 | unsigned long flags = 0; |
1346 | struct mvs_device *mvi_dev = dev->lldd_dev; | 1346 | struct mvs_device *mvi_dev = dev->lldd_dev; |
1347 | struct mvs_info *mvi = mvi_dev->mvi_info; | 1347 | struct mvs_info *mvi; |
1348 | |||
1349 | spin_lock_irqsave(&mvi->lock, flags); | ||
1350 | 1348 | ||
1351 | if (mvi_dev) { | 1349 | if (!mvi_dev) { |
1352 | mv_dprintk("found dev[%d:%x] is gone.\n", | ||
1353 | mvi_dev->device_id, mvi_dev->dev_type); | ||
1354 | mvs_release_task(mvi, dev); | ||
1355 | mvs_free_reg_set(mvi, mvi_dev); | ||
1356 | mvs_free_dev(mvi_dev); | ||
1357 | } else { | ||
1358 | mv_dprintk("found dev has gone.\n"); | 1350 | mv_dprintk("found dev has gone.\n"); |
1351 | return; | ||
1359 | } | 1352 | } |
1353 | |||
1354 | mvi = mvi_dev->mvi_info; | ||
1355 | |||
1356 | spin_lock_irqsave(&mvi->lock, flags); | ||
1357 | |||
1358 | mv_dprintk("found dev[%d:%x] is gone.\n", | ||
1359 | mvi_dev->device_id, mvi_dev->dev_type); | ||
1360 | mvs_release_task(mvi, dev); | ||
1361 | mvs_free_reg_set(mvi, mvi_dev); | ||
1362 | mvs_free_dev(mvi_dev); | ||
1363 | |||
1360 | dev->lldd_dev = NULL; | 1364 | dev->lldd_dev = NULL; |
1361 | mvi_dev->sas_device = NULL; | 1365 | mvi_dev->sas_device = NULL; |
1362 | 1366 | ||