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