kern/56664: bad file# in MTIO status buffer after MTEOD until MTREW

Jeremy McMillan aphor at aphor.net
Tue Sep 9 19:10:16 PDT 2003


>Number:         56664
>Category:       kern
>Synopsis:       bad file# in MTIO status buffer after MTEOD until MTREW
>Confidential:   no
>Severity:       non-critical
>Priority:       medium
>Responsible:    freebsd-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Tue Sep 09 19:10:13 PDT 2003
>Closed-Date:
>Last-Modified:
>Originator:     Jeremy McMillan
>Release:        FreeBSD 4.8-RC i386
>Organization:
>Environment:
System: FreeBSD horizon.aphor.net 4.8-RC FreeBSD 4.8-RC #1: Tue Mar 4 21:42:48 CST 2003 root at nell.notrecords.com:/obj/usr/usr/src/sys/SD11K7 i386
sa0 at ahc0 bus 0 target 4 lun 0
sa0: <SUN DLT7000 245F> Removable Sequential Access SCSI-2 device
sa0: 20.000MB/s transfers (10.000MHz, offset 8, 16bit)

>Description:
MTIO fails to report the actual file and record position in
mtget.mt_fileno after executing the MTEOD command. Breaks bacula port.
>How-To-Repeat:
Rewind your DLTIV tape.
use this C program to inspect the tape IO status buffer of the /dev/nrsa0
(asuming you have only a single DLTIV tape drive) after using mt(1) to 'fsf'
and 'bsf' around from file to file on your tape. Then use mt(1) to 'eod' and
see where the status buffer says you are. You can 'fsf' and 'bsf' around, but
the status buffer reports file number -1 and block number -1 until you rewind.
---cut---
/*
mtstat: print the contents of the mtget struct for human eyes after getting
status from a device
*/
#include sys/mtio.h 
#include fcntl.h 
#include stdio.h
#include stdlib.h
void st_status (struct mtget);

int main(int argc,char *argv[])
{
	int mtfd;
	char *tape;
	struct mtget mt_status;
	if (argc!=2)
		{printf("Usage:\n\t%s /dev/nrsa#\n",argv[0]);exit(1);}
	else
		{
			tape = argv[1];
			if ((mtfd = open(tape, O_RDONLY)) < 0)
				err(1, "%s", tape);
			if (ioctl(mtfd, MTIOCGET, &mt_status) < 0)
				err(1, NULL);
			printf(
					"%s location:\tFile=%d\tBlock=%d\n",
					tape,
					(int)mt_status.mt_fileno,
					(int)mt_status.mt_blkno
				);
		}
	exit(0);
}
---cut---

>Fix:
	


>Release-Note:
>Audit-Trail:
>Unformatted:


More information about the freebsd-bugs mailing list