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

Commit d0171269 authored by Tejun Heo's avatar Tejun Heo Committed by Jeff Garzik
Browse files

[PATCH] libata: fix oops caused rescanning NULL sdev



Depending on timing, ata_scsi_dev_rescan() might encounter a device
which is enabled but not yet attached to sdev.  On such cases, the
original code caused oops.  This patch makes ata_scsi_dev_rescan()
rescan only device which are attached to sdevs.

While at it, properly indent leading comment and add description about
how it's synchronized with sdev attach/detach.

Signed-off-by: default avatarTejun Heo <htejun@gmail.com>
Signed-off-by: default avatarJeff Garzik <jeff@garzik.org>
parent d4c85325
Loading
Loading
Loading
Loading
+9 −8
Original line number Original line Diff line number Diff line
@@ -3009,7 +3009,9 @@ static int ata_scsi_user_scan(struct Scsi_Host *shost, unsigned int channel,
 *	@data: Pointer to ATA port to perform scsi_rescan_device()
 *	@data: Pointer to ATA port to perform scsi_rescan_device()
 *
 *
 *	After ATA pass thru (SAT) commands are executed successfully,
 *	After ATA pass thru (SAT) commands are executed successfully,
 *      libata need to propagate the changes to SCSI layer.
 *	libata need to propagate the changes to SCSI layer.  This
 *	function must be executed from ata_aux_wq such that sdev
 *	attach/detach don't race with rescan.
 *
 *
 *	LOCKING:
 *	LOCKING:
 *	Kernel thread context (may sleep).
 *	Kernel thread context (may sleep).
@@ -3023,8 +3025,7 @@ void ata_scsi_dev_rescan(void *data)
	for (i = 0; i < ATA_MAX_DEVICES; i++) {
	for (i = 0; i < ATA_MAX_DEVICES; i++) {
		dev = &ap->device[i];
		dev = &ap->device[i];


		if (ata_dev_enabled(dev))
		if (ata_dev_enabled(dev) && dev->sdev)
			scsi_rescan_device(&(dev->sdev->sdev_gendev));
			scsi_rescan_device(&(dev->sdev->sdev_gendev));
	}
	}
}
}