Commit e7002946 authored by James Bottomley's avatar James Bottomley

Add internal API to remove reliance on deprecated SCSI_IOCTL_TEST_UNIT_READY

This was used by sd and sr

Instead make them use

scsi_test_unit_ready() which is exported now
from scsi_lib.c
Signed-off-by: default avatarJames Bottomley <James.Bottomley@SteelEye.com>
parent 8350d237
...@@ -432,12 +432,8 @@ int scsi_ioctl(struct scsi_device *sdev, int cmd, void __user *arg) ...@@ -432,12 +432,8 @@ int scsi_ioctl(struct scsi_device *sdev, int cmd, void __user *arg)
case SCSI_IOCTL_DOORUNLOCK: case SCSI_IOCTL_DOORUNLOCK:
return scsi_set_medium_removal(sdev, SCSI_REMOVAL_ALLOW); return scsi_set_medium_removal(sdev, SCSI_REMOVAL_ALLOW);
case SCSI_IOCTL_TEST_UNIT_READY: case SCSI_IOCTL_TEST_UNIT_READY:
scsi_cmd[0] = TEST_UNIT_READY; return scsi_test_unit_ready(sdev, IOCTL_NORMAL_TIMEOUT,
scsi_cmd[1] = 0; NORMAL_RETRIES);
scsi_cmd[2] = scsi_cmd[3] = scsi_cmd[5] = 0;
scsi_cmd[4] = 0;
return ioctl_internal_command(sdev, scsi_cmd,
IOCTL_NORMAL_TIMEOUT, NORMAL_RETRIES);
case SCSI_IOCTL_START_UNIT: case SCSI_IOCTL_START_UNIT:
scsi_cmd[0] = START_STOP; scsi_cmd[0] = START_STOP;
scsi_cmd[1] = 0; scsi_cmd[1] = 0;
......
...@@ -1572,6 +1572,34 @@ scsi_mode_sense(struct scsi_device *sdev, int dbd, int modepage, ...@@ -1572,6 +1572,34 @@ scsi_mode_sense(struct scsi_device *sdev, int dbd, int modepage,
return ret; return ret;
} }
int
scsi_test_unit_ready(struct scsi_device *sdev, int timeout, int retries)
{
struct scsi_request *sreq;
char cmd[] = {
TEST_UNIT_READY, 0, 0, 0, 0, 0,
};
int result;
sreq = scsi_allocate_request(sdev, GFP_KERNEL);
if (!sreq)
return -ENOMEM;
sreq->sr_data_direction = DMA_NONE;
scsi_wait_req(sreq, cmd, NULL, 0, timeout, retries);
if ((driver_byte(sreq->sr_result) & DRIVER_SENSE) &&
(sreq->sr_sense_buffer[2] & 0x0f) == UNIT_ATTENTION &&
sdev->removable) {
sdev->changed = 1;
sreq->sr_result = 0;
}
result = sreq->sr_result;
scsi_release_request(sreq);
return result;
}
EXPORT_SYMBOL(scsi_test_unit_ready);
/** /**
* scsi_device_set_state - Take the given device through the device * scsi_device_set_state - Take the given device through the device
* state model. * state model.
......
...@@ -648,7 +648,7 @@ static int sd_media_changed(struct gendisk *disk) ...@@ -648,7 +648,7 @@ static int sd_media_changed(struct gendisk *disk)
*/ */
retval = -ENODEV; retval = -ENODEV;
if (scsi_block_when_processing_errors(sdp)) if (scsi_block_when_processing_errors(sdp))
retval = scsi_ioctl(sdp, SCSI_IOCTL_TEST_UNIT_READY, NULL); retval = scsi_test_unit_ready(sdp, SD_TIMEOUT, SD_MAX_RETRIES);
/* /*
* Unable to test, unit probably not ready. This usually * Unable to test, unit probably not ready. This usually
......
...@@ -183,7 +183,7 @@ int sr_media_change(struct cdrom_device_info *cdi, int slot) ...@@ -183,7 +183,7 @@ int sr_media_change(struct cdrom_device_info *cdi, int slot)
return -EINVAL; return -EINVAL;
} }
retval = scsi_ioctl(cd->device, SCSI_IOCTL_TEST_UNIT_READY, NULL); retval = scsi_test_unit_ready(cd->device, SR_TIMEOUT, MAX_RETRIES);
if (retval) { if (retval) {
/* Unable to test, unit probably not ready. This usually /* Unable to test, unit probably not ready. This usually
* means there is no disc in the drive. Mark as changed, * means there is no disc in the drive. Mark as changed,
......
...@@ -185,6 +185,8 @@ extern int scsi_set_medium_removal(struct scsi_device *, char); ...@@ -185,6 +185,8 @@ extern int scsi_set_medium_removal(struct scsi_device *, char);
extern int scsi_mode_sense(struct scsi_device *sdev, int dbd, int modepage, extern int scsi_mode_sense(struct scsi_device *sdev, int dbd, int modepage,
unsigned char *buffer, int len, int timeout, unsigned char *buffer, int len, int timeout,
int retries, struct scsi_mode_data *data); int retries, struct scsi_mode_data *data);
extern int scsi_test_unit_ready(struct scsi_device *sdev, int timeout,
int retries);
extern int scsi_device_set_state(struct scsi_device *sdev, extern int scsi_device_set_state(struct scsi_device *sdev,
enum scsi_device_state state); enum scsi_device_state state);
extern int scsi_device_quiesce(struct scsi_device *sdev); extern int scsi_device_quiesce(struct scsi_device *sdev);
......
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