Commit 74a78ebd authored by Christoph Hellwig's avatar Christoph Hellwig Committed by Martin K. Petersen

scsi: make the sense header argument to scsi_test_unit_ready mandatory

It's a tiny structure that can be allocated on the stack, don't
complicate the code by making it optional.
Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
parent 6fa2b8f9
...@@ -372,6 +372,7 @@ EXPORT_SYMBOL(osduld_device_same); ...@@ -372,6 +372,7 @@ EXPORT_SYMBOL(osduld_device_same);
static int __detect_osd(struct osd_uld_device *oud) static int __detect_osd(struct osd_uld_device *oud)
{ {
struct scsi_device *scsi_device = oud->od.scsi_device; struct scsi_device *scsi_device = oud->od.scsi_device;
struct scsi_sense_hdr sense_hdr;
char caps[OSD_CAP_LEN]; char caps[OSD_CAP_LEN];
int error; int error;
...@@ -380,7 +381,7 @@ static int __detect_osd(struct osd_uld_device *oud) ...@@ -380,7 +381,7 @@ static int __detect_osd(struct osd_uld_device *oud)
*/ */
OSD_DEBUG("start scsi_test_unit_ready %p %p %p\n", OSD_DEBUG("start scsi_test_unit_ready %p %p %p\n",
oud, scsi_device, scsi_device->request_queue); oud, scsi_device, scsi_device->request_queue);
error = scsi_test_unit_ready(scsi_device, 10*HZ, 5, NULL); error = scsi_test_unit_ready(scsi_device, 10*HZ, 5, &sense_hdr);
if (error) if (error)
OSD_ERR("warning: scsi_test_unit_ready failed\n"); OSD_ERR("warning: scsi_test_unit_ready failed\n");
......
...@@ -199,6 +199,7 @@ static int scsi_ioctl_get_pci(struct scsi_device *sdev, void __user *arg) ...@@ -199,6 +199,7 @@ static int scsi_ioctl_get_pci(struct scsi_device *sdev, void __user *arg)
int scsi_ioctl(struct scsi_device *sdev, int cmd, void __user *arg) int scsi_ioctl(struct scsi_device *sdev, int cmd, void __user *arg)
{ {
char scsi_cmd[MAX_COMMAND_SIZE]; char scsi_cmd[MAX_COMMAND_SIZE];
struct scsi_sense_hdr sense_hdr;
/* Check for deprecated ioctls ... all the ioctls which don't /* Check for deprecated ioctls ... all the ioctls which don't
* follow the new unique numbering scheme are deprecated */ * follow the new unique numbering scheme are deprecated */
...@@ -243,7 +244,7 @@ int scsi_ioctl(struct scsi_device *sdev, int cmd, void __user *arg) ...@@ -243,7 +244,7 @@ int scsi_ioctl(struct scsi_device *sdev, int cmd, void __user *arg)
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:
return scsi_test_unit_ready(sdev, IOCTL_NORMAL_TIMEOUT, return scsi_test_unit_ready(sdev, IOCTL_NORMAL_TIMEOUT,
NORMAL_RETRIES, NULL); NORMAL_RETRIES, &sense_hdr);
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;
......
...@@ -2520,28 +2520,20 @@ EXPORT_SYMBOL(scsi_mode_sense); ...@@ -2520,28 +2520,20 @@ EXPORT_SYMBOL(scsi_mode_sense);
* @sdev: scsi device to change the state of. * @sdev: scsi device to change the state of.
* @timeout: command timeout * @timeout: command timeout
* @retries: number of retries before failing * @retries: number of retries before failing
* @sshdr_external: Optional pointer to struct scsi_sense_hdr for * @sshdr: outpout pointer for decoded sense information.
* returning sense. Make sure that this is cleared before passing
* 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, UNIT_ATTENTION sets ->changed flag. * removable media, UNIT_ATTENTION sets ->changed flag.
**/ **/
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,
struct scsi_sense_hdr *sshdr_external) struct scsi_sense_hdr *sshdr)
{ {
char cmd[] = { char cmd[] = {
TEST_UNIT_READY, 0, 0, 0, 0, 0, TEST_UNIT_READY, 0, 0, 0, 0, 0,
}; };
struct scsi_sense_hdr *sshdr;
int result; int result;
if (!sshdr_external)
sshdr = kzalloc(sizeof(*sshdr), GFP_KERNEL);
else
sshdr = sshdr_external;
/* try to eat the UNIT_ATTENTION if there are enough retries */ /* try to eat the UNIT_ATTENTION if there are enough retries */
do { do {
result = scsi_execute_req(sdev, cmd, DMA_NONE, NULL, 0, sshdr, result = scsi_execute_req(sdev, cmd, DMA_NONE, NULL, 0, sshdr,
...@@ -2552,8 +2544,6 @@ scsi_test_unit_ready(struct scsi_device *sdev, int timeout, int retries, ...@@ -2552,8 +2544,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_external)
kfree(sshdr);
return result; return result;
} }
EXPORT_SYMBOL(scsi_test_unit_ready); EXPORT_SYMBOL(scsi_test_unit_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