mtio/sa device response to bad blocks
Matthew Jacob
lydianconcepts at gmail.com
Mon Jan 3 23:45:31 PST 2005
Are you using fixed block or variable block mode? I believe that
errors propagate correctly for variable but can't for fixed block
mode.
On Mon, 03 Jan 2005 22:07:01 -0700, James E. Flemer <jflemer at uvm.edu> wrote:
> I have a SCSI DAT drive and have had some problems reading tapes with
> bad blocks. It seems that a read(2) from the sa device returns 0 when a
> bad block is read from the tape. Note that read(2) also correctly
> returns 0 when a filemark is read. A userland application (see below)
> can tell the difference between a filemark and a read error by looking
> at the io_sense part of the scsi_tape_errors struct (via the
> MTIOCERRSTAT ioctl). However this is cumbersome and requires the
> knowledge of the scsi_sense_data struct. It would seem more appropriate
> for the read to return -1 and set errno to EIO when a bad block is read.
> With such a change "dd conv=noerror,sync" could be used to dump a tape
> with bad blocks. Unfortunately, I'm not familiar enough with the
> SCSI/CAM layers to know where make this change, could someone point me
> where to look?
>
> Thanks,
> -James
>
> /* This code will check the real reason for read to return 0
> * and change the return code to -1 and set errno to EIO if there
> * was a MEDIUM_ERROR. Other non-SSD_FILEMARK/SSD_EOM flags
> * should probably also be handled via -1/errno.
> */
> num_read = read(mtfd, buf, blk_size);
> if (num_read == 0) {
> ioctl(mtfd, MTIOCERRSTAT, &tape_err);
> sense_data = (struct scsi_sense_data *)&tape_err.io_sense;
> if (sense_data->flags & SSD_KEY_MEDIUM_ERROR) {
> num_read = -1;
> errno = EIO;
> }
> }
> _______________________________________________
> freebsd-scsi at freebsd.org mailing list
> http://lists.freebsd.org/mailman/listinfo/freebsd-scsi
> To unsubscribe, send any mail to "freebsd-scsi-unsubscribe at freebsd.org"
>
More information about the freebsd-scsi
mailing list