Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 04 Jan 2005 07:06:00 -0700
From:      "James E. Flemer" <jflemer@uvm.edu>
To:        freebsd-scsi@freebsd.org
Cc:        James Flemer <jflemer@uvm.edu>
Subject:   Re: mtio/sa device response to bad blocks
Message-ID:  <41DAA2C8.7030303@uvm.edu>
In-Reply-To: <7579f7fb05010323457bab1899@mail.gmail.com>
References:  <41DA2475.90509@uvm.edu> <7579f7fb05010323457bab1899@mail.gmail.com>

next in thread | previous in thread | raw e-mail | index | archive | help
I am using fixed block mode.  Why is it that errors cannot propagate for 
fixed block?  After a little more looking in the code, perhaps this 
patch in saerror() will do what I want.  I have not tried this patch yet 
though, since I compiled SCSI into the kernel (not module) and cannot 
reboot the box at the moment.

-James

--- sys/cam/scsi/scsi_sa.c      16 Jun 2004 09:46:31 -0000      1.101
+++ sys/cam/scsi/scsi_sa.c      4 Jan 2005 13:56:50 -0000
@@ -2415,6 +2415,8 @@
                         } else {
                                 error = EIO;
                         }
+               } else if (sense_key == SSD_KEY_MEDIUM_ERROR) {
+                       error = EIO;
                 } else if (sense->flags & SSD_FILEMARK) {
                         if (softc->flags & SA_FLAG_FIXED) {
                                 error = -1;


Matthew Jacob wrote:
> 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@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@freebsd.org mailing list
>>http://lists.freebsd.org/mailman/listinfo/freebsd-scsi
>>To unsubscribe, send any mail to "freebsd-scsi-unsubscribe@freebsd.org"
>>



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?41DAA2C8.7030303>