From owner-freebsd-scsi@FreeBSD.ORG Tue Jan 4 07:45:31 2005 Return-Path: Delivered-To: freebsd-scsi@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 46C5416A4CE for ; Tue, 4 Jan 2005 07:45:31 +0000 (GMT) Received: from rproxy.gmail.com (rproxy.gmail.com [64.233.170.196]) by mx1.FreeBSD.org (Postfix) with ESMTP id D7DB343D2F for ; Tue, 4 Jan 2005 07:45:30 +0000 (GMT) (envelope-from lydianconcepts@gmail.com) Received: by rproxy.gmail.com with SMTP id i8so85377rne for ; Mon, 03 Jan 2005 23:45:30 -0800 (PST) DomainKey-Signature: a=rsa-sha1; q=dns; c=nofws; s=beta; d=gmail.com; h=received:message-id:date:from:reply-to:to:subject:cc:in-reply-to:mime-version:content-type:content-transfer-encoding:references; b=KN9FOyJWDWyPrbmr8JJ0A6fhl4Z56w/rjKA0ACP6p6PXtQUpPBgY8y4QhKWGpJx6OrIBryhtUL6Z1Dyht3mI2sUug+rPq+Xz5I6n5xoNVTAT8iKbLp/DSIfkcpgRHcjPtepay7abXp0fXxR5K+GSQPpO8N6okVyxcauD1Qf0mqE= Received: by 10.38.11.31 with SMTP id 31mr239785rnk; Mon, 03 Jan 2005 23:45:30 -0800 (PST) Received: by 10.38.104.73 with HTTP; Mon, 3 Jan 2005 23:45:30 -0800 (PST) Message-ID: <7579f7fb05010323457bab1899@mail.gmail.com> Date: Mon, 3 Jan 2005 23:45:30 -0800 From: Matthew Jacob To: "James E. Flemer" In-Reply-To: <41DA2475.90509@uvm.edu> Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit References: <41DA2475.90509@uvm.edu> cc: freebsd-scsi@freebsd.org Subject: Re: mtio/sa device response to bad blocks X-BeenThere: freebsd-scsi@freebsd.org X-Mailman-Version: 2.1.1 Precedence: list Reply-To: Matthew Jacob List-Id: SCSI subsystem List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 04 Jan 2005 07:45:31 -0000 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 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" >