diff options
| -rw-r--r-- | drivers/scsi/scsi_sysfs.c | 10 |
1 files changed, 8 insertions, 2 deletions
diff --git a/drivers/scsi/scsi_sysfs.c b/drivers/scsi/scsi_sysfs.c index bf53356f41f0..f796bd61f3f0 100644 --- a/drivers/scsi/scsi_sysfs.c +++ b/drivers/scsi/scsi_sysfs.c | |||
| @@ -1376,13 +1376,19 @@ static void __scsi_remove_target(struct scsi_target *starget) | |||
| 1376 | spin_lock_irqsave(shost->host_lock, flags); | 1376 | spin_lock_irqsave(shost->host_lock, flags); |
| 1377 | restart: | 1377 | restart: |
| 1378 | list_for_each_entry(sdev, &shost->__devices, siblings) { | 1378 | list_for_each_entry(sdev, &shost->__devices, siblings) { |
| 1379 | /* | ||
| 1380 | * We cannot call scsi_device_get() here, as | ||
| 1381 | * we might've been called from rmmod() causing | ||
| 1382 | * scsi_device_get() to fail the module_is_live() | ||
| 1383 | * check. | ||
| 1384 | */ | ||
| 1379 | if (sdev->channel != starget->channel || | 1385 | if (sdev->channel != starget->channel || |
| 1380 | sdev->id != starget->id || | 1386 | sdev->id != starget->id || |
| 1381 | scsi_device_get(sdev)) | 1387 | !get_device(&sdev->sdev_gendev)) |
| 1382 | continue; | 1388 | continue; |
| 1383 | spin_unlock_irqrestore(shost->host_lock, flags); | 1389 | spin_unlock_irqrestore(shost->host_lock, flags); |
| 1384 | scsi_remove_device(sdev); | 1390 | scsi_remove_device(sdev); |
| 1385 | scsi_device_put(sdev); | 1391 | put_device(&sdev->sdev_gendev); |
| 1386 | spin_lock_irqsave(shost->host_lock, flags); | 1392 | spin_lock_irqsave(shost->host_lock, flags); |
| 1387 | goto restart; | 1393 | goto restart; |
| 1388 | } | 1394 | } |
