Commit 6fa2b8f9 authored by Christoph Hellwig's avatar Christoph Hellwig Committed by Martin K. Petersen

scsi: sd: improve TUR handling in sd_check_events

Remove bogus evaluations of retval and sshdr when the device is offline,
and fix a possible NULL pointer dereference by allocating the 8 byte
sized sense header on stack.
Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
Reviewed-by: default avatarHannes Reinecke <hare@suse.de>
Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
parent 148cff67
...@@ -1425,7 +1425,6 @@ static unsigned int sd_check_events(struct gendisk *disk, unsigned int clearing) ...@@ -1425,7 +1425,6 @@ static unsigned int sd_check_events(struct gendisk *disk, unsigned int clearing)
{ {
struct scsi_disk *sdkp = scsi_disk_get(disk); struct scsi_disk *sdkp = scsi_disk_get(disk);
struct scsi_device *sdp; struct scsi_device *sdp;
struct scsi_sense_hdr *sshdr = NULL;
int retval; int retval;
if (!sdkp) if (!sdkp)
...@@ -1454,13 +1453,11 @@ static unsigned int sd_check_events(struct gendisk *disk, unsigned int clearing) ...@@ -1454,13 +1453,11 @@ static unsigned int sd_check_events(struct gendisk *disk, unsigned int clearing)
* by sd_spinup_disk() from sd_revalidate_disk(), which happens whenever * by sd_spinup_disk() from sd_revalidate_disk(), which happens whenever
* sd_revalidate() is called. * sd_revalidate() is called.
*/ */
retval = -ENODEV;
if (scsi_block_when_processing_errors(sdp)) { if (scsi_block_when_processing_errors(sdp)) {
sshdr = kzalloc(sizeof(*sshdr), GFP_KERNEL); struct scsi_sense_hdr sshdr = { 0, };
retval = scsi_test_unit_ready(sdp, SD_TIMEOUT, SD_MAX_RETRIES, retval = scsi_test_unit_ready(sdp, SD_TIMEOUT, SD_MAX_RETRIES,
sshdr); &sshdr);
}
/* failed to execute TUR, assume media not present */ /* failed to execute TUR, assume media not present */
if (host_byte(retval)) { if (host_byte(retval)) {
...@@ -1468,8 +1465,9 @@ static unsigned int sd_check_events(struct gendisk *disk, unsigned int clearing) ...@@ -1468,8 +1465,9 @@ static unsigned int sd_check_events(struct gendisk *disk, unsigned int clearing)
goto out; goto out;
} }
if (media_not_present(sdkp, sshdr)) if (media_not_present(sdkp, &sshdr))
goto out; goto out;
}
/* /*
* For removable scsi disk we have to recognise the presence * For removable scsi disk we have to recognise the presence
...@@ -1485,7 +1483,6 @@ static unsigned int sd_check_events(struct gendisk *disk, unsigned int clearing) ...@@ -1485,7 +1483,6 @@ static unsigned int sd_check_events(struct gendisk *disk, unsigned int clearing)
* Medium present state has changed in either direction. * Medium present state has changed in either direction.
* Device has indicated UNIT_ATTENTION. * Device has indicated UNIT_ATTENTION.
*/ */
kfree(sshdr);
retval = sdp->changed ? DISK_EVENT_MEDIA_CHANGE : 0; retval = sdp->changed ? DISK_EVENT_MEDIA_CHANGE : 0;
sdp->changed = 0; sdp->changed = 0;
scsi_disk_put(sdkp); scsi_disk_put(sdkp);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment