Lines Matching +full:additional +full:- +full:devs
1 // SPDX-License-Identifier: GPL-2.0-only
13 Copyright 1992 - 2016 Kai Makisara
16 Some small formal changes - aeb, 950809
18 Last modified: 18-JAN-1998 Richard Gooch <rgooch@atnf.csiro.au> Devfs support
62 is defined and non-zero. */
159 6-byte SCSI read and write commands. */
160 #if ST_FIXED_BUFFER_SIZE >= (2 << 24 - 1)
161 #error "Buffer size should not exceed (2 << 24 - 1) bytes!"
166 /* Setting these non-zero may risk recognizing resets */
176 /* Remove mode bits and auto-rewind bit (7) */
178 (iminor(x) & ((1 << ST_MODE_SHIFT)-1)))
181 /* Construct the minor number from the device (d), mode (m), and non-rewind (n) data */
237 {"OnStream", "SC-", "", "osst"}, \
238 {"OnStream", "DI-", "", "osst"}, \
239 {"OnStream", "DP-", "", "osst"}, \
241 {"OnStream", "FW-", "", "osst"}
254 kref_get(&STp->kref); in scsi_tape_get()
256 if (!STp->device) in scsi_tape_get()
259 if (scsi_device_get(STp->device)) in scsi_tape_get()
265 kref_put(&STp->kref, scsi_tape_release); in scsi_tape_get()
275 struct scsi_device *sdev = STp->device; in scsi_tape_put()
278 kref_put(&STp->kref, scsi_tape_release); in scsi_tape_put()
291 /* {"XXX", "Yy-", "", NULL}, example */
301 for (rp=&(reject_list[0]); rp->vendor != NULL; rp++) in st_incompatible()
302 if (!strncmp(rp->vendor, SDp->vendor, strlen(rp->vendor)) && in st_incompatible()
303 !strncmp(rp->model, SDp->model, strlen(rp->model)) && in st_incompatible()
304 !strncmp(rp->rev, SDp->rev, strlen(rp->rev))) { in st_incompatible()
305 if (rp->driver_hint) in st_incompatible()
306 return rp->driver_hint; in st_incompatible()
315 sdev_prefix_printk(prefix, (t)->device, (t)->name, fmt, ##a)
326 const u8 *sense = SRpnt->sense; in st_analyze_sense()
328 s->have_sense = scsi_normalize_sense(SRpnt->sense, in st_analyze_sense()
329 SCSI_SENSE_BUFFERSIZE, &s->sense_hdr); in st_analyze_sense()
330 s->flags = 0; in st_analyze_sense()
332 if (s->have_sense) { in st_analyze_sense()
333 s->deferred = 0; in st_analyze_sense()
334 s->remainder_valid = in st_analyze_sense()
335 scsi_get_sense_info_fld(sense, SCSI_SENSE_BUFFERSIZE, &s->uremainder64); in st_analyze_sense()
338 s->deferred = 1; in st_analyze_sense()
341 s->fixed_format = 1; in st_analyze_sense()
342 s->flags = sense[2] & 0xe0; in st_analyze_sense()
345 s->deferred = 1; in st_analyze_sense()
348 s->fixed_format = 0; in st_analyze_sense()
350 s->flags = ucp ? (ucp[3] & 0xe0) : 0; in st_analyze_sense()
360 int result = SRpnt->result; in st_chk_result()
364 char *name = STp->name; in st_chk_result()
367 ctr = scsi_get_ua_por_ctr(STp->device); in st_chk_result()
368 if (ctr != STp->por_ctr) { in st_chk_result()
369 STp->por_ctr = ctr; in st_chk_result()
370 STp->pos_unknown = 1; /* ASC => power on / reset */ in st_chk_result()
377 cmdstatp = &STp->buffer->cmdstat; in st_chk_result()
380 if (cmdstatp->have_sense) in st_chk_result()
381 scode = STp->buffer->cmdstat.sense_hdr.sense_key; in st_chk_result()
389 SRpnt->cmd[0], SRpnt->cmd[1], SRpnt->cmd[2], in st_chk_result()
390 SRpnt->cmd[3], SRpnt->cmd[4], SRpnt->cmd[5]); in st_chk_result()
391 if (cmdstatp->have_sense) in st_chk_result()
392 __scsi_print_sense(STp->device, name, in st_chk_result()
393 SRpnt->sense, SCSI_SENSE_BUFFERSIZE); in st_chk_result()
396 if (!cmdstatp->have_sense) in st_chk_result()
400 else if (cmdstatp->have_sense && in st_chk_result()
406 SRpnt->cmd[0] != MODE_SENSE && in st_chk_result()
407 SRpnt->cmd[0] != TEST_UNIT_READY) { in st_chk_result()
409 __scsi_print_sense(STp->device, name, in st_chk_result()
410 SRpnt->sense, SCSI_SENSE_BUFFERSIZE); in st_chk_result()
414 if (cmdstatp->fixed_format && in st_chk_result()
415 STp->cln_mode >= EXTENDED_SENSE_START) { /* Only fixed format sense */ in st_chk_result()
416 if (STp->cln_sense_value) in st_chk_result()
417 STp->cleaning_req |= ((SRpnt->sense[STp->cln_mode] & in st_chk_result()
418 STp->cln_sense_mask) == STp->cln_sense_value); in st_chk_result()
420 STp->cleaning_req |= ((SRpnt->sense[STp->cln_mode] & in st_chk_result()
421 STp->cln_sense_mask) != 0); in st_chk_result()
423 if (cmdstatp->have_sense && in st_chk_result()
424 cmdstatp->sense_hdr.asc == 0 && cmdstatp->sense_hdr.ascq == 0x17) in st_chk_result()
425 STp->cleaning_req = 1; /* ASC and ASCQ => cleaning requested */ in st_chk_result()
426 if (cmdstatp->have_sense && scode == UNIT_ATTENTION && in st_chk_result()
427 cmdstatp->sense_hdr.asc == 0x29 && !STp->pos_unknown) { in st_chk_result()
428 STp->pos_unknown = 1; /* ASC => power on / reset */ in st_chk_result()
432 if (cmdstatp->have_sense && in st_chk_result()
435 && SRpnt->cmd[0] != WRITE_6 in st_chk_result()
436 && SRpnt->cmd[0] != WRITE_FILEMARKS in st_chk_result()
439 STp->recover_count++; in st_chk_result()
440 STp->recover_reg++; in st_chk_result()
444 if (SRpnt->cmd[0] == READ_6) in st_chk_result()
446 else if (SRpnt->cmd[0] == WRITE_6) in st_chk_result()
452 stp, STp->recover_count); in st_chk_result()
455 if (cmdstatp->flags == 0) in st_chk_result()
458 return (-EIO); in st_chk_result()
467 streq->stp = stp; in st_allocate_request()
472 stp->buffer->syscall_result = -EINTR; in st_allocate_request()
474 stp->buffer->syscall_result = -EBUSY; in st_allocate_request()
491 if (scmd->cmnd[0] == WRITE_6) { in st_do_stats()
492 now = ktime_sub(now, STp->stats->write_time); in st_do_stats()
493 atomic64_add(ktime_to_ns(now), &STp->stats->tot_write_time); in st_do_stats()
494 atomic64_add(ktime_to_ns(now), &STp->stats->tot_io_time); in st_do_stats()
495 atomic64_inc(&STp->stats->write_cnt); in st_do_stats()
496 if (scmd->result) { in st_do_stats()
497 atomic64_add(atomic_read(&STp->stats->last_write_size) in st_do_stats()
498 - STp->buffer->cmdstat.residual, in st_do_stats()
499 &STp->stats->write_byte_cnt); in st_do_stats()
500 if (STp->buffer->cmdstat.residual > 0) in st_do_stats()
501 atomic64_inc(&STp->stats->resid_cnt); in st_do_stats()
503 atomic64_add(atomic_read(&STp->stats->last_write_size), in st_do_stats()
504 &STp->stats->write_byte_cnt); in st_do_stats()
505 } else if (scmd->cmnd[0] == READ_6) { in st_do_stats()
506 now = ktime_sub(now, STp->stats->read_time); in st_do_stats()
507 atomic64_add(ktime_to_ns(now), &STp->stats->tot_read_time); in st_do_stats()
508 atomic64_add(ktime_to_ns(now), &STp->stats->tot_io_time); in st_do_stats()
509 atomic64_inc(&STp->stats->read_cnt); in st_do_stats()
510 if (scmd->result) { in st_do_stats()
511 atomic64_add(atomic_read(&STp->stats->last_read_size) in st_do_stats()
512 - STp->buffer->cmdstat.residual, in st_do_stats()
513 &STp->stats->read_byte_cnt); in st_do_stats()
514 if (STp->buffer->cmdstat.residual > 0) in st_do_stats()
515 atomic64_inc(&STp->stats->resid_cnt); in st_do_stats()
517 atomic64_add(atomic_read(&STp->stats->last_read_size), in st_do_stats()
518 &STp->stats->read_byte_cnt); in st_do_stats()
520 now = ktime_sub(now, STp->stats->other_time); in st_do_stats()
521 atomic64_add(ktime_to_ns(now), &STp->stats->tot_io_time); in st_do_stats()
522 atomic64_inc(&STp->stats->other_cnt); in st_do_stats()
524 atomic64_dec(&STp->stats->in_flight); in st_do_stats()
531 struct st_request *SRpnt = req->end_io_data; in st_scsi_execute_end()
532 struct scsi_tape *STp = SRpnt->stp; in st_scsi_execute_end()
535 STp->buffer->cmdstat.midlevel_result = SRpnt->result = scmd->result; in st_scsi_execute_end()
536 STp->buffer->cmdstat.residual = scmd->resid_len; in st_scsi_execute_end()
540 tmp = SRpnt->bio; in st_scsi_execute_end()
541 if (scmd->sense_len) in st_scsi_execute_end()
542 memcpy(SRpnt->sense, scmd->sense_buffer, SCSI_SENSE_BUFFERSIZE); in st_scsi_execute_end()
543 if (SRpnt->waiting) in st_scsi_execute_end()
544 complete(SRpnt->waiting); in st_scsi_execute_end()
556 struct rq_map_data *mdata = &SRpnt->stp->buffer->map_data; in st_scsi_execute()
558 struct scsi_tape *STp = SRpnt->stp; in st_scsi_execute()
561 req = scsi_alloc_request(SRpnt->stp->device->request_queue, in st_scsi_execute()
567 req->rq_flags |= RQF_QUIET; in st_scsi_execute()
569 mdata->null_mapped = 1; in st_scsi_execute()
572 err = blk_rq_map_user(req->q, req, mdata, NULL, bufflen, in st_scsi_execute()
580 atomic64_inc(&STp->stats->in_flight); in st_scsi_execute()
582 atomic_set(&STp->stats->last_write_size, bufflen); in st_scsi_execute()
583 STp->stats->write_time = ktime_get(); in st_scsi_execute()
585 atomic_set(&STp->stats->last_read_size, bufflen); in st_scsi_execute()
586 STp->stats->read_time = ktime_get(); in st_scsi_execute()
588 STp->stats->other_time = ktime_get(); in st_scsi_execute()
591 SRpnt->bio = req->bio; in st_scsi_execute()
592 scmd->cmd_len = COMMAND_SIZE(cmd[0]); in st_scsi_execute()
593 memcpy(scmd->cmnd, cmd, scmd->cmd_len); in st_scsi_execute()
594 req->timeout = timeout; in st_scsi_execute()
595 scmd->allowed = retries; in st_scsi_execute()
596 req->end_io = st_scsi_execute_end; in st_scsi_execute()
597 req->end_io_data = SRpnt; in st_scsi_execute()
611 struct rq_map_data *mdata = &STp->buffer->map_data; in st_do_scsi()
615 if (!do_wait && ((STp->buffer)->last_SRpnt)) { in st_do_scsi()
619 (STp->buffer)->syscall_result = (-EINTR); in st_do_scsi()
621 (STp->buffer)->syscall_result = (-EBUSY); in st_do_scsi()
634 (STp->buffer)->last_SRpnt = SRpnt; in st_do_scsi()
636 waiting = &STp->wait; in st_do_scsi()
638 SRpnt->waiting = waiting; in st_do_scsi()
640 if (STp->buffer->do_dio) { in st_do_scsi()
641 mdata->page_order = 0; in st_do_scsi()
642 mdata->nr_entries = STp->buffer->sg_segs; in st_do_scsi()
643 mdata->pages = STp->buffer->mapped_pages; in st_do_scsi()
645 mdata->page_order = STp->buffer->reserved_page_order; in st_do_scsi()
646 mdata->nr_entries = in st_do_scsi()
647 DIV_ROUND_UP(bytes, PAGE_SIZE << mdata->page_order); in st_do_scsi()
648 mdata->pages = STp->buffer->reserved_pages; in st_do_scsi()
649 mdata->offset = 0; in st_do_scsi()
652 memcpy(SRpnt->cmd, cmd, sizeof(SRpnt->cmd)); in st_do_scsi()
653 STp->buffer->cmdstat.have_sense = 0; in st_do_scsi()
654 STp->buffer->syscall_result = 0; in st_do_scsi()
660 (STp->buffer)->syscall_result = (-EBUSY); in st_do_scsi()
661 (STp->buffer)->last_SRpnt = NULL; in st_do_scsi()
664 SRpnt->waiting = NULL; in st_do_scsi()
665 (STp->buffer)->syscall_result = st_chk_result(STp, SRpnt); in st_do_scsi()
672 /* Handle the write-behind checking (waits for completion). Returns -ENOSPC if
673 write has been correct but EOM early warning reached, -EIO if write ended in
684 STbuffer = STp->buffer; in write_behind_check()
685 if (!STbuffer->writing) in write_behind_check()
689 if (STp->write_pending) in write_behind_check()
690 STp->nbr_waits++; in write_behind_check()
692 STp->nbr_finished++; in write_behind_check()
695 wait_for_completion(&(STp->wait)); in write_behind_check()
696 SRpnt = STbuffer->last_SRpnt; in write_behind_check()
697 STbuffer->last_SRpnt = NULL; in write_behind_check()
698 SRpnt->waiting = NULL; in write_behind_check()
700 (STp->buffer)->syscall_result = st_chk_result(STp, SRpnt); in write_behind_check()
703 STbuffer->buffer_bytes -= STbuffer->writing; in write_behind_check()
704 STps = &(STp->ps[STp->partition]); in write_behind_check()
705 if (STps->drv_block >= 0) { in write_behind_check()
706 if (STp->block_size == 0) in write_behind_check()
707 STps->drv_block++; in write_behind_check()
709 STps->drv_block += STbuffer->writing / STp->block_size; in write_behind_check()
712 cmdstatp = &STbuffer->cmdstat; in write_behind_check()
713 if (STbuffer->syscall_result) { in write_behind_check()
714 retval = -EIO; in write_behind_check()
715 if (cmdstatp->have_sense && !cmdstatp->deferred && in write_behind_check()
716 (cmdstatp->flags & SENSE_EOM) && in write_behind_check()
717 (cmdstatp->sense_hdr.sense_key == NO_SENSE || in write_behind_check()
718 cmdstatp->sense_hdr.sense_key == RECOVERED_ERROR)) { in write_behind_check()
719 /* EOM at write-behind, has all data been written? */ in write_behind_check()
720 if (!cmdstatp->remainder_valid || in write_behind_check()
721 cmdstatp->uremainder64 == 0) in write_behind_check()
722 retval = -ENOSPC; in write_behind_check()
724 if (retval == -EIO) in write_behind_check()
725 STps->drv_block = -1; in write_behind_check()
727 STbuffer->writing = 0; in write_behind_check()
732 STbuffer->cmdstat.midlevel_result, retval);) /* end DEB */ in write_behind_check()
751 cmd[2] = cmd[3] = cmd[4] = 0xff; /* -1 filemarks */ in cross_eof()
758 STp->device->request_queue->rq_timeout, in cross_eof()
761 return (STp->buffer)->syscall_result; in cross_eof()
766 if ((STp->buffer)->cmdstat.midlevel_result != 0) in cross_eof()
771 return (STp->buffer)->syscall_result; in cross_eof()
789 if (STp->dirty == 1) { in st_flush_write_buffer()
791 transfer = STp->buffer->buffer_bytes; in st_flush_write_buffer()
797 blks = transfer / STp->block_size; in st_flush_write_buffer()
803 STp->device->request_queue->rq_timeout, in st_flush_write_buffer()
806 return (STp->buffer)->syscall_result; in st_flush_write_buffer()
808 STps = &(STp->ps[STp->partition]); in st_flush_write_buffer()
809 if ((STp->buffer)->syscall_result != 0) { in st_flush_write_buffer()
810 struct st_cmdstatus *cmdstatp = &STp->buffer->cmdstat; in st_flush_write_buffer()
812 if (cmdstatp->have_sense && !cmdstatp->deferred && in st_flush_write_buffer()
813 (cmdstatp->flags & SENSE_EOM) && in st_flush_write_buffer()
814 (cmdstatp->sense_hdr.sense_key == NO_SENSE || in st_flush_write_buffer()
815 cmdstatp->sense_hdr.sense_key == RECOVERED_ERROR) && in st_flush_write_buffer()
816 (!cmdstatp->remainder_valid || in st_flush_write_buffer()
817 cmdstatp->uremainder64 == 0)) { /* All written at EOM early warning */ in st_flush_write_buffer()
818 STp->dirty = 0; in st_flush_write_buffer()
819 (STp->buffer)->buffer_bytes = 0; in st_flush_write_buffer()
820 if (STps->drv_block >= 0) in st_flush_write_buffer()
821 STps->drv_block += blks; in st_flush_write_buffer()
822 result = (-ENOSPC); in st_flush_write_buffer()
825 STps->drv_block = (-1); in st_flush_write_buffer()
826 result = (-EIO); in st_flush_write_buffer()
829 if (STps->drv_block >= 0) in st_flush_write_buffer()
830 STps->drv_block += blks; in st_flush_write_buffer()
831 STp->dirty = 0; in st_flush_write_buffer()
832 (STp->buffer)->buffer_bytes = 0; in st_flush_write_buffer()
848 if (STp->ready != ST_READY) in flush_buffer()
855 if (STp->pos_unknown) in flush_buffer()
856 return (-EIO); in flush_buffer()
858 STps = &(STp->ps[STp->partition]); in flush_buffer()
859 if (STps->rw == ST_WRITING) /* Writing */ in flush_buffer()
862 if (STp->block_size == 0) in flush_buffer()
865 backspace = ((STp->buffer)->buffer_bytes + in flush_buffer()
866 (STp->buffer)->read_pointer) / STp->block_size - in flush_buffer()
867 ((STp->buffer)->read_pointer + STp->block_size - 1) / in flush_buffer()
868 STp->block_size; in flush_buffer()
869 (STp->buffer)->buffer_bytes = 0; in flush_buffer()
870 (STp->buffer)->read_pointer = 0; in flush_buffer()
873 if (STps->eof == ST_FM_HIT) { in flush_buffer()
876 STps->eof = ST_NOEOF; in flush_buffer()
878 if (STps->drv_file >= 0) in flush_buffer()
879 STps->drv_file++; in flush_buffer()
880 STps->drv_block = 0; in flush_buffer()
885 } else if (STps->eof == ST_FM_HIT) { in flush_buffer()
886 if (STps->drv_file >= 0) in flush_buffer()
887 STps->drv_file++; in flush_buffer()
888 STps->drv_block = 0; in flush_buffer()
889 STps->eof = ST_NOEOF; in flush_buffer()
901 if (!STp->density_changed && in set_mode_densblk()
902 STm->default_density >= 0 && in set_mode_densblk()
903 STm->default_density != STp->density) { in set_mode_densblk()
904 arg = STm->default_density; in set_mode_densblk()
907 arg = STp->density; in set_mode_densblk()
909 if (!STp->blksize_changed && in set_mode_densblk()
910 STm->default_blksize >= 0 && in set_mode_densblk()
911 STm->default_blksize != STp->block_size) { in set_mode_densblk()
912 arg |= STm->default_blksize; in set_mode_densblk()
915 arg |= STp->block_size; in set_mode_densblk()
921 STm->default_blksize, STm->default_density); in set_mode_densblk()
923 return (-EINVAL); in set_mode_densblk()
936 retval = scsi_set_medium_removal(STp->device, in do_door_lock()
939 STp->door_locked = do_lock ? ST_LOCKED_EXPLICIT : ST_UNLOCKED; in do_door_lock()
941 STp->door_locked = ST_LOCK_FAILS; in do_door_lock()
952 STp->pos_unknown = 0; in reset_state()
954 STps = &(STp->ps[i]); in reset_state()
955 STps->rw = ST_IDLE; in reset_state()
956 STps->eof = ST_NOEOF; in reset_state()
957 STps->at_sm = 0; in reset_state()
958 STps->last_block_valid = 0; in reset_state()
959 STps->drv_block = -1; in reset_state()
960 STps->drv_file = -1; in reset_state()
962 if (STp->can_partitions) { in reset_state()
963 STp->partition = find_partition(STp); in reset_state()
964 if (STp->partition < 0) in reset_state()
965 STp->partition = 0; in reset_state()
985 struct st_cmdstatus *cmdstatp = &STp->buffer->cmdstat; in test_ready()
993 STp->long_timeout, MAX_READY_RETRIES, 1); in test_ready()
996 retval = (STp->buffer)->syscall_result; in test_ready()
1000 if (cmdstatp->have_sense) { in test_ready()
1002 scode = cmdstatp->sense_hdr.sense_key; in test_ready()
1005 if (cmdstatp->sense_hdr.asc == 0x28) { /* New media */ in test_ready()
1014 retval = (-EIO); in test_ready()
1022 retval = (-EINTR); in test_ready()
1029 if ((STp->device)->scsi_level >= SCSI_2 && in test_ready()
1030 cmdstatp->sense_hdr.asc == 0x3a) /* Check ASC */ in test_ready()
1039 ctr = scsi_get_ua_new_media_ctr(STp->device); in test_ready()
1040 if (ctr != STp->new_media_ctr) { in test_ready()
1041 STp->new_media_ctr = ctr; in test_ready()
1046 retval = (STp->buffer)->syscall_result; in test_ready()
1051 if (STp->first_tur) { in test_ready()
1053 STp->pos_unknown = 0; in test_ready()
1054 STp->first_tur = 0; in test_ready()
1072 unsigned short st_flags = filp->f_flags; in check_tape()
1079 STp->ready = ST_READY; in check_tape()
1081 if (mode != STp->current_mode) { in check_tape()
1083 STp->current_mode, mode); in check_tape()
1085 STp->current_mode = mode; in check_tape()
1087 STm = &(STp->modes[STp->current_mode]); in check_tape()
1089 saved_cleaning = STp->cleaning_req; in check_tape()
1090 STp->cleaning_req = 0; in check_tape()
1092 do_wait = ((filp->f_flags & O_NONBLOCK) == 0); in check_tape()
1099 STp->pos_unknown = 0; in check_tape()
1100 STp->partition = STp->new_partition = 0; in check_tape()
1101 if (STp->can_partitions) in check_tape()
1102 STp->nbr_partitions = 1; /* This guess will be updated later in check_tape()
1105 STps = &(STp->ps[i]); in check_tape()
1106 STps->rw = ST_IDLE; in check_tape()
1107 STps->eof = ST_NOEOF; in check_tape()
1108 STps->at_sm = 0; in check_tape()
1109 STps->last_block_valid = 0; in check_tape()
1110 STps->drv_block = 0; in check_tape()
1111 STps->drv_file = 0; in check_tape()
1116 STp->cleaning_req |= saved_cleaning; in check_tape()
1120 STp->ready = ST_NO_TAPE; in check_tape()
1122 STp->ready = ST_NOT_READY; in check_tape()
1124 STp->density = 0; /* Clear the erroneous "residue" */ in check_tape()
1125 STp->write_prot = 0; in check_tape()
1126 STp->block_size = 0; in check_tape()
1127 STp->ps[0].drv_file = STp->ps[0].drv_block = (-1); in check_tape()
1128 STp->partition = STp->new_partition = 0; in check_tape()
1129 STp->door_locked = ST_UNLOCKED; in check_tape()
1134 if (STp->omit_blklims) in check_tape()
1135 STp->min_block = STp->max_block = (-1); in check_tape()
1141 STp->device->request_queue->rq_timeout, in check_tape()
1144 retval = (STp->buffer)->syscall_result; in check_tape()
1148 if (!SRpnt->result && !STp->buffer->cmdstat.have_sense) { in check_tape()
1149 STp->max_block = ((STp->buffer)->b_data[1] << 16) | in check_tape()
1150 ((STp->buffer)->b_data[2] << 8) | (STp->buffer)->b_data[3]; in check_tape()
1151 STp->min_block = ((STp->buffer)->b_data[4] << 8) | in check_tape()
1152 (STp->buffer)->b_data[5]; in check_tape()
1153 if ( DEB( debugging || ) !STp->inited) in check_tape()
1155 "Block limits %d - %d bytes.\n", in check_tape()
1156 STp->min_block, STp->max_block); in check_tape()
1158 STp->min_block = STp->max_block = (-1); in check_tape()
1168 STp->device->request_queue->rq_timeout, in check_tape()
1171 retval = (STp->buffer)->syscall_result; in check_tape()
1175 if ((STp->buffer)->syscall_result != 0) { in check_tape()
1177 STp->block_size = ST_DEFAULT_BLOCK; /* Educated guess (?) */ in check_tape()
1178 (STp->buffer)->syscall_result = 0; /* Prevent error propagation */ in check_tape()
1179 STp->drv_write_prot = 0; in check_tape()
1183 (STp->buffer)->b_data[0], in check_tape()
1184 (STp->buffer)->b_data[1], in check_tape()
1185 (STp->buffer)->b_data[2], in check_tape()
1186 (STp->buffer)->b_data[3]); in check_tape()
1188 if ((STp->buffer)->b_data[3] >= 8) { in check_tape()
1189 STp->drv_buffer = ((STp->buffer)->b_data[2] >> 4) & 7; in check_tape()
1190 STp->density = (STp->buffer)->b_data[4]; in check_tape()
1191 STp->block_size = (STp->buffer)->b_data[9] * 65536 + in check_tape()
1192 (STp->buffer)->b_data[10] * 256 + (STp->buffer)->b_data[11]; in check_tape()
1195 STp->density, in check_tape()
1196 (STp->buffer)->b_data[5] * 65536 + in check_tape()
1197 (STp->buffer)->b_data[6] * 256 + in check_tape()
1198 (STp->buffer)->b_data[7], in check_tape()
1199 STp->drv_buffer); in check_tape()
1201 STp->drv_write_prot = ((STp->buffer)->b_data[2] & 0x80) != 0; in check_tape()
1202 if (!STp->drv_buffer && STp->immediate_filemark) { in check_tape()
1204 "non-buffered tape: disabling " in check_tape()
1206 STp->immediate_filemark = 0; in check_tape()
1211 STp->inited = 1; in check_tape()
1213 if (STp->block_size > 0) in check_tape()
1214 (STp->buffer)->buffer_blocks = in check_tape()
1215 (STp->buffer)->buffer_size / STp->block_size; in check_tape()
1217 (STp->buffer)->buffer_blocks = 1; in check_tape()
1218 (STp->buffer)->buffer_bytes = (STp->buffer)->read_pointer = 0; in check_tape()
1221 STp->block_size, (STp->buffer)->buffer_size, in check_tape()
1222 (STp->buffer)->buffer_blocks); in check_tape()
1224 if (STp->drv_write_prot) { in check_tape()
1225 STp->write_prot = 1; in check_tape()
1232 retval = (-EROFS); in check_tape()
1237 if (STp->can_partitions && STp->nbr_partitions < 1) { in check_tape()
1242 if ((STp->partition = find_partition(STp)) < 0) { in check_tape()
1243 retval = STp->partition; in check_tape()
1246 STp->new_partition = STp->partition; in check_tape()
1247 STp->nbr_partitions = 1; /* This guess will be updated when necessary */ in check_tape()
1251 STp->density_changed = STp->blksize_changed = 0; in check_tape()
1252 STp->compression_changed = 0; in check_tape()
1253 if (!(STm->defaults_for_writes) && in check_tape()
1257 if (STp->default_drvbuffer != 0xff) { in check_tape()
1258 if (st_int_ioctl(STp, MTSETDRVBUFFER, STp->default_drvbuffer)) in check_tape()
1262 STp->default_drvbuffer); in check_tape()
1277 int i, retval = (-EIO); in st_open()
1288 filp->f_mode &= ~(FMODE_PREAD | FMODE_PWRITE); in st_open()
1291 return -ENXIO; in st_open()
1294 filp->private_data = STp; in st_open()
1297 if (STp->in_use) { in st_open()
1301 return (-EBUSY); in st_open()
1304 STp->in_use = 1; in st_open()
1306 STp->rew_at_close = STp->autorew_dev = (iminor(inode) & 0x80) == 0; in st_open()
1308 if (scsi_autopm_get_device(STp->device) < 0) { in st_open()
1309 retval = -EIO; in st_open()
1313 if (!scsi_block_when_processing_errors(STp->device)) { in st_open()
1314 retval = (-ENXIO); in st_open()
1319 if (!enlarge_buffer(STp->buffer, PAGE_SIZE)) { in st_open()
1322 retval = (-EOVERFLOW); in st_open()
1326 (STp->buffer)->cleared = 0; in st_open()
1327 (STp->buffer)->writing = 0; in st_open()
1328 (STp->buffer)->syscall_result = 0; in st_open()
1330 STp->write_prot = ((filp->f_flags & O_ACCMODE) == O_RDONLY); in st_open()
1332 STp->dirty = 0; in st_open()
1334 STps = &(STp->ps[i]); in st_open()
1335 STps->rw = ST_IDLE; in st_open()
1337 STp->try_dio_now = STp->try_dio; in st_open()
1338 STp->recover_count = 0; in st_open()
1339 DEB( STp->nbr_waits = STp->nbr_finished = 0; in st_open()
1340 STp->nbr_requests = STp->nbr_dio = STp->nbr_pages = 0; ) in st_open()
1345 if ((filp->f_flags & O_NONBLOCK) == 0 && in st_open()
1347 if (STp->ready == NO_TAPE) in st_open()
1348 retval = (-ENOMEDIUM); in st_open()
1350 retval = (-EIO); in st_open()
1356 normalize_buffer(STp->buffer); in st_open()
1358 STp->in_use = 0; in st_open()
1361 scsi_autopm_put_device(STp->device); in st_open()
1374 struct scsi_tape *STp = filp->private_data; in st_flush()
1375 struct st_modedef *STm = &(STp->modes[STp->current_mode]); in st_flush()
1376 struct st_partstat *STps = &(STp->ps[STp->partition]); in st_flush()
1381 if (STps->rw == ST_WRITING && !STp->pos_unknown) { in st_flush()
1383 if (result != 0 && result != (-ENOSPC)) in st_flush()
1387 if (STp->can_partitions && in st_flush()
1395 DEBC( if (STp->nbr_requests) in st_flush()
1398 "pages %d.\n", STp->nbr_requests, STp->nbr_dio, in st_flush()
1399 STp->nbr_pages)); in st_flush()
1401 if (STps->rw == ST_WRITING && !STp->pos_unknown) { in st_flush()
1402 struct st_cmdstatus *cmdstatp = &STp->buffer->cmdstat; in st_flush()
1406 STp->nbr_waits, STp->nbr_finished); in st_flush()
1410 if (STp->immediate_filemark) in st_flush()
1412 cmd[4] = 1 + STp->two_fm; in st_flush()
1415 STp->device->request_queue->rq_timeout, in st_flush()
1418 result = (STp->buffer)->syscall_result; in st_flush()
1422 if (STp->buffer->syscall_result == 0 || in st_flush()
1423 (cmdstatp->have_sense && !cmdstatp->deferred && in st_flush()
1424 (cmdstatp->flags & SENSE_EOM) && in st_flush()
1425 (cmdstatp->sense_hdr.sense_key == NO_SENSE || in st_flush()
1426 cmdstatp->sense_hdr.sense_key == RECOVERED_ERROR) && in st_flush()
1427 (!cmdstatp->remainder_valid || cmdstatp->uremainder64 == 0))) { in st_flush()
1431 if (STps->drv_file >= 0) in st_flush()
1432 STps->drv_file++; in st_flush()
1433 STps->drv_block = 0; in st_flush()
1434 if (STp->two_fm) in st_flush()
1436 STps->eof = ST_FM; in st_flush()
1444 result = (-EIO); in st_flush()
1448 } else if (!STp->rew_at_close) { in st_flush()
1449 STps = &(STp->ps[STp->partition]); in st_flush()
1450 if (!STm->sysv || STps->rw != ST_READING) { in st_flush()
1451 if (STp->can_bsr) in st_flush()
1453 else if (STps->eof == ST_FM_HIT) { in st_flush()
1456 if (STps->drv_file >= 0) in st_flush()
1457 STps->drv_file++; in st_flush()
1458 STps->drv_block = 0; in st_flush()
1459 STps->eof = ST_FM; in st_flush()
1461 STps->eof = ST_NOEOF; in st_flush()
1463 } else if ((STps->eof == ST_NOEOF && in st_flush()
1465 STps->eof == ST_FM_HIT) { in st_flush()
1466 if (STps->drv_file >= 0) in st_flush()
1467 STps->drv_file++; in st_flush()
1468 STps->drv_block = 0; in st_flush()
1469 STps->eof = ST_FM; in st_flush()
1474 if (STp->rew_at_close) { in st_flush()
1487 struct scsi_tape *STp = filp->private_data; in st_release()
1489 if (STp->door_locked == ST_LOCKED_AUTO) in st_release()
1492 normalize_buffer(STp->buffer); in st_release()
1494 STp->in_use = 0; in st_release()
1496 scsi_autopm_put_device(STp->device); in st_release()
1513 if (!scsi_block_when_processing_errors(STp->device)) { in rw_checks()
1514 retval = (-ENXIO); in rw_checks()
1518 if (STp->ready != ST_READY) { in rw_checks()
1519 if (STp->ready == ST_NO_TAPE) in rw_checks()
1520 retval = (-ENOMEDIUM); in rw_checks()
1522 retval = (-EIO); in rw_checks()
1526 if (! STp->modes[STp->current_mode].defined) { in rw_checks()
1527 retval = (-ENXIO); in rw_checks()
1536 if (STp->pos_unknown) { in rw_checks()
1537 retval = (-EIO); in rw_checks()
1545 if (!STp->in_use) { in rw_checks()
1548 retval = (-EIO); in rw_checks()
1552 if (STp->can_partitions && in rw_checks()
1556 if (STp->block_size == 0 && STp->max_block > 0 && in rw_checks()
1557 (count < STp->min_block || count > STp->max_block)) { in rw_checks()
1558 retval = (-EINVAL); in rw_checks()
1562 if (STp->do_auto_lock && STp->door_locked == ST_UNLOCKED && in rw_checks()
1564 STp->door_locked = ST_LOCKED_AUTO; in rw_checks()
1575 struct st_buffer *STbp = STp->buffer; in setup_buffering()
1578 i = STp->try_dio_now && try_rdio; in setup_buffering()
1580 i = STp->try_dio_now && try_wdio; in setup_buffering()
1583 STp->device->request_queue)) == 0) { in setup_buffering()
1584 i = sgl_map_user_pages(STbp, STbp->use_sg, (unsigned long)buf, in setup_buffering()
1587 STbp->do_dio = i; in setup_buffering()
1588 STbp->buffer_bytes = 0; /* can be used as transfer counter */ in setup_buffering()
1591 STbp->do_dio = 0; /* fall back to buffering with any error */ in setup_buffering()
1592 STbp->sg_segs = STbp->do_dio; in setup_buffering()
1594 if (STbp->do_dio) { in setup_buffering()
1595 STp->nbr_dio++; in setup_buffering()
1596 STp->nbr_pages += STbp->do_dio; in setup_buffering()
1600 STbp->do_dio = 0; in setup_buffering()
1601 DEB( STp->nbr_requests++; ) in setup_buffering()
1603 if (!STbp->do_dio) { in setup_buffering()
1604 if (STp->block_size) in setup_buffering()
1605 bufsize = STp->block_size > st_fixed_buffer_size ? in setup_buffering()
1606 STp->block_size : st_fixed_buffer_size; in setup_buffering()
1611 if (is_read && STp->sili && !STbp->cleared) in setup_buffering()
1615 if (bufsize > STbp->buffer_size && in setup_buffering()
1620 retval = (-EOVERFLOW); in setup_buffering()
1623 if (STp->block_size) in setup_buffering()
1624 STbp->buffer_blocks = bufsize / STp->block_size; in setup_buffering()
1637 STbp = STp->buffer; in release_buffering()
1638 if (STbp->do_dio) { in release_buffering()
1639 sgl_unmap_user_pages(STbp, STbp->do_dio, is_read); in release_buffering()
1640 STbp->do_dio = 0; in release_buffering()
1641 STbp->sg_segs = 0; in release_buffering()
1658 struct scsi_tape *STp = filp->private_data; in st_write()
1663 if (mutex_lock_interruptible(&STp->lock)) in st_write()
1664 return -ERESTARTSYS; in st_write()
1671 if (STp->block_size != 0 && (count % STp->block_size) != 0) { in st_write()
1674 retval = (-EINVAL); in st_write()
1678 STm = &(STp->modes[STp->current_mode]); in st_write()
1679 STps = &(STp->ps[STp->partition]); in st_write()
1681 if (STp->write_prot) { in st_write()
1682 retval = (-EACCES); in st_write()
1687 if (STps->rw == ST_READING) { in st_write()
1691 STps->rw = ST_WRITING; in st_write()
1692 } else if (STps->rw != ST_WRITING && in st_write()
1693 STps->drv_file == 0 && STps->drv_block == 0) { in st_write()
1696 if (STm->default_compression != ST_DONT_TOUCH && in st_write()
1697 !(STp->compression_changed)) { in st_write()
1698 if (st_compression(STp, (STm->default_compression == ST_YES))) { in st_write()
1702 retval = (-EINVAL); in st_write()
1709 STbp = STp->buffer; in st_write()
1712 if (i == -ENOSPC) in st_write()
1713 STps->eof = ST_EOM_OK; in st_write()
1715 STps->eof = ST_EOM_ERROR; in st_write()
1718 if (STps->eof == ST_EOM_OK) { in st_write()
1719 STps->eof = ST_EOD_1; /* allow next write */ in st_write()
1720 retval = (-ENOSPC); in st_write()
1723 else if (STps->eof == ST_EOM_ERROR) { in st_write()
1724 retval = (-EIO); in st_write()
1730 if (STp->block_size != 0 && in st_write()
1731 !STbp->do_dio && in st_write()
1733 copy_from_user(&i, buf + count - 1, 1) != 0)) { in st_write()
1734 retval = (-EFAULT); in st_write()
1746 cmd[1] = (STp->block_size != 0); in st_write()
1748 STps->rw = ST_WRITING; in st_write()
1753 if (STbp->do_dio) { in st_write()
1757 if (STp->block_size == 0) in st_write()
1760 do_count = STbp->buffer_blocks * STp->block_size - in st_write()
1761 STbp->buffer_bytes; in st_write()
1772 count -= do_count; in st_write()
1775 async_write = STp->block_size == 0 && !STbp->do_dio && in st_write()
1776 STm->do_async_writes && STps->eof < ST_EOM_OK; in st_write()
1778 if (STp->block_size != 0 && STm->do_buffer_writes && in st_write()
1779 !(STp->try_dio_now && try_wdio) && STps->eof < ST_EOM_OK && in st_write()
1780 STbp->buffer_bytes < STbp->buffer_size) { in st_write()
1781 STp->dirty = 1; in st_write()
1788 if (STp->block_size == 0) in st_write()
1791 if (!STbp->do_dio) in st_write()
1792 blks = STbp->buffer_bytes; in st_write()
1795 blks /= STp->block_size; in st_write()
1796 transfer = blks * STp->block_size; in st_write()
1803 STp->device->request_queue->rq_timeout, in st_write()
1806 retval = STbp->syscall_result; in st_write()
1809 if (async_write && !STbp->syscall_result) { in st_write()
1810 STbp->writing = transfer; in st_write()
1811 STp->dirty = !(STbp->writing == in st_write()
1812 STbp->buffer_bytes); in st_write()
1814 DEB( STp->write_pending = 1; ) in st_write()
1818 if (STbp->syscall_result != 0) { in st_write()
1819 struct st_cmdstatus *cmdstatp = &STp->buffer->cmdstat; in st_write()
1822 if (cmdstatp->have_sense && (cmdstatp->flags & SENSE_EOM)) { in st_write()
1823 scode = cmdstatp->sense_hdr.sense_key; in st_write()
1824 if (cmdstatp->remainder_valid) in st_write()
1825 undone = (int)cmdstatp->uremainder64; in st_write()
1826 else if (STp->block_size == 0 && in st_write()
1831 if (STp->block_size != 0) in st_write()
1832 undone *= STp->block_size; in st_write()
1836 b_point -= undone; in st_write()
1837 do_count -= undone; in st_write()
1838 if (STp->block_size) in st_write()
1839 blks = (transfer - undone) / STp->block_size; in st_write()
1840 STps->eof = ST_EOM_OK; in st_write()
1845 if (STp->block_size == 0 || in st_write()
1847 retval = (-ENOSPC); /* EOM within current request */ in st_write()
1854 if (!retry_eot && !cmdstatp->deferred && in st_write()
1856 move_buffer_data(STp->buffer, transfer - undone); in st_write()
1858 if (STps->drv_block >= 0) { in st_write()
1859 STps->drv_block += (transfer - undone) / in st_write()
1860 STp->block_size; in st_write()
1862 STps->eof = ST_EOM_OK; in st_write()
1866 STp->buffer->buffer_bytes); in st_write()
1872 count -= do_count; in st_write()
1874 STps->eof = ST_EOM_ERROR; in st_write()
1875 STps->drv_block = (-1); /* Too cautious? */ in st_write()
1876 retval = (-EIO); /* EOM for old data */ in st_write()
1883 STps->drv_block = (-1); /* Too cautious? */ in st_write()
1884 retval = STbp->syscall_result; in st_write()
1889 if (STps->drv_block >= 0) { in st_write()
1890 if (STp->block_size == 0) in st_write()
1891 STps->drv_block += (do_count > 0); in st_write()
1893 STps->drv_block += blks; in st_write()
1896 STbp->buffer_bytes = 0; in st_write()
1897 STp->dirty = 0; in st_write()
1901 retval = total - count; in st_write()
1906 if (STps->eof == ST_EOD_1) in st_write()
1907 STps->eof = ST_EOM_OK; in st_write()
1908 else if (STps->eof != ST_EOM_OK) in st_write()
1909 STps->eof = ST_NOEOF; in st_write()
1910 retval = total - count; in st_write()
1916 mutex_unlock(&STp->lock); in st_write()
1941 STm = &(STp->modes[STp->current_mode]); in read_tape()
1942 STps = &(STp->ps[STp->partition]); in read_tape()
1943 if (STps->eof == ST_FM_HIT) in read_tape()
1945 STbp = STp->buffer; in read_tape()
1947 if (STp->block_size == 0) in read_tape()
1950 if (!(STp->try_dio_now && try_rdio) && STm->do_read_ahead) { in read_tape()
1951 blks = (STp->buffer)->buffer_blocks; in read_tape()
1952 bytes = blks * STp->block_size; in read_tape()
1955 if (!STbp->do_dio && bytes > (STp->buffer)->buffer_size) in read_tape()
1956 bytes = (STp->buffer)->buffer_size; in read_tape()
1957 blks = bytes / STp->block_size; in read_tape()
1958 bytes = blks * STp->block_size; in read_tape()
1964 cmd[1] = (STp->block_size != 0); in read_tape()
1965 if (!cmd[1] && STp->sili) in read_tape()
1973 STp->device->request_queue->rq_timeout, in read_tape()
1978 return STbp->syscall_result; in read_tape()
1980 STbp->read_pointer = 0; in read_tape()
1981 STps->at_sm = 0; in read_tape()
1984 if (STbp->syscall_result) { in read_tape()
1985 struct st_cmdstatus *cmdstatp = &STp->buffer->cmdstat; in read_tape()
1990 SRpnt->sense[0], SRpnt->sense[1], in read_tape()
1991 SRpnt->sense[2], SRpnt->sense[3], in read_tape()
1992 SRpnt->sense[4], SRpnt->sense[5], in read_tape()
1993 SRpnt->sense[6], SRpnt->sense[7]); in read_tape()
1994 if (cmdstatp->have_sense) { in read_tape()
1996 if (cmdstatp->sense_hdr.sense_key == BLANK_CHECK) in read_tape()
1997 cmdstatp->flags &= 0xcf; /* No need for EOM in this case */ in read_tape()
1999 if (cmdstatp->flags != 0) { /* EOF, EOM, or ILI */ in read_tape()
2001 if (cmdstatp->remainder_valid) in read_tape()
2002 transfer = (int)cmdstatp->uremainder64; in read_tape()
2005 if (cmdstatp->sense_hdr.sense_key == MEDIUM_ERROR) { in read_tape()
2006 if (STp->block_size == 0) in read_tape()
2009 cmdstatp->flags &= ~SENSE_ILI; in read_tape()
2012 if (cmdstatp->flags & SENSE_ILI) { /* ILI */ in read_tape()
2013 if (STp->block_size == 0 && in read_tape()
2019 bytes - transfer, in read_tape()
2021 if (STps->drv_block >= 0) in read_tape()
2022 STps->drv_block += 1; in read_tape()
2023 STbp->buffer_bytes = 0; in read_tape()
2024 return (-ENOMEM); in read_tape()
2025 } else if (STp->block_size == 0) { in read_tape()
2026 STbp->buffer_bytes = bytes - transfer; in read_tape()
2034 if (STps->drv_block >= 0) in read_tape()
2035 STps->drv_block += blks - transfer + 1; in read_tape()
2037 return (-EIO); in read_tape()
2040 STbp->buffer_bytes = (blks - transfer) * in read_tape()
2041 STp->block_size; in read_tape()
2046 STbp->buffer_bytes); in read_tape()
2047 if (STps->drv_block >= 0) in read_tape()
2048 STps->drv_block += 1; in read_tape()
2050 return (-EIO); in read_tape()
2052 } else if (cmdstatp->flags & SENSE_FMK) { /* FM overrides EOM */ in read_tape()
2053 if (STps->eof != ST_FM_HIT) in read_tape()
2054 STps->eof = ST_FM_HIT; in read_tape()
2056 STps->eof = ST_EOD_2; in read_tape()
2057 if (STp->block_size == 0) in read_tape()
2058 STbp->buffer_bytes = 0; in read_tape()
2060 STbp->buffer_bytes = in read_tape()
2061 bytes - transfer * STp->block_size; in read_tape()
2064 STbp->buffer_bytes); in read_tape()
2065 } else if (cmdstatp->flags & SENSE_EOM) { in read_tape()
2066 if (STps->eof == ST_FM) in read_tape()
2067 STps->eof = ST_EOD_1; in read_tape()
2069 STps->eof = ST_EOM_OK; in read_tape()
2070 if (STp->block_size == 0) in read_tape()
2071 STbp->buffer_bytes = bytes - transfer; in read_tape()
2073 STbp->buffer_bytes = in read_tape()
2074 bytes - transfer * STp->block_size; in read_tape()
2078 STbp->buffer_bytes); in read_tape()
2084 STps->drv_block = (-1); in read_tape()
2085 if (STps->eof == ST_FM && in read_tape()
2086 cmdstatp->sense_hdr.sense_key == BLANK_CHECK) { in read_tape()
2090 STps->eof = ST_EOD_2; /* First BLANK_CHECK after FM */ in read_tape()
2092 retval = (-EIO); in read_tape()
2095 if (STbp->buffer_bytes < 0) /* Caused by bogus sense data */ in read_tape()
2096 STbp->buffer_bytes = 0; in read_tape()
2099 else { /* Non-extended sense */ in read_tape()
2100 retval = STbp->syscall_result; in read_tape()
2106 STbp->buffer_bytes = bytes; in read_tape()
2107 if (STp->sili) /* In fixed block mode residual is always zero here */ in read_tape()
2108 STbp->buffer_bytes -= STp->buffer->cmdstat.residual; in read_tape()
2111 if (STps->drv_block >= 0) { in read_tape()
2112 if (STp->block_size == 0) in read_tape()
2113 STps->drv_block++; in read_tape()
2115 STps->drv_block += STbp->buffer_bytes / STp->block_size; in read_tape()
2130 struct scsi_tape *STp = filp->private_data; in st_read()
2133 struct st_buffer *STbp = STp->buffer; in st_read()
2135 if (mutex_lock_interruptible(&STp->lock)) in st_read()
2136 return -ERESTARTSYS; in st_read()
2142 STm = &(STp->modes[STp->current_mode]); in st_read()
2143 if (STp->block_size != 0 && (count % STp->block_size) != 0) { in st_read()
2144 if (!STm->do_read_ahead) { in st_read()
2145 retval = (-EINVAL); /* Read must be integral number of blocks */ in st_read()
2148 STp->try_dio_now = 0; /* Direct i/o can't handle split blocks */ in st_read()
2151 STps = &(STp->ps[STp->partition]); in st_read()
2152 if (STps->rw == ST_WRITING) { in st_read()
2156 STps->rw = ST_READING; in st_read()
2159 if (debugging && STps->eof != ST_NOEOF) in st_read()
2162 STps->eof, STbp->buffer_bytes); in st_read()
2168 do_dio = STbp->do_dio; in st_read()
2170 if (STbp->buffer_bytes == 0 && in st_read()
2171 STps->eof >= ST_EOD_1) { in st_read()
2172 if (STps->eof < ST_EOD) { in st_read()
2173 STps->eof += 1; in st_read()
2177 retval = (-EIO); /* EOM or Blank Check */ in st_read()
2186 copy_from_user(&i, buf + count - 1, 1) != 0 || in st_read()
2187 copy_to_user(buf + count - 1, &i, 1) != 0) { in st_read()
2188 retval = (-EFAULT); in st_read()
2193 STps->rw = ST_READING; in st_read()
2200 if (STbp->buffer_bytes == 0) { in st_read()
2201 special = read_tape(STp, count - total, &SRpnt); in st_read()
2209 if (STbp->buffer_bytes > 0) { in st_read()
2211 if (debugging && STps->eof != ST_NOEOF) in st_read()
2214 STps->eof, STbp->buffer_bytes, in st_read()
2215 (int)(count - total)); in st_read()
2217 transfer = STbp->buffer_bytes < count - total ? in st_read()
2218 STbp->buffer_bytes : count - total; in st_read()
2230 if (STp->block_size == 0) in st_read()
2238 if (STps->eof == ST_FM_HIT) { in st_read()
2239 STps->eof = ST_FM; in st_read()
2240 STps->drv_block = 0; in st_read()
2241 if (STps->drv_file >= 0) in st_read()
2242 STps->drv_file++; in st_read()
2243 } else if (STps->eof == ST_EOD_1) { in st_read()
2244 STps->eof = ST_EOD_2; in st_read()
2245 STps->drv_block = 0; in st_read()
2246 if (STps->drv_file >= 0) in st_read()
2247 STps->drv_file++; in st_read()
2248 } else if (STps->eof == ST_EOD_2) in st_read()
2249 STps->eof = ST_EOD; in st_read()
2250 } else if (STps->eof == ST_FM) in st_read()
2251 STps->eof = ST_NOEOF; in st_read()
2261 STbp->buffer_bytes = 0; in st_read()
2263 mutex_unlock(&STp->lock); in st_read()
2278 STp->current_mode, STm->do_buffer_writes, in DEB()
2279 STm->do_async_writes, STm->do_read_ahead); in DEB()
2283 STp->can_bsr, STp->two_fm, STp->fast_mteom, in DEB()
2284 STp->do_auto_lock); in DEB()
2288 STm->defaults_for_writes, STp->omit_blklims, in DEB()
2289 STp->can_partitions, STp->scsi2_logical); in DEB()
2293 STm->sysv, STp->immediate, STp->sili, in DEB()
2294 STp->immediate_filemark); in DEB()
2309 STm = &(STp->modes[STp->current_mode]);
2310 if (!STm->defined) {
2311 cd0 = STm->cdevs[0];
2312 cd1 = STm->cdevs[1];
2313 d0 = STm->devs[0];
2314 d1 = STm->devs[1];
2315 memcpy(STm, &(STp->modes[0]), sizeof(struct st_modedef));
2316 STm->cdevs[0] = cd0;
2317 STm->cdevs[1] = cd1;
2318 STm->devs[0] = d0;
2319 STm->devs[1] = d1;
2322 STp->current_mode);
2327 STm->do_buffer_writes = (options & MT_ST_BUFFER_WRITES) != 0;
2328 STm->do_async_writes = (options & MT_ST_ASYNC_WRITES) != 0;
2329 STm->defaults_for_writes = (options & MT_ST_DEF_WRITES) != 0;
2330 STm->do_read_ahead = (options & MT_ST_READ_AHEAD) != 0;
2331 STp->two_fm = (options & MT_ST_TWO_FM) != 0;
2332 STp->fast_mteom = (options & MT_ST_FAST_MTEOM) != 0;
2333 STp->do_auto_lock = (options & MT_ST_AUTO_LOCK) != 0;
2334 STp->can_bsr = (options & MT_ST_CAN_BSR) != 0;
2335 STp->omit_blklims = (options & MT_ST_NO_BLKLIMS) != 0;
2336 if ((STp->device)->scsi_level >= SCSI_2)
2337 STp->can_partitions = (options & MT_ST_CAN_PARTITIONS) != 0;
2338 STp->scsi2_logical = (options & MT_ST_SCSI2LOGICAL) != 0;
2339 STp->immediate = (options & MT_ST_NOWAIT) != 0;
2340 STp->immediate_filemark = (options & MT_ST_NOWAIT_EOF) != 0;
2341 STm->sysv = (options & MT_ST_SYSV) != 0;
2342 STp->sili = (options & MT_ST_SILI) != 0;
2348 STm->do_buffer_writes = value;
2350 STm->do_async_writes = value;
2352 STm->defaults_for_writes = value;
2354 STm->do_read_ahead = value;
2356 STp->two_fm = value;
2358 STp->fast_mteom = value;
2360 STp->do_auto_lock = value;
2362 STp->can_bsr = value;
2364 STp->omit_blklims = value;
2365 if ((STp->device)->scsi_level >= SCSI_2 &&
2367 STp->can_partitions = value;
2369 STp->scsi2_logical = value;
2371 STp->immediate = value;
2373 STp->immediate_filemark = value;
2375 STm->sysv = value;
2377 STp->sili = value;
2387 STm->default_blksize = (-1);
2390 STm->default_blksize = value;
2392 "%d bytes.\n", STm->default_blksize);
2393 if (STp->ready == ST_READY) {
2394 STp->blksize_changed = 0;
2401 STp->long_timeout = (value & ~MT_ST_SET_LONG_TIMEOUT) * HZ;
2405 blk_queue_rq_timeout(STp->device->request_queue,
2415 return (-EINVAL);
2416 STp->cln_mode = value;
2417 STp->cln_sense_mask = (options >> 8) & 0xff;
2418 STp->cln_sense_value = (options >> 16) & 0xff;
2421 value, STp->cln_sense_mask, STp->cln_sense_value);
2427 STm->default_density = (-1);
2431 STm->default_density = value & 0xff;
2433 STm->default_density);
2434 if (STp->ready == ST_READY) {
2435 STp->density_changed = 0;
2441 STp->default_drvbuffer = 0xff;
2445 STp->default_drvbuffer = value & 7;
2448 STp->default_drvbuffer);
2449 if (STp->ready == ST_READY)
2450 st_int_ioctl(STp, MTSETDRVBUFFER, STp->default_drvbuffer);
2454 STm->default_compression = ST_DONT_TOUCH;
2459 STp->c_algo = (value & 0xff00) >> 8;
2462 STp->c_algo);
2465 STm->default_compression = (value & 1 ? ST_YES : ST_NO);
2469 if (STp->ready == ST_READY) {
2470 STp->compression_changed = 0;
2471 st_compression(STp, (STm->default_compression == ST_YES));
2477 return (-EIO);
2517 STp->device->request_queue->rq_timeout, 0, 1); in read_mode_page()
2519 return (STp->buffer)->syscall_result; in read_mode_page()
2523 return STp->buffer->syscall_result; in read_mode_page()
2528 in the buffer is correctly formatted. The long timeout is used if slow is non-zero. */
2539 pgo = MODE_HEADER_LENGTH + (STp->buffer)->b_data[MH_OFF_BDESCS_LENGTH]; in write_mode_page()
2540 cmd[4] = pgo + (STp->buffer)->b_data[pgo + MP_OFF_PAGE_LENGTH] + 2; in write_mode_page()
2543 (STp->buffer)->b_data[MH_OFF_DATA_LENGTH] = 0; in write_mode_page()
2544 (STp->buffer)->b_data[MH_OFF_MEDIUM_TYPE] = 0; in write_mode_page()
2545 (STp->buffer)->b_data[MH_OFF_DEV_SPECIFIC] &= ~MH_BIT_WP; in write_mode_page()
2546 (STp->buffer)->b_data[pgo + MP_OFF_PAGE_NBR] &= MP_MSK_PAGE_NBR; in write_mode_page()
2549 STp->long_timeout : STp->device->request_queue->rq_timeout; in write_mode_page()
2553 return (STp->buffer)->syscall_result; in write_mode_page()
2557 return STp->buffer->syscall_result; in write_mode_page()
2574 The block descriptors are read and written because Sony SDT-7000 does not
2582 unsigned char *b_data = (STp->buffer)->b_data; in st_compression()
2584 if (STp->ready != ST_READY) in st_compression()
2585 return (-EIO); in st_compression()
2591 return (-EIO); in st_compression()
2601 return (-EIO); in st_compression()
2607 if (STp->c_algo != 0) in st_compression()
2608 b_data[mpoffs + CP_OFF_C_ALGO] = STp->c_algo; in st_compression()
2612 if (STp->c_algo != 0) in st_compression()
2619 return (-EIO); in st_compression()
2623 STp->compression_changed = 1; in st_compression()
2631 int retval = (-EIO), timeout; in do_load_unload()
2636 if (STp->ready != ST_READY && !load_code) { in do_load_unload()
2637 if (STp->ready == ST_NO_TAPE) in do_load_unload()
2638 return (-ENOMEDIUM); in do_load_unload()
2640 return (-EIO); in do_load_unload()
2654 load_code - MT_ST_HPLOADER_OFFSET); in do_load_unload()
2655 cmd[3] = load_code - MT_ST_HPLOADER_OFFSET; /* MediaID field of C1553A */ in do_load_unload()
2657 if (STp->immediate) { in do_load_unload()
2659 timeout = STp->device->request_queue->rq_timeout; in do_load_unload()
2662 timeout = STp->long_timeout; in do_load_unload()
2674 return (STp->buffer)->syscall_result; in do_load_unload()
2676 retval = (STp->buffer)->syscall_result; in do_load_unload()
2682 STp->rew_at_close = 0; in do_load_unload()
2683 STp->ready = ST_NO_TAPE; in do_load_unload()
2686 STp->rew_at_close = STp->autorew_dev; in do_load_unload()
2693 STps = &(STp->ps[STp->partition]); in do_load_unload()
2694 STps->drv_file = STps->drv_block = (-1); in do_load_unload()
2712 sc = -sc; in deb_space_print()
2736 WARN_ON(STp->buffer->do_dio != 0); in st_int_ioctl()
2737 if (STp->ready != ST_READY) { in st_int_ioctl()
2738 if (STp->ready == ST_NO_TAPE) in st_int_ioctl()
2739 return (-ENOMEDIUM); in st_int_ioctl()
2741 return (-EIO); in st_int_ioctl()
2743 timeout = STp->long_timeout; in st_int_ioctl()
2744 STps = &(STp->ps[STp->partition]); in st_int_ioctl()
2745 fileno = STps->drv_file; in st_int_ioctl()
2746 blkno = STps->drv_block; in st_int_ioctl()
2747 at_sm = STps->at_sm; in st_int_ioctl()
2772 ltmp = (-arg); in st_int_ioctl()
2778 fileno -= arg; in st_int_ioctl()
2779 blkno = (-1); /* We can't know the block number */ in st_int_ioctl()
2796 ltmp = (-arg); in st_int_ioctl()
2802 blkno -= arg; in st_int_ioctl()
2813 blkno = fileno = (-1); in st_int_ioctl()
2820 ltmp = (-arg); in st_int_ioctl()
2826 blkno = fileno = (-1); in st_int_ioctl()
2833 if (STp->write_prot) in st_int_ioctl()
2834 return (-EACCES); in st_int_ioctl()
2839 (cmd_in == MTWEOF && STp->immediate_filemark)) in st_int_ioctl()
2844 timeout = STp->device->request_queue->rq_timeout; in st_int_ioctl()
2866 if (STp->immediate) { in st_int_ioctl()
2868 timeout = STp->device->request_queue->rq_timeout; in st_int_ioctl()
2878 if (STp->immediate) { in st_int_ioctl()
2880 timeout = STp->device->request_queue->rq_timeout; in st_int_ioctl()
2887 if (!STp->fast_mteom) { in st_int_ioctl()
2890 fileno = STps->drv_file; in st_int_ioctl()
2891 if (STps->eof >= ST_EOD_1) in st_int_ioctl()
2898 fileno = (-1); in st_int_ioctl()
2902 blkno = -1; in st_int_ioctl()
2906 if (STp->write_prot) in st_int_ioctl()
2907 return (-EACCES); in st_int_ioctl()
2909 cmd[1] = (arg ? 1 : 0); /* Long erase with non-zero argument */ in st_int_ioctl()
2910 if (STp->immediate) { in st_int_ioctl()
2912 timeout = STp->device->request_queue->rq_timeout; in st_int_ioctl()
2915 timeout = STp->long_timeout * 8; in st_int_ioctl()
2924 if (STp->dirty || (STp->buffer)->buffer_bytes != 0) in st_int_ioctl()
2925 return (-EIO); /* Not allowed if data in buffer */ in st_int_ioctl()
2928 STp->max_block > 0 && in st_int_ioctl()
2929 ((arg & MT_ST_BLKSIZE_MASK) < STp->min_block || in st_int_ioctl()
2930 (arg & MT_ST_BLKSIZE_MASK) > STp->max_block)) { in st_int_ioctl()
2932 return (-EINVAL); in st_int_ioctl()
2935 if ((STp->use_pf & USE_PF)) in st_int_ioctl()
2940 memset((STp->buffer)->b_data, 0, 12); in st_int_ioctl()
2942 (STp->buffer)->b_data[2] = (arg & 7) << 4; in st_int_ioctl()
2944 (STp->buffer)->b_data[2] = in st_int_ioctl()
2945 STp->drv_buffer << 4; in st_int_ioctl()
2946 (STp->buffer)->b_data[3] = 8; /* block descriptor length */ in st_int_ioctl()
2948 (STp->buffer)->b_data[4] = arg; in st_int_ioctl()
2949 STp->density_changed = 1; /* At least we tried ;-) */ in st_int_ioctl()
2950 STp->changed_density = arg; in st_int_ioctl()
2952 (STp->buffer)->b_data[4] = arg >> 24; in st_int_ioctl()
2954 (STp->buffer)->b_data[4] = STp->density; in st_int_ioctl()
2958 STp->blksize_changed = 1; /* At least we tried ;-) */ in st_int_ioctl()
2959 STp->changed_blksize = arg; in st_int_ioctl()
2962 ltmp = STp->block_size; in st_int_ioctl()
2963 (STp->buffer)->b_data[9] = (ltmp >> 16); in st_int_ioctl()
2964 (STp->buffer)->b_data[10] = (ltmp >> 8); in st_int_ioctl()
2965 (STp->buffer)->b_data[11] = ltmp; in st_int_ioctl()
2966 timeout = STp->device->request_queue->rq_timeout; in st_int_ioctl()
2971 (STp->buffer)->b_data[9] * 65536 + in st_int_ioctl()
2972 (STp->buffer)->b_data[10] * 256 + in st_int_ioctl()
2973 (STp->buffer)->b_data[11]); in st_int_ioctl()
2977 (STp->buffer)->b_data[4]); in st_int_ioctl()
2981 ((STp->buffer)->b_data[2] >> 4) & 7); in st_int_ioctl()
2985 return (-ENOSYS); in st_int_ioctl()
2991 return (STp->buffer)->syscall_result; in st_int_ioctl()
2993 ioctl_result = (STp->buffer)->syscall_result; in st_int_ioctl()
2998 STps->drv_block = blkno; in st_int_ioctl()
2999 STps->drv_file = fileno; in st_int_ioctl()
3000 STps->at_sm = at_sm; in st_int_ioctl()
3008 STp->block_size = arg & MT_ST_BLKSIZE_MASK; in st_int_ioctl()
3009 if (STp->block_size != 0) { in st_int_ioctl()
3010 (STp->buffer)->buffer_blocks = in st_int_ioctl()
3011 (STp->buffer)->buffer_size / STp->block_size; in st_int_ioctl()
3013 (STp->buffer)->buffer_bytes = (STp->buffer)->read_pointer = 0; in st_int_ioctl()
3015 STp->density = arg >> MT_ST_DENSITY_SHIFT; in st_int_ioctl()
3017 STp->drv_buffer = (arg & 7); in st_int_ioctl()
3019 STp->density = arg; in st_int_ioctl()
3022 STps->eof = ST_EOD; in st_int_ioctl()
3024 STps->eof = ST_FM; in st_int_ioctl()
3026 STps->eof = ST_NOEOF; in st_int_ioctl()
3029 STps->rw = ST_IDLE; /* prevent automatic WEOF at close */ in st_int_ioctl()
3032 struct st_cmdstatus *cmdstatp = &STp->buffer->cmdstat; in st_int_ioctl()
3034 if (cmdstatp->flags & SENSE_EOM) { in st_int_ioctl()
3037 STps->eof = ST_EOM_OK; in st_int_ioctl()
3038 STps->drv_block = 0; in st_int_ioctl()
3041 if (cmdstatp->remainder_valid) in st_int_ioctl()
3042 undone = (int)cmdstatp->uremainder64; in st_int_ioctl()
3047 cmdstatp->have_sense && in st_int_ioctl()
3048 (cmdstatp->flags & SENSE_EOM)) { in st_int_ioctl()
3049 if (cmdstatp->sense_hdr.sense_key == NO_SENSE || in st_int_ioctl()
3050 cmdstatp->sense_hdr.sense_key == RECOVERED_ERROR) { in st_int_ioctl()
3052 STps->eof = ST_NOEOF; in st_int_ioctl()
3055 fileno -= undone; in st_int_ioctl()
3057 STps->eof = ST_NOEOF; in st_int_ioctl()
3059 STps->drv_file = fileno; in st_int_ioctl()
3062 STps->drv_file = fileno - undone; in st_int_ioctl()
3064 STps->drv_file = fileno; in st_int_ioctl()
3065 STps->drv_block = -1; in st_int_ioctl()
3066 STps->eof = ST_NOEOF; in st_int_ioctl()
3069 undone = (-undone); in st_int_ioctl()
3070 if (STps->drv_file >= 0) in st_int_ioctl()
3071 STps->drv_file = fileno + undone; in st_int_ioctl()
3072 STps->drv_block = 0; in st_int_ioctl()
3073 STps->eof = ST_NOEOF; in st_int_ioctl()
3075 if (cmdstatp->flags & SENSE_FMK) { /* Hit filemark */ in st_int_ioctl()
3076 if (STps->drv_file >= 0) in st_int_ioctl()
3077 STps->drv_file++; in st_int_ioctl()
3078 STps->drv_block = 0; in st_int_ioctl()
3079 STps->eof = ST_FM; in st_int_ioctl()
3082 STps->drv_block = blkno - undone; in st_int_ioctl()
3084 STps->drv_block = (-1); in st_int_ioctl()
3085 STps->eof = ST_NOEOF; in st_int_ioctl()
3088 if (cmdstatp->flags & SENSE_FMK) { /* Hit filemark */ in st_int_ioctl()
3089 STps->drv_file--; in st_int_ioctl()
3090 STps->drv_block = (-1); in st_int_ioctl()
3093 undone = (-undone); in st_int_ioctl()
3094 if (STps->drv_block >= 0) in st_int_ioctl()
3095 STps->drv_block = blkno + undone; in st_int_ioctl()
3097 STps->eof = ST_NOEOF; in st_int_ioctl()
3099 STps->drv_file = (-1); in st_int_ioctl()
3100 STps->drv_block = (-1); in st_int_ioctl()
3101 STps->eof = ST_EOD; in st_int_ioctl()
3106 if (cmdstatp->sense_hdr.sense_key == ILLEGAL_REQUEST && in st_int_ioctl()
3107 cmdstatp->sense_hdr.asc == 0x24 && in st_int_ioctl()
3108 (STp->device)->scsi_level <= SCSI_2 && in st_int_ioctl()
3109 !(STp->use_pf & PF_TESTED)) { in st_int_ioctl()
3112 STp->use_pf = (STp->use_pf ^ USE_PF) | PF_TESTED; in st_int_ioctl()
3118 STps->eof = ST_NOEOF; in st_int_ioctl()
3120 if (cmdstatp->sense_hdr.sense_key == BLANK_CHECK) in st_int_ioctl()
3121 STps->eof = ST_EOD; in st_int_ioctl()
3141 if (STp->ready != ST_READY) in get_location()
3142 return (-EIO); in get_location()
3145 if ((STp->device)->scsi_level < SCSI_2) { in get_location()
3150 if (!logical && !STp->scsi2_logical) in get_location()
3154 STp->device->request_queue->rq_timeout, in get_location()
3157 return (STp->buffer)->syscall_result; in get_location()
3159 if ((STp->buffer)->syscall_result != 0 || in get_location()
3160 (STp->device->scsi_level >= SCSI_2 && in get_location()
3161 ((STp->buffer)->b_data[0] & 4) != 0)) { in get_location()
3164 result = (-EIO); in get_location()
3167 if ((STp->device)->scsi_level < SCSI_2) { in get_location()
3168 *block = ((STp->buffer)->b_data[0] << 16) in get_location()
3169 + ((STp->buffer)->b_data[1] << 8) in get_location()
3170 + (STp->buffer)->b_data[2]; in get_location()
3173 *block = ((STp->buffer)->b_data[4] << 24) in get_location()
3174 + ((STp->buffer)->b_data[5] << 16) in get_location()
3175 + ((STp->buffer)->b_data[6] << 8) in get_location()
3176 + (STp->buffer)->b_data[7]; in get_location()
3177 *partition = (STp->buffer)->b_data[1]; in get_location()
3178 if (((STp->buffer)->b_data[0] & 0x80) && in get_location()
3179 (STp->buffer)->b_data[1] == 0) /* BOP of partition 0 */ in get_location()
3180 STp->ps[0].drv_block = STp->ps[0].drv_file = 0; in get_location()
3204 if (STp->ready != ST_READY) in set_location()
3205 return (-EIO); in set_location()
3206 timeout = STp->long_timeout; in set_location()
3207 STps = &(STp->ps[STp->partition]); in set_location()
3212 return (-EIO); ) in set_location()
3215 if ((!STp->can_partitions && partition != 0) || in set_location()
3217 return (-EINVAL); in set_location()
3218 if (partition != STp->partition) { in set_location()
3220 STps->last_block_valid = 0; in set_location()
3222 STps->last_block_valid = 1; in set_location()
3223 STps->last_block_visited = blk; in set_location()
3226 blk, STp->partition); in set_location()
3231 if ((STp->device)->scsi_level < SCSI_2) { in set_location()
3243 if (!logical && !STp->scsi2_logical) in set_location()
3245 if (STp->partition != partition) { in set_location()
3249 "from %d to %d\n", STp->partition, in set_location()
3253 if (STp->immediate) { in set_location()
3255 timeout = STp->device->request_queue->rq_timeout; in set_location()
3261 return (STp->buffer)->syscall_result; in set_location()
3263 STps->drv_block = STps->drv_file = (-1); in set_location()
3264 STps->eof = ST_NOEOF; in set_location()
3265 if ((STp->buffer)->syscall_result != 0) { in set_location()
3266 result = (-EIO); in set_location()
3267 if (STp->can_partitions && in set_location()
3268 (STp->device)->scsi_level >= SCSI_2 && in set_location()
3270 STp->partition = p; in set_location()
3272 if (STp->can_partitions) { in set_location()
3273 STp->partition = partition; in set_location()
3274 STps = &(STp->ps[partition]); in set_location()
3275 if (!STps->last_block_valid || in set_location()
3276 STps->last_block_visited != block) { in set_location()
3277 STps->at_sm = 0; in set_location()
3278 STps->rw = ST_IDLE; in set_location()
3281 STps->at_sm = 0; in set_location()
3283 STps->drv_block = STps->drv_file = 0; in set_location()
3304 return (-EIO); in find_partition()
3314 if (STp->partition == STp->new_partition) in switch_partition()
3316 STps = &(STp->ps[STp->new_partition]); in switch_partition()
3317 if (!STps->last_block_valid) in switch_partition()
3318 STps->last_block_visited = 0; in switch_partition()
3319 return set_location(STp, STps->last_block_visited, STp->new_partition, 1); in switch_partition()
3345 if (STp->ready != ST_READY) in nbr_partitions()
3346 return (-EIO); in nbr_partitions()
3352 result = (-EIO); in nbr_partitions()
3354 result = (STp->buffer)->b_data[MODE_HEADER_LENGTH + in nbr_partitions()
3366 int timeout = STp->long_timeout; in format_medium()
3373 if (STp->immediate) { in format_medium()
3375 timeout = STp->device->request_queue->rq_timeout; in format_medium()
3381 result = STp->buffer->syscall_result; in format_medium()
3389 The block descriptors are read and written because Sony SDT-7000 does not
3394 Michael Schaefer's Sony SDT-7000 returns two descriptors and the second is
3395 used to set the size of partition 1 (this is what the SCSI-3 standard specifies).
3397 partition size fields is greater than the maximum number of additional partitions
3403 size field is used for the first additional partition size.
3405 For drives that advertize SCSI-3 or newer, use the SSC-3 methods.
3411 bool scsi3 = STp->device->scsi_level >= SCSI_3, needs_format = false; in partition_tape()
3424 size = -size; in partition_tape()
3428 bp = (STp->buffer)->b_data; in partition_tape()
3433 psd_cnt = (bp[pgo + MP_OFF_PAGE_LENGTH] + 2 - PART_PAGE_FIXED_LENGTH) / 2; in partition_tape()
3468 result = -EINVAL; in partition_tape()
3523 result = (-EIO); in partition_tape()
3540 struct scsi_tape *STp = file->private_data; in st_ioctl()
3544 if (mutex_lock_interruptible(&STp->lock)) in st_ioctl()
3545 return -ERESTARTSYS; in st_ioctl()
3548 if (debugging && !STp->in_use) { in st_ioctl()
3550 retval = (-EIO); in st_ioctl()
3554 STm = &(STp->modes[STp->current_mode]); in st_ioctl()
3555 STps = &(STp->ps[STp->partition]); in st_ioctl()
3563 retval = scsi_ioctl_block_when_processing_errors(STp->device, cmd_in, in st_ioctl()
3564 file->f_flags & O_NDELAY); in st_ioctl()
3575 retval = (-EINVAL); in st_ioctl()
3581 retval = (-EFAULT); in st_ioctl()
3588 retval = (-EPERM); in st_ioctl()
3591 if (!STm->defined && in st_ioctl()
3594 retval = (-ENXIO); in st_ioctl()
3598 if (!STp->pos_unknown) { in st_ioctl()
3600 if (STps->eof == ST_FM_HIT) { in st_ioctl()
3603 mtc.mt_count -= 1; in st_ioctl()
3604 if (STps->drv_file >= 0) in st_ioctl()
3605 STps->drv_file += 1; in st_ioctl()
3608 if (STps->drv_file >= 0) in st_ioctl()
3609 STps->drv_file += 1; in st_ioctl()
3616 i = !STp->can_partitions || in st_ioctl()
3617 (STp->new_partition != STp->partition); in st_ioctl()
3631 if (STps->rw == ST_WRITING && in st_ioctl()
3642 STps->rw = ST_IDLE; in st_ioctl()
3658 retval = (-EIO); in st_ioctl()
3666 if (STp->can_partitions) { in st_ioctl()
3667 /* STp->new_partition contains the in st_ioctl()
3670 STp->partition = 0; in st_ioctl()
3673 if (STp->density_changed) in st_ioctl()
3674 st_int_ioctl(STp, MTSETDENSITY, STp->changed_density); in st_ioctl()
3675 if (STp->blksize_changed) in st_ioctl()
3676 st_int_ioctl(STp, MTSETBLK, STp->changed_blksize); in st_ioctl()
3683 STps->rw = ST_IDLE; /* Prevent automatic WEOF and fsf */ in st_ioctl()
3685 if (mtc.mt_op == MTOFFL && STp->door_locked != ST_UNLOCKED) in st_ioctl()
3695 if (!STp->can_partitions || in st_ioctl()
3697 retval = (-EINVAL); in st_ioctl()
3700 if (mtc.mt_count >= STp->nbr_partitions && in st_ioctl()
3701 (STp->nbr_partitions = nbr_partitions(STp)) < 0) { in st_ioctl()
3702 retval = (-EIO); in st_ioctl()
3705 if (mtc.mt_count >= STp->nbr_partitions) { in st_ioctl()
3706 retval = (-EINVAL); in st_ioctl()
3709 STp->new_partition = mtc.mt_count; in st_ioctl()
3715 if (!STp->can_partitions) { in st_ioctl()
3716 retval = (-EINVAL); in st_ioctl()
3730 STp->ps[i].rw = ST_IDLE; in st_ioctl()
3731 STp->ps[i].at_sm = 0; in st_ioctl()
3732 STp->ps[i].last_block_valid = 0; in st_ioctl()
3734 STp->partition = STp->new_partition = 0; in st_ioctl()
3735 STp->nbr_partitions = mtc.mt_count != 0 ? 2 : 1; in st_ioctl()
3736 STps->drv_block = STps->drv_file = 0; in st_ioctl()
3742 i = set_location(STp, mtc.mt_count, STp->new_partition, 0); in st_ioctl()
3743 if (!STp->can_partitions) in st_ioctl()
3744 STp->ps[0].rw = ST_IDLE; in st_ioctl()
3764 if (STp->can_partitions && STp->ready == ST_READY && in st_ioctl()
3776 if (!STm->defined) { in st_ioctl()
3777 retval = (-ENXIO); in st_ioctl()
3784 if (cmd_mtiocget && STp->pos_unknown) { in st_ioctl()
3785 /* flush fails -> modify status accordingly */ in st_ioctl()
3787 STp->pos_unknown = 1; in st_ioctl()
3793 if (STp->can_partitions) { in st_ioctl()
3806 retval = (-EINVAL); in st_ioctl()
3810 mt_status.mt_type = STp->tape_type; in st_ioctl()
3812 ((STp->block_size << MT_ST_BLKSIZE_SHIFT) & MT_ST_BLKSIZE_MASK) | in st_ioctl()
3813 ((STp->density << MT_ST_DENSITY_SHIFT) & MT_ST_DENSITY_MASK); in st_ioctl()
3814 mt_status.mt_blkno = STps->drv_block; in st_ioctl()
3815 mt_status.mt_fileno = STps->drv_file; in st_ioctl()
3816 if (STp->block_size != 0 && mt_status.mt_blkno >= 0) { in st_ioctl()
3817 if (STps->rw == ST_WRITING) in st_ioctl()
3819 (STp->buffer)->buffer_bytes / STp->block_size; in st_ioctl()
3820 else if (STps->rw == ST_READING) in st_ioctl()
3821 mt_status.mt_blkno -= in st_ioctl()
3822 ((STp->buffer)->buffer_bytes + in st_ioctl()
3823 STp->block_size - 1) / STp->block_size; in st_ioctl()
3827 if (STp->drv_write_prot) in st_ioctl()
3835 mt_status.mt_erreg = (STp->recover_reg << MT_ST_SOFTERR_SHIFT); in st_ioctl()
3836 mt_status.mt_resid = STp->partition; in st_ioctl()
3837 if (STps->eof == ST_EOM_OK || STps->eof == ST_EOM_ERROR) in st_ioctl()
3839 else if (STps->eof >= ST_EOM_OK) in st_ioctl()
3841 if (STp->density == 1) in st_ioctl()
3843 else if (STp->density == 2) in st_ioctl()
3845 else if (STp->density == 3) in st_ioctl()
3847 if (STp->ready == ST_READY) in st_ioctl()
3849 if (STp->ready == ST_NO_TAPE) in st_ioctl()
3851 if (STps->at_sm) in st_ioctl()
3853 if (STm->do_async_writes || in st_ioctl()
3854 (STm->do_buffer_writes && STp->block_size != 0) || in st_ioctl()
3855 STp->drv_buffer != 0) in st_ioctl()
3857 if (STp->cleaning_req) in st_ioctl()
3864 STp->recover_reg = 0; /* Clear after read */ in st_ioctl()
3870 retval = (-EINVAL); in st_ioctl()
3881 mutex_unlock(&STp->lock); in st_ioctl()
3888 return -EPERM; in st_ioctl()
3894 retval = scsi_ioctl(STp->device, file->f_mode & FMODE_WRITE, cmd_in, p); in st_ioctl()
3897 STp->rew_at_close = 0; in st_ioctl()
3898 STp->ready = ST_NO_TAPE; in st_ioctl()
3903 mutex_unlock(&STp->lock); in st_ioctl()
3937 tb->frp_segs = 0; in new_tape_buffer()
3938 tb->use_sg = max_sg; in new_tape_buffer()
3939 tb->buffer_size = 0; in new_tape_buffer()
3941 tb->reserved_pages = kcalloc(max_sg, sizeof(struct page *), in new_tape_buffer()
3943 if (!tb->reserved_pages) { in new_tape_buffer()
3960 if (new_size <= STbuffer->buffer_size) in enlarge_buffer()
3963 if (STbuffer->buffer_size <= PAGE_SIZE) in enlarge_buffer()
3966 max_segs = STbuffer->use_sg; in enlarge_buffer()
3970 if (STbuffer->cleared) in enlarge_buffer()
3973 if (STbuffer->frp_segs) { in enlarge_buffer()
3974 order = STbuffer->reserved_page_order; in enlarge_buffer()
3982 STbuffer->reserved_page_order = order; in enlarge_buffer()
3991 for (segs = STbuffer->frp_segs, got = STbuffer->buffer_size; in enlarge_buffer()
3997 DEB(STbuffer->buffer_size = got); in enlarge_buffer()
4002 STbuffer->frp_segs += 1; in enlarge_buffer()
4004 STbuffer->buffer_size = got; in enlarge_buffer()
4005 STbuffer->reserved_pages[segs] = page; in enlarge_buffer()
4008 STbuffer->b_data = page_address(STbuffer->reserved_pages[0]); in enlarge_buffer()
4019 for (i=0; i < st_bp->frp_segs; i++) in clear_buffer()
4020 memset(page_address(st_bp->reserved_pages[i]), 0, in clear_buffer()
4021 PAGE_SIZE << st_bp->reserved_page_order); in clear_buffer()
4022 st_bp->cleared = 1; in clear_buffer()
4029 int i, order = STbuffer->reserved_page_order; in normalize_buffer()
4031 for (i = 0; i < STbuffer->frp_segs; i++) { in normalize_buffer()
4032 __free_pages(STbuffer->reserved_pages[i], order); in normalize_buffer()
4033 STbuffer->buffer_size -= (PAGE_SIZE << order); in normalize_buffer()
4035 STbuffer->frp_segs = 0; in normalize_buffer()
4036 STbuffer->sg_segs = 0; in normalize_buffer()
4037 STbuffer->reserved_page_order = 0; in normalize_buffer()
4038 STbuffer->map_data.offset = 0; in normalize_buffer()
4047 int length = PAGE_SIZE << st_bp->reserved_page_order; in append_to_buffer()
4049 for (i = 0, offset = st_bp->buffer_bytes; in append_to_buffer()
4050 i < st_bp->frp_segs && offset >= length; i++) in append_to_buffer()
4051 offset -= length; in append_to_buffer()
4052 if (i == st_bp->frp_segs) { /* Should never happen */ in append_to_buffer()
4054 return (-EIO); in append_to_buffer()
4056 for (; i < st_bp->frp_segs && do_count > 0; i++) { in append_to_buffer()
4057 struct page *page = st_bp->reserved_pages[i]; in append_to_buffer()
4058 cnt = length - offset < do_count ? length - offset : do_count; in append_to_buffer()
4061 return (-EFAULT); in append_to_buffer()
4062 do_count -= cnt; in append_to_buffer()
4063 st_bp->buffer_bytes += cnt; in append_to_buffer()
4068 return (-EIO); in append_to_buffer()
4079 int length = PAGE_SIZE << st_bp->reserved_page_order; in from_buffer()
4081 for (i = 0, offset = st_bp->read_pointer; in from_buffer()
4082 i < st_bp->frp_segs && offset >= length; i++) in from_buffer()
4083 offset -= length; in from_buffer()
4084 if (i == st_bp->frp_segs) { /* Should never happen */ in from_buffer()
4086 return (-EIO); in from_buffer()
4088 for (; i < st_bp->frp_segs && do_count > 0; i++) { in from_buffer()
4089 struct page *page = st_bp->reserved_pages[i]; in from_buffer()
4090 cnt = length - offset < do_count ? length - offset : do_count; in from_buffer()
4093 return (-EFAULT); in from_buffer()
4094 do_count -= cnt; in from_buffer()
4095 st_bp->buffer_bytes -= cnt; in from_buffer()
4096 st_bp->read_pointer += cnt; in from_buffer()
4101 return (-EIO); in from_buffer()
4112 int length = PAGE_SIZE << st_bp->reserved_page_order; in move_buffer_data()
4117 total=st_bp->buffer_bytes - offset; in move_buffer_data()
4118 for (src_seg=0; src_seg < st_bp->frp_segs; src_seg++) { in move_buffer_data()
4122 offset -= length; in move_buffer_data()
4125 st_bp->buffer_bytes = st_bp->read_pointer = total; in move_buffer_data()
4127 struct page *dpage = st_bp->reserved_pages[dst_seg]; in move_buffer_data()
4128 struct page *spage = st_bp->reserved_pages[src_seg]; in move_buffer_data()
4130 count = min(length - dst_offset, length - src_offset); in move_buffer_data()
4143 total -= count; in move_buffer_data()
4224 struct st_modedef *STm = &(tape->modes[mode]); in create_one_cdev()
4226 int dev_num = tape->index; in create_one_cdev()
4233 error = -ENOMEM; in create_one_cdev()
4236 cdev->owner = THIS_MODULE; in create_one_cdev()
4237 cdev->ops = &st_fops; in create_one_cdev()
4238 STm->cdevs[rew] = cdev; in create_one_cdev()
4242 pr_err("st%d: Can't add %s-rewind mode %d\n", dev_num, in create_one_cdev()
4248 i = mode << (4 - ST_NBR_MODE_BITS); in create_one_cdev()
4250 tape->name, st_formats[i]); in create_one_cdev()
4252 dev = device_create(&st_sysfs_class, &tape->device->sdev_gendev, in create_one_cdev()
4253 cdev_devno, &tape->modes[mode], "%s", name); in create_one_cdev()
4260 STm->devs[rew] = dev; in create_one_cdev()
4264 cdev_del(STm->cdevs[rew]); in create_one_cdev()
4266 STm->cdevs[rew] = NULL; in create_one_cdev()
4267 STm->devs[rew] = NULL; in create_one_cdev()
4283 return sysfs_create_link(&tape->device->sdev_gendev.kobj, in create_cdevs()
4284 &tape->modes[0].devs[0]->kobj, "tape"); in create_cdevs()
4290 sysfs_remove_link(&tape->device->sdev_gendev.kobj, "tape"); in remove_cdevs()
4292 struct st_modedef *STm = &(tape->modes[mode]); in remove_cdevs()
4294 if (STm->cdevs[rew]) in remove_cdevs()
4295 cdev_del(STm->cdevs[rew]); in remove_cdevs()
4296 if (STm->devs[rew]) in remove_cdevs()
4297 device_unregister(STm->devs[rew]); in remove_cdevs()
4311 if (SDp->type != TYPE_TAPE) in st_probe()
4312 return -ENODEV; in st_probe()
4317 "please mail to linux-scsi@vger.kernel.org.\n"); in st_probe()
4318 return -ENODEV; in st_probe()
4322 i = queue_max_segments(SDp->request_queue); in st_probe()
4339 kref_init(&tpnt->kref); in st_probe()
4341 tpnt->device = SDp; in st_probe()
4342 if (SDp->scsi_level <= 2) in st_probe()
4343 tpnt->tape_type = MT_ISSCSI1; in st_probe()
4345 tpnt->tape_type = MT_ISSCSI2; in st_probe()
4347 tpnt->buffer = buffer; in st_probe()
4348 tpnt->buffer->last_SRpnt = NULL; in st_probe()
4350 tpnt->inited = 0; in st_probe()
4351 tpnt->dirty = 0; in st_probe()
4352 tpnt->in_use = 0; in st_probe()
4353 tpnt->drv_buffer = 1; /* Try buffering if no mode sense */ in st_probe()
4354 tpnt->use_pf = (SDp->scsi_level >= SCSI_2); in st_probe()
4355 tpnt->density = 0; in st_probe()
4356 tpnt->do_auto_lock = ST_AUTO_LOCK; in st_probe()
4357 tpnt->can_bsr = (SDp->scsi_level > 2 ? 1 : ST_IN_FILE_POS); /* BSR mandatory in SCSI3 */ in st_probe()
4358 tpnt->can_partitions = 0; in st_probe()
4359 tpnt->two_fm = ST_TWO_FM; in st_probe()
4360 tpnt->fast_mteom = ST_FAST_MTEOM; in st_probe()
4361 tpnt->scsi2_logical = ST_SCSI2LOGICAL; in st_probe()
4362 tpnt->sili = ST_SILI; in st_probe()
4363 tpnt->immediate = ST_NOWAIT; in st_probe()
4364 tpnt->immediate_filemark = 0; in st_probe()
4365 tpnt->default_drvbuffer = 0xff; /* No forced buffering */ in st_probe()
4366 tpnt->partition = 0; in st_probe()
4367 tpnt->new_partition = 0; in st_probe()
4368 tpnt->nbr_partitions = 0; in st_probe()
4369 blk_queue_rq_timeout(tpnt->device->request_queue, ST_TIMEOUT); in st_probe()
4370 tpnt->long_timeout = ST_LONG_TIMEOUT; in st_probe()
4371 tpnt->try_dio = try_direct_io; in st_probe()
4372 tpnt->first_tur = 1; in st_probe()
4375 STm = &(tpnt->modes[i]); in st_probe()
4376 STm->defined = 0; in st_probe()
4377 STm->sysv = ST_SYSV; in st_probe()
4378 STm->defaults_for_writes = 0; in st_probe()
4379 STm->do_async_writes = ST_ASYNC_WRITES; in st_probe()
4380 STm->do_buffer_writes = ST_BUFFER_WRITES; in st_probe()
4381 STm->do_read_ahead = ST_READ_AHEAD; in st_probe()
4382 STm->default_compression = ST_DONT_TOUCH; in st_probe()
4383 STm->default_blksize = (-1); /* No forced size */ in st_probe()
4384 STm->default_density = (-1); /* No forced density */ in st_probe()
4385 STm->tape = tpnt; in st_probe()
4389 STps = &(tpnt->ps[i]); in st_probe()
4390 STps->rw = ST_IDLE; in st_probe()
4391 STps->eof = ST_NOEOF; in st_probe()
4392 STps->at_sm = 0; in st_probe()
4393 STps->last_block_valid = 0; in st_probe()
4394 STps->drv_block = (-1); in st_probe()
4395 STps->drv_file = (-1); in st_probe()
4398 tpnt->current_mode = 0; in st_probe()
4399 tpnt->modes[0].defined = 1; in st_probe()
4401 tpnt->density_changed = tpnt->compression_changed = in st_probe()
4402 tpnt->blksize_changed = 0; in st_probe()
4403 mutex_init(&tpnt->lock); in st_probe()
4414 tpnt->index = error; in st_probe()
4415 sprintf(tpnt->name, "st%d", tpnt->index); in st_probe()
4416 tpnt->stats = kzalloc(sizeof(struct scsi_tape_stats), GFP_KERNEL); in st_probe()
4417 if (tpnt->stats == NULL) { in st_probe()
4423 tpnt->new_media_ctr = scsi_get_ua_new_media_ctr(SDp); in st_probe()
4424 tpnt->por_ctr = scsi_get_ua_por_ctr(SDp); in st_probe()
4435 "Attached scsi tape %s\n", tpnt->name); in st_probe()
4437 tpnt->name, tpnt->try_dio ? "yes" : "no", in st_probe()
4438 queue_dma_alignment(SDp->request_queue) + 1); in st_probe()
4444 kfree(tpnt->stats); in st_probe()
4447 idr_remove(&st_index_idr, tpnt->index); in st_probe()
4455 return -ENODEV; in st_probe()
4462 int index = tpnt->index; in st_remove()
4468 kref_put(&tpnt->kref, scsi_tape_release); in st_remove()
4477 * scsi_tape_release - Called to free the Scsi_Tape structure
4489 tpnt->device = NULL; in scsi_tape_release()
4491 if (tpnt->buffer) { in scsi_tape_release()
4492 normalize_buffer(tpnt->buffer); in scsi_tape_release()
4493 kfree(tpnt->buffer->reserved_pages); in scsi_tape_release()
4494 kfree(tpnt->buffer); in scsi_tape_release()
4497 kfree(tpnt->stats); in scsi_tape_release()
4564 /* The sysfs driver interface. Read-only at the moment */
4595 * other values have -EINVAL returned if they are passed in. in debug_flag_store()
4606 return -EINVAL; in debug_flag_store()
4635 l = snprintf(buf, PAGE_SIZE, "%d\n", STm->defined); in defined_show()
4647 l = snprintf(buf, PAGE_SIZE, "%d\n", STm->default_blksize); in default_blksize_show()
4660 fmt = STm->default_density >= 0 ? "0x%02x\n" : "%d\n"; in default_density_show()
4661 l = snprintf(buf, PAGE_SIZE, fmt, STm->default_density); in default_density_show()
4673 l = snprintf(buf, PAGE_SIZE, "%d\n", STm->default_compression - 1); in default_compression_show()
4682 struct scsi_tape *STp = STm->tape; in options_show()
4686 options = STm->do_buffer_writes ? MT_ST_BUFFER_WRITES : 0; in options_show()
4687 options |= STm->do_async_writes ? MT_ST_ASYNC_WRITES : 0; in options_show()
4688 options |= STm->do_read_ahead ? MT_ST_READ_AHEAD : 0; in options_show()
4690 options |= STp->two_fm ? MT_ST_TWO_FM : 0; in options_show()
4691 options |= STp->fast_mteom ? MT_ST_FAST_MTEOM : 0; in options_show()
4692 options |= STm->defaults_for_writes ? MT_ST_DEF_WRITES : 0; in options_show()
4693 options |= STp->can_bsr ? MT_ST_CAN_BSR : 0; in options_show()
4694 options |= STp->omit_blklims ? MT_ST_NO_BLKLIMS : 0; in options_show()
4695 options |= STp->can_partitions ? MT_ST_CAN_PARTITIONS : 0; in options_show()
4696 options |= STp->scsi2_logical ? MT_ST_SCSI2LOGICAL : 0; in options_show()
4697 options |= STm->sysv ? MT_ST_SYSV : 0; in options_show()
4698 options |= STp->immediate ? MT_ST_NOWAIT : 0; in options_show()
4699 options |= STp->immediate_filemark ? MT_ST_NOWAIT_EOF : 0; in options_show()
4700 options |= STp->sili ? MT_ST_SILI : 0; in options_show()
4708 * position_lost_in_reset_show - Value 1 indicates that reads, writes, etc.
4719 struct scsi_tape *STp = STm->tape; in position_lost_in_reset_show()
4721 return sprintf(buf, "%d", STp->pos_unknown); in position_lost_in_reset_show()
4728 * read_cnt_show - return read count - count of reads made from tape drive
4739 (long long)atomic64_read(&STm->tape->stats->read_cnt)); in read_cnt_show()
4744 * read_byte_cnt_show - return read byte count - tape drives
4757 (long long)atomic64_read(&STm->tape->stats->read_byte_cnt)); in read_byte_cnt_show()
4762 * read_ns_show - return read ns - overall time spent waiting on reads in ns.
4773 (long long)atomic64_read(&STm->tape->stats->tot_read_time)); in read_ns_show()
4778 * write_cnt_show - write count - number of user calls
4790 (long long)atomic64_read(&STm->tape->stats->write_cnt)); in write_cnt_show()
4795 * write_byte_cnt_show - write byte count - raw count of
4807 (long long)atomic64_read(&STm->tape->stats->write_byte_cnt)); in write_byte_cnt_show()
4812 * write_ns_show - write ns - number of nanoseconds waiting on write
4824 (long long)atomic64_read(&STm->tape->stats->tot_write_time)); in write_ns_show()
4829 * in_flight_show - number of I/Os currently in flight -
4842 (long long)atomic64_read(&STm->tape->stats->in_flight)); in in_flight_show()
4847 * io_ns_show - io wait ns - this is the number of ns spent
4862 (long long)atomic64_read(&STm->tape->stats->tot_io_time)); in io_ns_show()
4867 * other_cnt_show - other io count - this is the number of
4881 (long long)atomic64_read(&STm->tape->stats->other_cnt)); in other_cnt_show()
4886 * resid_cnt_show - A count of the number of times we get a residual
4887 * count - this should indicate someone issuing reads larger than the
4899 (long long)atomic64_read(&STm->tape->stats->resid_cnt)); in resid_cnt_show()
4947 unsigned long end = (uaddr + count + PAGE_SIZE - 1) >> PAGE_SHIFT; in sgl_map_user_pages()
4949 const int nr_pages = end - start; in sgl_map_user_pages()
4952 struct rq_map_data *mdata = &STbp->map_data; in sgl_map_user_pages()
4956 return -EINVAL; in sgl_map_user_pages()
4960 return -ENOMEM; in sgl_map_user_pages()
4968 return -ENOMEM; in sgl_map_user_pages()
4986 mdata->offset = uaddr & ~PAGE_MASK; in sgl_map_user_pages()
4987 STbp->mapped_pages = pages; in sgl_map_user_pages()
5005 unpin_user_pages_dirty_lock(STbp->mapped_pages, nr_pages, dirtied); in sgl_unmap_user_pages()
5007 kfree(STbp->mapped_pages); in sgl_unmap_user_pages()
5008 STbp->mapped_pages = NULL; in sgl_unmap_user_pages()