Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 81b6c999 authored by Hannes Reinecke's avatar Hannes Reinecke Committed by Martin K. Petersen
Browse files

scsi: core: check for device state in __scsi_remove_target()



As it turned out device_get() doesn't use kref_get_unless_zero(), so we
will be always getting a device pointer.  Consequently, we need to check
for the device state in __scsi_remove_target() to avoid tripping over
deleted objects.

Fixes: fbce4d97 ("scsi: fixup kernel warning during rmmod()")
Reported-by: default avatarJason Yan <yanaijie@huawei.com>
Signed-off-by: default avatarHannes Reinecke <hare@suse.com>
Reviewed-by: default avatarBart Van Assche <bart.vanassche@wdc.com>
Reviewed-by: default avatarEwan D. Milne <emilne@redhat.com>
Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
parent 5771cfff
Loading
Loading
Loading
Loading
+4 −1
Original line number Diff line number Diff line
@@ -1415,7 +1415,10 @@ static void __scsi_remove_target(struct scsi_target *starget)
		 * check.
		 */
		if (sdev->channel != starget->channel ||
		    sdev->id != starget->id ||
		    sdev->id != starget->id)
			continue;
		if (sdev->sdev_state == SDEV_DEL ||
		    sdev->sdev_state == SDEV_CANCEL ||
		    !get_device(&sdev->sdev_gendev))
			continue;
		spin_unlock_irqrestore(shost->host_lock, flags);