Commit 9f8a2c23 authored by Tejun Heo's avatar Tejun Heo Committed by Jens Axboe

scsi: replace sr_test_unit_ready() with scsi_test_unit_ready()

The usage of TUR has been confusing involving several different
commits updating different parts over time.  Currently, the only
differences between scsi_test_unit_ready() and sr_test_unit_ready()
are,

* scsi_test_unit_ready() also sets sdev->changed on NOT_READY.

* scsi_test_unit_ready() returns 0 if TUR ended with UNIT_ATTENTION or
  NOT_READY.

Due to the above two differences, sr is using its own
sr_test_unit_ready(), but sd - the sole user of the above extra
handling - doesn't even need them.

Where scsi_test_unit_ready() is used in sd_media_changed(), the code
is looking for device ready w/ media present state which is true iff
TUR succeeds w/o sense data or UA, and when the device is not ready
for whatever reason sd_media_changed() explicitly marks media as
missing so there's no reason to set sdev->changed automatically from
scsi_test_unit_ready() on NOT_READY.

Drop both special handlings from scsi_test_unit_ready(), which makes
it equivalant to sr_test_unit_ready(), and replace
sr_test_unit_ready() with scsi_test_unit_ready().  Also, drop the
unnecessary explicit NOT_READY check from sd_media_changed().
Checking return value is enough for testing device readiness.
Signed-off-by: default avatarTejun Heo <tj@kernel.org>
Signed-off-by: default avatarJens Axboe <jaxboe@fusionio.com>
parent 638428ec
...@@ -1984,8 +1984,7 @@ EXPORT_SYMBOL(scsi_mode_sense); ...@@ -1984,8 +1984,7 @@ EXPORT_SYMBOL(scsi_mode_sense);
* in. * in.
* *
* Returns zero if unsuccessful or an error if TUR failed. For * Returns zero if unsuccessful or an error if TUR failed. For
* removable media, a return of NOT_READY or UNIT_ATTENTION is * removable media, UNIT_ATTENTION sets ->changed flag.
* translated to success, with the ->changed flag updated.
**/ **/
int int
scsi_test_unit_ready(struct scsi_device *sdev, int timeout, int retries, scsi_test_unit_ready(struct scsi_device *sdev, int timeout, int retries,
...@@ -2012,16 +2011,6 @@ scsi_test_unit_ready(struct scsi_device *sdev, int timeout, int retries, ...@@ -2012,16 +2011,6 @@ scsi_test_unit_ready(struct scsi_device *sdev, int timeout, int retries,
} while (scsi_sense_valid(sshdr) && } while (scsi_sense_valid(sshdr) &&
sshdr->sense_key == UNIT_ATTENTION && --retries); sshdr->sense_key == UNIT_ATTENTION && --retries);
if (!sshdr)
/* could not allocate sense buffer, so can't process it */
return result;
if (sdev->removable && scsi_sense_valid(sshdr) &&
(sshdr->sense_key == UNIT_ATTENTION ||
sshdr->sense_key == NOT_READY)) {
sdev->changed = 1;
result = 0;
}
if (!sshdr_external) if (!sshdr_external)
kfree(sshdr); kfree(sshdr);
return result; return result;
......
...@@ -1045,15 +1045,7 @@ static int sd_media_changed(struct gendisk *disk) ...@@ -1045,15 +1045,7 @@ static int sd_media_changed(struct gendisk *disk)
sshdr); sshdr);
} }
/* if (retval) {
* Unable to test, unit probably not ready. This usually
* means there is no disc in the drive. Mark as changed,
* and we will figure it out later once the drive is
* available again.
*/
if (retval || (scsi_sense_valid(sshdr) &&
/* 0x3a is medium not present */
sshdr->asc == 0x3a)) {
set_media_not_present(sdkp); set_media_not_present(sdkp);
retval = 1; retval = 1;
goto out; goto out;
......
...@@ -165,32 +165,6 @@ static void scsi_cd_put(struct scsi_cd *cd) ...@@ -165,32 +165,6 @@ static void scsi_cd_put(struct scsi_cd *cd)
mutex_unlock(&sr_ref_mutex); mutex_unlock(&sr_ref_mutex);
} }
/* identical to scsi_test_unit_ready except that it doesn't
* eat the NOT_READY returns for removable media */
int sr_test_unit_ready(struct scsi_device *sdev, struct scsi_sense_hdr *sshdr)
{
int retries = MAX_RETRIES;
int the_result;
u8 cmd[] = {TEST_UNIT_READY, 0, 0, 0, 0, 0 };
/* issue TEST_UNIT_READY until the initial startup UNIT_ATTENTION
* conditions are gone, or a timeout happens
*/
do {
the_result = scsi_execute_req(sdev, cmd, DMA_NONE, NULL,
0, sshdr, SR_TIMEOUT,
retries--, NULL);
if (scsi_sense_valid(sshdr) &&
sshdr->sense_key == UNIT_ATTENTION)
sdev->changed = 1;
} while (retries > 0 &&
(!scsi_status_is_good(the_result) ||
(scsi_sense_valid(sshdr) &&
sshdr->sense_key == UNIT_ATTENTION)));
return the_result;
}
/* /*
* This function checks to see if the media has been changed in the * This function checks to see if the media has been changed in the
* CDROM drive. It is possible that we have already sensed a change, * CDROM drive. It is possible that we have already sensed a change,
...@@ -213,7 +187,8 @@ static int sr_media_change(struct cdrom_device_info *cdi, int slot) ...@@ -213,7 +187,8 @@ static int sr_media_change(struct cdrom_device_info *cdi, int slot)
} }
sshdr = kzalloc(sizeof(*sshdr), GFP_KERNEL); sshdr = kzalloc(sizeof(*sshdr), GFP_KERNEL);
retval = sr_test_unit_ready(cd->device, sshdr); retval = scsi_test_unit_ready(cd->device, SR_TIMEOUT, MAX_RETRIES,
sshdr);
/* /*
* Media is considered to be present if TUR succeeds or fails with * Media is considered to be present if TUR succeeds or fails with
* sense data indicating something other than media-not-present * sense data indicating something other than media-not-present
...@@ -784,7 +759,7 @@ static void get_capabilities(struct scsi_cd *cd) ...@@ -784,7 +759,7 @@ static void get_capabilities(struct scsi_cd *cd)
} }
/* eat unit attentions */ /* eat unit attentions */
sr_test_unit_ready(cd->device, &sshdr); scsi_test_unit_ready(cd->device, SR_TIMEOUT, MAX_RETRIES, &sshdr);
/* ask for mode page 0x2a */ /* ask for mode page 0x2a */
rc = scsi_mode_sense(cd->device, 0, 0x2a, buffer, 128, rc = scsi_mode_sense(cd->device, 0, 0x2a, buffer, 128,
......
...@@ -61,7 +61,6 @@ int sr_select_speed(struct cdrom_device_info *cdi, int speed); ...@@ -61,7 +61,6 @@ int sr_select_speed(struct cdrom_device_info *cdi, int speed);
int sr_audio_ioctl(struct cdrom_device_info *, unsigned int, void *); int sr_audio_ioctl(struct cdrom_device_info *, unsigned int, void *);
int sr_is_xa(Scsi_CD *); int sr_is_xa(Scsi_CD *);
int sr_test_unit_ready(struct scsi_device *sdev, struct scsi_sense_hdr *sshdr);
/* sr_vendor.c */ /* sr_vendor.c */
void sr_vendor_init(Scsi_CD *); void sr_vendor_init(Scsi_CD *);
......
...@@ -307,7 +307,7 @@ int sr_drive_status(struct cdrom_device_info *cdi, int slot) ...@@ -307,7 +307,7 @@ int sr_drive_status(struct cdrom_device_info *cdi, int slot)
/* we have no changer support */ /* we have no changer support */
return -EINVAL; return -EINVAL;
} }
if (0 == sr_test_unit_ready(cd->device, &sshdr)) if (!scsi_test_unit_ready(cd->device, SR_TIMEOUT, MAX_RETRIES, &sshdr))
return CDS_DISC_OK; return CDS_DISC_OK;
/* SK/ASC/ASCQ of 2/4/1 means "unit is becoming ready" */ /* SK/ASC/ASCQ of 2/4/1 means "unit is becoming ready" */
......
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