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: Christoph Hellwig <hch@lst.de> Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
This commit is contained in:
committed by
Martin K. Petersen
parent
6fa2b8f9e3
commit
74a78ebda4
@@ -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)
|
|||||||
*/
|
*/
|
||||||
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)
|
|||||||
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)
|
|||||||
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);
|
|||||||
* @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,
|
|||||||
} 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);
|
||||||
|
|||||||
Reference in New Issue
Block a user