diff options
Diffstat (limited to 'drivers/scsi/scsi_sysfs.c')
| -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)  	spin_lock_irqsave(shost->host_lock, flags);   restart:  	list_for_each_entry(sdev, &shost->__devices, siblings) { +		/* +		 * We cannot call scsi_device_get() here, as +		 * we might've been called from rmmod() causing +		 * scsi_device_get() to fail the module_is_live() +		 * check. +		 */  		if (sdev->channel != starget->channel ||  		    sdev->id != starget->id || -		    scsi_device_get(sdev)) +		    !get_device(&sdev->sdev_gendev))  			continue;  		spin_unlock_irqrestore(shost->host_lock, flags);  		scsi_remove_device(sdev); -		scsi_device_put(sdev); +		put_device(&sdev->sdev_gendev);  		spin_lock_irqsave(shost->host_lock, flags);  		goto restart;  	} |