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>