Each high level driver uses scsi_device->timeout diffrently. * sd sets sdev->timeout to SD_TIMEOUT if it's zero on attach. sdev->timeout is used for commands received from block queue but internal commands use SD_TIMEOUT directly. * sr uses constant SR_TIMEOUT for all non-ioctl commands and IOCTL_TIMEOUT for sr ioctls. * st sets sdev->timeout to ST_TIMEOUT unconditionally. st uses either sdev->timeout or scsi_tape->long_timeout depending on command type. * osst uses osst_tape->timeout and osst_tape->long_timeout. This patch unifies differing behaviors as follows. * All highlevel drivers initialize sdev->timeout to its default value iff it's zero; otherwise, the specified value is used. * All commands w/o specific timeout requirement use sdev->timeout. Commands which require special timeout uses HL-specific value such as IOCTL_TIMEOUT and scsi/osst_tape->long_timeout. This patch also adds sdev local variable for shorter notation where multiple references to sdev are added. Signed-off-by: Tejun Heo <htejun@xxxxxxxxx> --- Sorry, the original post had linux-scsi-owner@vger instead of linux-scsi@vger. Reposting. drivers/scsi/osst.c | 78 ++++++++++++++++++++++++++-------------------------- drivers/scsi/osst.h | 1 drivers/scsi/sd.c | 31 +++++++++++--------- drivers/scsi/sr.c | 49 ++++++++++++++++++-------------- drivers/scsi/st.c | 3 +- 5 files changed, 87 insertions(+), 75 deletions(-) Index: scsi-misc-2.6/drivers/scsi/sd.c =================================================================== --- scsi-misc-2.6.orig/drivers/scsi/sd.c +++ scsi-misc-2.6/drivers/scsi/sd.c @@ -186,7 +186,7 @@ static ssize_t sd_store_cache_type(struc return -EINVAL; rcd = ct & 0x01 ? 1 : 0; wce = ct & 0x02 ? 1 : 0; - if (scsi_mode_sense(sdp, 0x08, 8, buffer, sizeof(buffer), SD_TIMEOUT, + if (scsi_mode_sense(sdp, 0x08, 8, buffer, sizeof(buffer), sdp->timeout, SD_MAX_RETRIES, &data, NULL)) return -EINVAL; len = min_t(size_t, sizeof(buffer), data.length - data.header_length - @@ -197,7 +197,7 @@ static ssize_t sd_store_cache_type(struc buffer_data[2] |= wce << 2 | rcd; sp = buffer_data[0] & 0x80 ? 1 : 0; - if (scsi_mode_select(sdp, 1, sp, 8, buffer_data, len, SD_TIMEOUT, + if (scsi_mode_select(sdp, 1, sp, 8, buffer_data, len, sdp->timeout, SD_MAX_RETRIES, &data, &sshdr)) { if (scsi_sense_valid(&sshdr)) scsi_print_sense_hdr(sdkp->disk->disk_name, &sshdr); @@ -370,7 +370,6 @@ static int sd_init_command(struct scsi_c struct gendisk *disk = rq->rq_disk; sector_t block = rq->sector; unsigned int this_count = SCpnt->request_bufflen >> 9; - unsigned int timeout = sdp->timeout; SCSI_LOG_HLQUEUE(1, printk("sd_init_command: disk=%s, block=%llu, " "count=%d\n", disk->disk_name, @@ -511,7 +510,7 @@ static int sd_init_command(struct scsi_c SCpnt->transfersize = sdp->sector_size; SCpnt->underflow = this_count << 9; SCpnt->allowed = SD_MAX_RETRIES; - SCpnt->timeout_per_command = timeout; + SCpnt->timeout_per_command = sdp->timeout; /* * This is the completion routine we use. This is matched in terms @@ -759,7 +758,7 @@ static int sd_media_changed(struct gendi */ retval = -ENODEV; if (scsi_block_when_processing_errors(sdp)) - retval = scsi_test_unit_ready(sdp, SD_TIMEOUT, SD_MAX_RETRIES); + retval = scsi_test_unit_ready(sdp, sdp->timeout, SD_MAX_RETRIES); /* * Unable to test, unit probably not ready. This usually @@ -805,7 +804,7 @@ static int sd_sync_cache(struct scsi_dev * flush everything. */ res = scsi_execute_req(sdp, cmd, DMA_NONE, NULL, 0, &sshdr, - SD_TIMEOUT, SD_MAX_RETRIES); + sdp->timeout, SD_MAX_RETRIES); if (res == 0) break; } @@ -838,9 +837,12 @@ static int sd_issue_flush(struct device static void sd_prepare_flush(request_queue_t *q, struct request *rq) { + struct device *dev = rq->rq_disk->driverfs_dev; + struct scsi_device *sdp = to_scsi_device(dev); + memset(rq->cmd, 0, sizeof(rq->cmd)); rq->cmd_type = REQ_TYPE_BLOCK_PC; - rq->timeout = SD_TIMEOUT; + rq->timeout = sdp->timeout; rq->cmd[0] = SYNCHRONIZE_CACHE; rq->cmd_len = 10; } @@ -1028,6 +1030,7 @@ static int media_not_present(struct scsi static void sd_spinup_disk(struct scsi_disk *sdkp, char *diskname) { + struct scsi_device *sdp = sdkp->device; unsigned char cmd[10]; unsigned long spintime_expire = 0; int retries, spintime; @@ -1046,9 +1049,9 @@ sd_spinup_disk(struct scsi_disk *sdkp, c cmd[0] = TEST_UNIT_READY; memset((void *) &cmd[1], 0, 9); - the_result = scsi_execute_req(sdkp->device, cmd, + the_result = scsi_execute_req(sdp, cmd, DMA_NONE, NULL, 0, - &sshdr, SD_TIMEOUT, + &sshdr, sdp->timeout, SD_MAX_RETRIES); /* @@ -1079,7 +1082,7 @@ sd_spinup_disk(struct scsi_disk *sdkp, c /* * The device does not want the automatic start to be issued. */ - if (sdkp->device->no_start_on_add) { + if (sdp->no_start_on_add) { break; } @@ -1103,9 +1106,9 @@ sd_spinup_disk(struct scsi_disk *sdkp, c cmd[1] = 1; /* Return immediately */ memset((void *) &cmd[2], 0, 8); cmd[4] = 1; /* Start spin cycle */ - scsi_execute_req(sdkp->device, cmd, DMA_NONE, + scsi_execute_req(sdp, cmd, DMA_NONE, NULL, 0, &sshdr, - SD_TIMEOUT, SD_MAX_RETRIES); + sdp->timeout, SD_MAX_RETRIES); spintime_expire = jiffies + 100 * HZ; spintime = 1; } @@ -1180,7 +1183,7 @@ repeat: the_result = scsi_execute_req(sdp, cmd, DMA_FROM_DEVICE, buffer, longrc ? 12 : 8, &sshdr, - SD_TIMEOUT, SD_MAX_RETRIES); + sdp->timeout, SD_MAX_RETRIES); if (media_not_present(sdkp, &sshdr)) return; @@ -1345,7 +1348,7 @@ sd_do_mode_sense(struct scsi_device *sdp struct scsi_sense_hdr *sshdr) { return scsi_mode_sense(sdp, dbd, modepage, buffer, len, - SD_TIMEOUT, SD_MAX_RETRIES, data, + sdp->timeout, SD_MAX_RETRIES, data, sshdr); } Index: scsi-misc-2.6/drivers/scsi/sr.c =================================================================== --- scsi-misc-2.6.orig/drivers/scsi/sr.c +++ scsi-misc-2.6/drivers/scsi/sr.c @@ -177,6 +177,7 @@ static void scsi_cd_put(struct scsi_cd * int sr_media_change(struct cdrom_device_info *cdi, int slot) { struct scsi_cd *cd = cdi->handle; + struct scsi_device *sdev = cd->device; int retval; if (CDSL_CURRENT != slot) { @@ -184,19 +185,19 @@ int sr_media_change(struct cdrom_device_ return -EINVAL; } - retval = scsi_test_unit_ready(cd->device, SR_TIMEOUT, MAX_RETRIES); + retval = scsi_test_unit_ready(sdev, sdev->timeout, MAX_RETRIES); 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. */ - cd->device->changed = 1; + sdev->changed = 1; return 1; /* This will force a flush, if called from * check_disk_change */ }; - retval = cd->device->changed; - cd->device->changed = 0; + retval = sdev->changed; + sdev->changed = 0; /* If the disk changed, the capacity will now be different, * so we force a re-read of this information */ if (retval) { @@ -297,20 +298,21 @@ static void rw_intr(struct scsi_cmnd * S static int sr_init_command(struct scsi_cmnd * SCpnt) { - int block=0, this_count, s_size, timeout = SR_TIMEOUT; + int block=0, this_count, s_size; struct scsi_cd *cd = scsi_cd(SCpnt->request->rq_disk); + struct scsi_device *sdev = cd->device; SCSI_LOG_HLQUEUE(1, printk("Doing sr request, dev = %s, block = %d\n", cd->disk->disk_name, block)); - if (!cd->device || !scsi_device_online(cd->device)) { + if (!sdev || !scsi_device_online(sdev)) { SCSI_LOG_HLQUEUE(2, printk("Finishing %ld sectors\n", SCpnt->request->nr_sectors)); SCSI_LOG_HLQUEUE(2, printk("Retry with 0x%p\n", SCpnt)); return 0; } - if (cd->device->changed) { + if (sdev->changed) { /* * quietly refuse to do anything to a changed disc until the * changed bit has been reset @@ -322,7 +324,7 @@ static int sr_init_command(struct scsi_c * we do lazy blocksize switching (when reading XA sectors, * see CDROMREADMODE2 ioctl) */ - s_size = cd->device->sector_size; + s_size = sdev->sector_size; if (s_size > 2048) { if (!in_interrupt()) sr_set_blocklength(cd, 2048); @@ -336,7 +338,7 @@ static int sr_init_command(struct scsi_c } if (rq_data_dir(SCpnt->request) == WRITE) { - if (!cd->device->writeable) + if (!sdev->writeable) return 0; SCpnt->cmnd[0] = WRITE_10; SCpnt->sc_data_direction = DMA_TO_DEVICE; @@ -403,10 +405,10 @@ static int sr_init_command(struct scsi_c * host adapter, it's safe to assume that we can at least transfer * this many bytes between each connect / disconnect. */ - SCpnt->transfersize = cd->device->sector_size; + SCpnt->transfersize = sdev->sector_size; SCpnt->underflow = this_count << 9; SCpnt->allowed = MAX_RETRIES; - SCpnt->timeout_per_command = timeout; + SCpnt->timeout_per_command = sdev->timeout; /* * This is the completion routine we use. This is matched in terms @@ -579,6 +581,9 @@ static int sr_probe(struct device *dev) cd->readcd_known = 0; cd->readcd_cdda = 0; + if (!sdev->timeout) + sdev->timeout = SR_TIMEOUT; + cd->cdi.ops = &sr_dops; cd->cdi.handle = cd; cd->cdi.mask = 0; @@ -619,6 +624,7 @@ fail: static void get_sectorsize(struct scsi_cd *cd) { + struct scsi_device *sdev = cd->device; unsigned char cmd[10]; unsigned char *buffer; int the_result, retries = 3; @@ -635,8 +641,8 @@ static void get_sectorsize(struct scsi_c memset(buffer, 0, 8); /* Do the command and wait.. */ - the_result = scsi_execute_req(cd->device, cmd, DMA_FROM_DEVICE, - buffer, 8, NULL, SR_TIMEOUT, + the_result = scsi_execute_req(sdev, cmd, DMA_FROM_DEVICE, + buffer, 8, NULL, sdev->timeout, MAX_RETRIES); retries--; @@ -681,7 +687,7 @@ static void get_sectorsize(struct scsi_c cd->capacity = 0; } - cd->device->sector_size = sector_size; + sdev->sector_size = sector_size; /* * Add this so that we have the ability to correctly gauge @@ -690,7 +696,7 @@ static void get_sectorsize(struct scsi_c set_capacity(cd->disk, cd->capacity); } - queue = cd->device->request_queue; + queue = sdev->request_queue; blk_queue_hardsect_size(queue, sector_size); out: kfree(buffer); @@ -698,12 +704,13 @@ out: Enomem: cd->capacity = 0x1fffff; - cd->device->sector_size = 2048; /* A guess, just in case */ + sdev->sector_size = 2048; /* A guess, just in case */ goto out; } static void get_capabilities(struct scsi_cd *cd) { + struct scsi_device *sdev = cd->device; unsigned char *buffer; struct scsi_mode_data data; unsigned char cmd[MAX_COMMAND_SIZE]; @@ -739,8 +746,8 @@ static void get_capabilities(struct scsi memset((void *)cmd, 0, MAX_COMMAND_SIZE); cmd[0] = TEST_UNIT_READY; - the_result = scsi_execute_req (cd->device, cmd, DMA_NONE, NULL, - 0, &sshdr, SR_TIMEOUT, + the_result = scsi_execute_req (sdev, cmd, DMA_NONE, NULL, + 0, &sshdr, sdev->timeout, MAX_RETRIES); retries++; @@ -750,8 +757,8 @@ static void get_capabilities(struct scsi sshdr.sense_key == UNIT_ATTENTION))); /* ask for mode page 0x2a */ - rc = scsi_mode_sense(cd->device, 0, 0x2a, buffer, 128, - SR_TIMEOUT, 3, &data, NULL); + rc = scsi_mode_sense(sdev, 0, 0x2a, buffer, 128, + sdev->timeout, 3, &data, NULL); if (!scsi_status_is_good(rc)) { /* failed, drive doesn't have capabilities mode page */ @@ -816,7 +823,7 @@ static void get_capabilities(struct scsi */ if ((cd->cdi.mask & (CDC_DVD_RAM | CDC_MRW_W | CDC_RAM | CDC_CD_RW)) != (CDC_DVD_RAM | CDC_MRW_W | CDC_RAM | CDC_CD_RW)) { - cd->device->writeable = 1; + sdev->writeable = 1; } kfree(buffer); Index: scsi-misc-2.6/drivers/scsi/st.c =================================================================== --- scsi-misc-2.6.orig/drivers/scsi/st.c +++ scsi-misc-2.6/drivers/scsi/st.c @@ -3986,7 +3986,8 @@ static int st_probe(struct device *dev) tpnt->partition = 0; tpnt->new_partition = 0; tpnt->nbr_partitions = 0; - tpnt->device->timeout = ST_TIMEOUT; + if (!SDp->timeout) + SDp->timeout = ST_TIMEOUT; tpnt->long_timeout = ST_LONG_TIMEOUT; tpnt->try_dio = try_direct_io && !SDp->host->unchecked_isa_dma; Index: scsi-misc-2.6/drivers/scsi/osst.c =================================================================== --- scsi-misc-2.6.orig/drivers/scsi/osst.c +++ scsi-misc-2.6/drivers/scsi/osst.c @@ -683,7 +683,7 @@ static int osst_wait_ready(struct osst_t memset(cmd, 0, MAX_COMMAND_SIZE); cmd[0] = TEST_UNIT_READY; - SRpnt = osst_do_scsi(*aSRpnt, STp, cmd, 0, DMA_NONE, STp->timeout, MAX_RETRIES, 1); + SRpnt = osst_do_scsi(*aSRpnt, STp, cmd, 0, DMA_NONE, STp->device->timeout, MAX_RETRIES, 1); *aSRpnt = SRpnt; if (!SRpnt) return (-EBUSY); @@ -704,7 +704,7 @@ static int osst_wait_ready(struct osst_t memset(cmd, 0, MAX_COMMAND_SIZE); cmd[0] = TEST_UNIT_READY; - SRpnt = osst_do_scsi(SRpnt, STp, cmd, 0, DMA_NONE, STp->timeout, MAX_RETRIES, 1); + SRpnt = osst_do_scsi(SRpnt, STp, cmd, 0, DMA_NONE, STp->device->timeout, MAX_RETRIES, 1); } *aSRpnt = SRpnt; #if DEBUG @@ -744,7 +744,7 @@ static int osst_wait_for_medium(struct o memset(cmd, 0, MAX_COMMAND_SIZE); cmd[0] = TEST_UNIT_READY; - SRpnt = osst_do_scsi(*aSRpnt, STp, cmd, 0, DMA_NONE, STp->timeout, MAX_RETRIES, 1); + SRpnt = osst_do_scsi(*aSRpnt, STp, cmd, 0, DMA_NONE, STp->device->timeout, MAX_RETRIES, 1); *aSRpnt = SRpnt; if (!SRpnt) return (-EBUSY); @@ -762,7 +762,7 @@ static int osst_wait_for_medium(struct o memset(cmd, 0, MAX_COMMAND_SIZE); cmd[0] = TEST_UNIT_READY; - SRpnt = osst_do_scsi(SRpnt, STp, cmd, 0, DMA_NONE, STp->timeout, MAX_RETRIES, 1); + SRpnt = osst_do_scsi(SRpnt, STp, cmd, 0, DMA_NONE, STp->device->timeout, MAX_RETRIES, 1); } *aSRpnt = SRpnt; #if DEBUG @@ -814,7 +814,7 @@ static int osst_flush_drive_buffer(struc cmd[0] = WRITE_FILEMARKS; cmd[1] = 1; - SRpnt = osst_do_scsi(*aSRpnt, STp, cmd, 0, DMA_NONE, STp->timeout, MAX_RETRIES, 1); + SRpnt = osst_do_scsi(*aSRpnt, STp, cmd, 0, DMA_NONE, STp->device->timeout, MAX_RETRIES, 1); *aSRpnt = SRpnt; if (!SRpnt) return (-EBUSY); if (STp->buffer->syscall_result) { @@ -905,8 +905,8 @@ static int osst_recover_wait_frame(struc memset(cmd, 0, MAX_COMMAND_SIZE); cmd[0] = WRITE_FILEMARKS; cmd[1] = 1; - SRpnt = osst_do_scsi(*aSRpnt, STp, cmd, 0, DMA_NONE, STp->timeout, - MAX_RETRIES, 1); + SRpnt = osst_do_scsi(*aSRpnt, STp, cmd, 0, DMA_NONE, + STp->device->timeout, MAX_RETRIES, 1); while (retval && time_before (jiffies, startwait + 5*60*HZ)) { @@ -922,8 +922,8 @@ static int osst_recover_wait_frame(struc memset(cmd, 0, MAX_COMMAND_SIZE); cmd[0] = READ_POSITION; - SRpnt = osst_do_scsi(SRpnt, STp, cmd, 20, DMA_FROM_DEVICE, STp->timeout, - MAX_RETRIES, 1); + SRpnt = osst_do_scsi(SRpnt, STp, cmd, 20, DMA_FROM_DEVICE, + STp->device->timeout, MAX_RETRIES, 1); retval = ( STp->buffer->syscall_result || (STp->buffer)->b_data[15] > 25 ); STp->buffer->b_data = olddata; STp->buffer->buffer_size = oldsize; @@ -969,7 +969,7 @@ static int osst_read_frame(struct osst_t printk(OSST_DEB_MSG "%s:D: Reading frame from OnStream tape\n", name); #endif SRpnt = osst_do_scsi(*aSRpnt, STp, cmd, OS_FRAME_SIZE, DMA_FROM_DEVICE, - STp->timeout, MAX_RETRIES, 1); + STp->device->timeout, MAX_RETRIES, 1); *aSRpnt = SRpnt; if (!SRpnt) return (-EBUSY); @@ -1044,7 +1044,8 @@ static int osst_initiate_read(struct oss #if DEBUG printk(OSST_DEB_MSG "%s:D: Start Read Ahead on OnStream tape\n", name); #endif - SRpnt = osst_do_scsi(*aSRpnt, STp, cmd, 0, DMA_NONE, STp->timeout, MAX_RETRIES, 1); + SRpnt = osst_do_scsi(*aSRpnt, STp, cmd, 0, DMA_NONE, + STp->device->timeout, MAX_RETRIES, 1); *aSRpnt = SRpnt; if ((retval = STp->buffer->syscall_result)) printk(KERN_WARNING "%s:W: Error starting read ahead\n", name); @@ -1426,7 +1427,7 @@ static int osst_read_back_buffer_and_rew cmd[8] = 32768 & 0xff; SRpnt = osst_do_scsi(SRpnt, STp, cmd, OS_FRAME_SIZE, DMA_FROM_DEVICE, - STp->timeout, MAX_RETRIES, 1); + STp->device->timeout, MAX_RETRIES, 1); if ((STp->buffer)->syscall_result || !SRpnt) { printk(KERN_ERR "%s:E: Failed to read frame back from OnStream buffer\n", name); @@ -1498,7 +1499,7 @@ static int osst_read_back_buffer_and_rew p[0], p[1], p[2], p[3]); #endif SRpnt = osst_do_scsi(SRpnt, STp, cmd, OS_FRAME_SIZE, DMA_TO_DEVICE, - STp->timeout, MAX_RETRIES, 1); + STp->device->timeout, MAX_RETRIES, 1); if (STp->buffer->syscall_result) flag = 1; @@ -1514,7 +1515,7 @@ static int osst_read_back_buffer_and_rew cmd[0] = WRITE_FILEMARKS; cmd[1] = 1; SRpnt = osst_do_scsi(SRpnt, STp, cmd, 0, DMA_NONE, - STp->timeout, MAX_RETRIES, 1); + STp->device->timeout, MAX_RETRIES, 1); #if DEBUG if (debugging) { printk(OSST_DEB_MSG "%s:D: Sleeping in re-write wait ready\n", name); @@ -1528,8 +1529,8 @@ static int osst_read_back_buffer_and_rew memset(cmd, 0, MAX_COMMAND_SIZE); cmd[0] = TEST_UNIT_READY; - SRpnt = osst_do_scsi(SRpnt, STp, cmd, 0, DMA_NONE, STp->timeout, - MAX_RETRIES, 1); + SRpnt = osst_do_scsi(SRpnt, STp, cmd, 0, DMA_NONE, + STp->device->timeout, MAX_RETRIES, 1); if (SRpnt->sense[2] == 2 && SRpnt->sense[12] == 4 && (SRpnt->sense[13] == 1 || SRpnt->sense[13] == 8)) { @@ -1634,7 +1635,7 @@ static int osst_reposition_and_retry(str name, STp->frame_seq_number-1, STp->first_frame_position); #endif SRpnt = osst_do_scsi(*aSRpnt, STp, cmd, OS_FRAME_SIZE, DMA_TO_DEVICE, - STp->timeout, MAX_RETRIES, 1); + STp->device->timeout, MAX_RETRIES, 1); *aSRpnt = SRpnt; if (STp->buffer->syscall_result) { /* additional write error */ @@ -2091,7 +2092,7 @@ static void osst_set_retries(struct osst if (debugging) printk(OSST_DEB_MSG "%s:D: Setting number of retries on OnStream tape to %d\n", name, retries); - SRpnt = osst_do_scsi(SRpnt, STp, cmd, cmd[4], DMA_TO_DEVICE, STp->timeout, 0, 1); + SRpnt = osst_do_scsi(SRpnt, STp, cmd, cmd[4], DMA_TO_DEVICE, STp->device->timeout, 0, 1); *aSRpnt = SRpnt; if ((STp->buffer)->syscall_result) @@ -2631,7 +2632,7 @@ static int osst_configure_onstream(struc cmd[2] = BLOCK_SIZE_PAGE; cmd[4] = BLOCK_SIZE_PAGE_LENGTH + MODE_HEADER_LENGTH; - SRpnt = osst_do_scsi(SRpnt, STp, cmd, cmd[4], DMA_FROM_DEVICE, STp->timeout, 0, 1); + SRpnt = osst_do_scsi(SRpnt, STp, cmd, cmd[4], DMA_FROM_DEVICE, STp->device->timeout, 0, 1); if (SRpnt == NULL) { #if DEBUG printk(OSST_DEB_MSG "osst :D: Busy\n"); @@ -2668,7 +2669,7 @@ static int osst_configure_onstream(struc cmd[1] = 0x10; cmd[4] = BLOCK_SIZE_PAGE_LENGTH + MODE_HEADER_LENGTH; - SRpnt = osst_do_scsi(SRpnt, STp, cmd, cmd[4], DMA_TO_DEVICE, STp->timeout, 0, 1); + SRpnt = osst_do_scsi(SRpnt, STp, cmd, cmd[4], DMA_TO_DEVICE, STp->device->timeout, 0, 1); *aSRpnt = SRpnt; if ((STp->buffer)->syscall_result != 0) { printk (KERN_ERR "%s:E: Couldn't set tape block size mode page\n", name); @@ -2708,7 +2709,7 @@ static int osst_configure_onstream(struc (STp->buffer)->b_data[MODE_HEADER_LENGTH + 6] = 0; (STp->buffer)->b_data[MODE_HEADER_LENGTH + 7] = 0; - SRpnt = osst_do_scsi(SRpnt, STp, cmd, cmd[4], DMA_TO_DEVICE, STp->timeout, 0, 1); + SRpnt = osst_do_scsi(SRpnt, STp, cmd, cmd[4], DMA_TO_DEVICE, STp->device->timeout, 0, 1); *aSRpnt = SRpnt; if ((STp->buffer)->syscall_result != 0) { @@ -2723,7 +2724,7 @@ static int osst_configure_onstream(struc cmd[2] = CAPABILITIES_PAGE; cmd[4] = CAPABILITIES_PAGE_LENGTH + MODE_HEADER_LENGTH; - SRpnt = osst_do_scsi(SRpnt, STp, cmd, cmd[4], DMA_FROM_DEVICE, STp->timeout, 0, 1); + SRpnt = osst_do_scsi(SRpnt, STp, cmd, cmd[4], DMA_FROM_DEVICE, STp->device->timeout, 0, 1); *aSRpnt = SRpnt; if ((STp->buffer)->syscall_result != 0) { @@ -2743,7 +2744,7 @@ static int osst_configure_onstream(struc cmd[2] = TAPE_PARAMTR_PAGE; cmd[4] = TAPE_PARAMTR_PAGE_LENGTH + MODE_HEADER_LENGTH; - SRpnt = osst_do_scsi(SRpnt, STp, cmd, cmd[4], DMA_FROM_DEVICE, STp->timeout, 0, 1); + SRpnt = osst_do_scsi(SRpnt, STp, cmd, cmd[4], DMA_FROM_DEVICE, STp->device->timeout, 0, 1); *aSRpnt = SRpnt; if ((STp->buffer)->syscall_result != 0) { @@ -2818,7 +2819,7 @@ static int osst_get_frame_position(struc STp->buffer->b_data = mybuf; STp->buffer->buffer_size = 24; SRpnt = osst_do_scsi(*aSRpnt, STp, scmd, 20, DMA_FROM_DEVICE, - STp->timeout, MAX_RETRIES, 1); + STp->device->timeout, MAX_RETRIES, 1); if (!SRpnt) { STp->buffer->b_data = olddata; STp->buffer->buffer_size = oldsize; return (-EBUSY); @@ -2838,7 +2839,7 @@ static int osst_get_frame_position(struc scmd[0] = READ_POSITION; STp->buffer->b_data = mybuf; STp->buffer->buffer_size = 24; SRpnt = osst_do_scsi(SRpnt, STp, scmd, 20, DMA_FROM_DEVICE, - STp->timeout, MAX_RETRIES, 1); + STp->device->timeout, MAX_RETRIES, 1); #if DEBUG printk(OSST_DEB_MSG "%s:D: Reread position, reason=[%02x:%02x:%02x], result=[%s%02x:%02x:%02x]\n", name, mysense[2], mysense[12], mysense[13], STp->buffer->syscall_result?"":"ok:", @@ -3055,7 +3056,7 @@ static int osst_flush_write_buffer(struc #endif SRpnt = osst_do_scsi(*aSRpnt, STp, cmd, transfer, DMA_TO_DEVICE, - STp->timeout, MAX_RETRIES, 1); + STp->device->timeout, MAX_RETRIES, 1); *aSRpnt = SRpnt; if (!SRpnt) return (-EBUSY); @@ -3211,8 +3212,8 @@ static int osst_write_frame(struct osst_ if (!synchronous) STp->write_pending = 1; #endif - SRpnt = osst_do_scsi(*aSRpnt, STp, cmd, OS_FRAME_SIZE, DMA_TO_DEVICE, STp->timeout, - MAX_RETRIES, synchronous); + SRpnt = osst_do_scsi(*aSRpnt, STp, cmd, OS_FRAME_SIZE, DMA_TO_DEVICE, STp->device->timeout, + MAX_RETRIES, synchronous); if (!SRpnt) return (-EBUSY); *aSRpnt = SRpnt; @@ -3921,7 +3922,7 @@ static int osst_set_options(struct osst_ (value & ~MT_ST_SET_LONG_TIMEOUT)); } else { - STp->timeout = value * HZ; + STp->device->timeout = value * HZ; printk(KERN_INFO "%s:I: Normal timeout set to %d seconds.\n", name, value); } } @@ -4112,7 +4113,7 @@ static int osst_int_ioctl(struct osst_ta cmd[2] = (arg >> 16); cmd[3] = (arg >> 8); cmd[4] = arg; - timeout = STp->timeout; + timeout = STp->device->timeout; #if DEBUG if (debugging) printk(OSST_DEB_MSG "%s:D: Writing %d setmark(s).\n", name, @@ -4139,7 +4140,7 @@ static int osst_int_ioctl(struct osst_ta cmd[4] = 3; /* retension then mount */ if (cmd_in == MTOFFL) cmd[4] = 4; /* rewind then eject */ - timeout = STp->timeout; + timeout = STp->device->timeout; #if DEBUG if (debugging) { switch (cmd_in) { @@ -4464,7 +4465,7 @@ static int os_scsi_tape_open(struct inod memset (cmd, 0, MAX_COMMAND_SIZE); cmd[0] = TEST_UNIT_READY; - SRpnt = osst_do_scsi(NULL, STp, cmd, 0, DMA_NONE, STp->timeout, MAX_RETRIES, 1); + SRpnt = osst_do_scsi(NULL, STp, cmd, 0, DMA_NONE, STp->device->timeout, MAX_RETRIES, 1); if (!SRpnt) { retval = (STp->buffer)->syscall_result; /* FIXME - valid? */ goto err_out; @@ -4485,7 +4486,7 @@ static int os_scsi_tape_open(struct inod cmd[1] = 1; cmd[4] = 1; SRpnt = osst_do_scsi(SRpnt, STp, cmd, 0, DMA_NONE, - STp->timeout, MAX_RETRIES, 1); + STp->device->timeout, MAX_RETRIES, 1); } osst_wait_ready(STp, &SRpnt, (SRpnt->sense[13]==1?15:3) * 60, 0); } @@ -4502,7 +4503,7 @@ static int os_scsi_tape_open(struct inod cmd[0] = TEST_UNIT_READY; SRpnt = osst_do_scsi(SRpnt, STp, cmd, 0, DMA_NONE, - STp->timeout, MAX_RETRIES, 1); + STp->device->timeout, MAX_RETRIES, 1); if ((SRpnt->sense[0] & 0x70) != 0x70 || (SRpnt->sense[2] & 0x0f) != UNIT_ATTENTION) break; @@ -4538,7 +4539,7 @@ static int os_scsi_tape_open(struct inod cmd[2] = VENDOR_IDENT_PAGE; cmd[4] = VENDOR_IDENT_PAGE_LENGTH + MODE_HEADER_LENGTH; - SRpnt = osst_do_scsi(SRpnt, STp, cmd, cmd[4], DMA_FROM_DEVICE, STp->timeout, 0, 1); + SRpnt = osst_do_scsi(SRpnt, STp, cmd, cmd[4], DMA_FROM_DEVICE, STp->device->timeout, 0, 1); if (STp->buffer->syscall_result || STp->buffer->b_data[MODE_HEADER_LENGTH + 2] != 'L' || @@ -4601,7 +4602,7 @@ static int os_scsi_tape_open(struct inod #if DEBUG printk(OSST_DEB_MSG "%s:D: Applying soft reset\n", name); #endif - SRpnt = osst_do_scsi(SRpnt, STp, cmd, cmd[4], DMA_TO_DEVICE, STp->timeout, 0, 1); + SRpnt = osst_do_scsi(SRpnt, STp, cmd, cmd[4], DMA_TO_DEVICE, STp->device->timeout, 0, 1); STp->header_ok = 0; @@ -4611,7 +4612,7 @@ static int os_scsi_tape_open(struct inod cmd[0] = TEST_UNIT_READY; SRpnt = osst_do_scsi(SRpnt, STp, cmd, 0, DMA_NONE, - STp->timeout, MAX_RETRIES, 1); + STp->device->timeout, MAX_RETRIES, 1); if ((SRpnt->sense[0] & 0x70) != 0x70 || (SRpnt->sense[2] & 0x0f) == NOT_READY) break; @@ -5822,7 +5823,8 @@ static int osst_probe(struct device *dev tpnt->nbr_partitions = 0; tpnt->min_block = 512; tpnt->max_block = OS_DATA_SIZE; - tpnt->timeout = OSST_TIMEOUT; + if (!SDp->timeout) + SDp->timeout = OSST_TIMEOUT; tpnt->long_timeout = OSST_LONG_TIMEOUT; /* Recognize OnStream tapes */ Index: scsi-misc-2.6/drivers/scsi/osst.h =================================================================== --- scsi-misc-2.6.orig/drivers/scsi/osst.h +++ scsi-misc-2.6/drivers/scsi/osst.h @@ -548,7 +548,6 @@ struct osst_tape { unsigned char default_drvbuffer; /* 0xff = don't touch, value 3 bits */ unsigned char pos_unknown; /* after reset position unknown */ int write_threshold; - int timeout; /* timeout for normal commands */ int long_timeout; /* timeout for commands known to take long time*/ /* Mode characteristics */ - To unsubscribe from this list: send the line "unsubscribe linux-scsi" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html