NetBSD-Bugs archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

kern/53949: SCSI st driver /dev/{e,}nrst? file mark handling broken - may overwrite tapes



>Number:         53949
>Category:       kern
>Synopsis:       SCSI st driver /dev/{e,}nrst? file mark handling broken - may overwrite tapes
>Confidential:   no
>Severity:       critical
>Priority:       high
>Responsible:    kern-bug-people
>State:          open
>Class:          sw-bug
>Submitter-Id:   net
>Arrival-Date:   Tue Feb 05 13:50:01 +0000 2019
>Originator:     Frank Kardel
>Release:        NetBSD 8.99.34
>Organization:
	
>Environment:
	
	
System: NetBSD pip.kardel.name 8.99.34 NetBSD 8.99.34 (GENERIC) #2: Sun Feb 3 13:31:03 CET 2019 kardel%pip.kardel.name@localhost:/src/NetBSD/cur/src/obj.amd64/sys/arch/amd64/compile/GENERIC amd64
Architecture: x86_64
Machine: amd64
>Description:
	The SCSI st driver does not behave correctly with respect to file mark handling when the non-rewinding device modes are used.
	Writing <data>+ <file mark> to a non-rewinding device, ejecting the tape (possible since 2012-02-28 -
	ALLOW for robots within mount session), loading the same or another tape will lead to a file mark
	being written at the beginning of the freshly loaded tape even if opened O_RDONLY => empty tape (DATA LOSS)

	Additionally the SUN compatibility code to write terminating file marks when a tape is only
	opened and closed in O_WRONLY mode is broken.

>How-To-Repeat:
	(test program source enclosed below)

	Script started on Tue Feb  5 11:09:12 2019
	# TAPE=/dev/nrst1
	# export TAPE
	# mt st
	SCSI tape drive, residual=0
	ds=3<Mounted>
	er=0
	blocksize: 0 (0, 0, 0, 0)
	density: 92 (0, 0, 0, 0)
	current file number: 0
	current block number: 0
>>> write above pattern
	# ./tapetest -W $TAPE -S -w Block-1 -w Block-2 -f -C
	OPEN(W) [ds=3, err=0, res=0, file=0, blk=2]
	MTREW [ds=3, err=0, res=0, file=0, blk=0]
	WRITE Block-1... [ds=3, err=0, res=0, file=0, blk=1]
	WRITE Block-2... [ds=3, err=0, res=0, file=0, blk=2]
	MTWEOF [ds=3, err=0, res=0, file=1, blk=2]
	CLOSE
>>> re-read with MTREW (properly terminates tape)
	# ./tapetest -R $TAPE -S -r Block-1 -r Block-2 -C
	OPEN(R) [ds=3, err=0, res=0, file=1, blk=2]
	MTREW [ds=3, err=0, res=0, file=0, blk=0]
	READ Block-1[1024]... OK [ds=3, err=0, res=0, file=0, blk=1]
	READ Block-2[1024]... OK [ds=3, err=0, res=0, file=0, blk=2]
	CLOSE
>>> remove tape from drive
	# chio move drive 0 slot 13
>>> insert tape into drive
	# chio move slot 13 drive 0
	# ./tapetest -R $TAPE -r Block-1 -r Block-2 -C
>>> OPEN O_RDONLY - observe UNIT ATTENTION error (err=6)
	OPEN(R) [ds=3, err=6, res=0, file=0, blk=0]
	READ Block-1[1024]... OK [ds=3, err=0, res=0, file=0, blk=1]
	READ Block-2[1024]... OK [ds=3, err=0, res=0, file=0, blk=2]
	CLOSE
>>> write critical pattern again
	# ./tapetest -W $TAPE -S -w Block-1 -w Block-2 -f -C
	OPEN(W) [ds=3, err=0, res=0, file=0, blk=2]
	MTREW [ds=3, err=0, res=0, file=0, blk=0]
	WRITE Block-1... [ds=3, err=0, res=0, file=0, blk=1]
	WRITE Block-2... [ds=3, err=0, res=0, file=0, blk=2]
	MTWEOF [ds=3, err=0, res=0, file=1, blk=2]
	CLOSE
>>> remove tape from drive without rewinding -> mount session still exists!
	# chio move drive 0 slot 13
>>> re-insert tape (can also be another tape) into drive
	# chio move slot 13 drive 0
	# ./tapetest -R $TAPE -r Block-1 -r Block-2 -C
>>> OPEN O_RDONLY - observe UNIT ATTENTION error (err=6)
>>> leads to mount error due to UNIT ATTENTION in an existing mount session
>>> mount error recovery happily writes a file mark at the beginning of the
>>> inserted tape (ST_WRITTEN is still set in the mount session state)
	OPEN(R) [ds=3, err=6, res=0, file=0, blk=0]
>>> discover DATA LOSS
>BOOM<	READ Block-1[0]... EOF 
	tapetest: UNEXPECTED EOF
	# exit

	---
	dmesg output:
	st0: mount error (key=6)

	Script done on Tue Feb  5 11:23:29 2019

	Test program:

begin 644 tapetest.c.gz
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
8Q):XON0WD9O]>+8IOJ[Z#^TCD[C@%0``
`
end
>Fix:
	Properly terminate the tape with sufficient file marks if a data block has been written
	before close without enough file marks. This reinstates the behavior described in
	"man 4 st" with respect to file marks and close(2).

	Script started on Tue Feb  5 13:35:55 2019
	# chio move slot 13 drive 0
	# ./tapetest -W $TAPE -S -w Block-1 -w Block-2 -f -C
	OPEN(W) [ds=3, err=6, res=0, file=0, blk=0]
	MTREW [ds=3, err=0, res=0, file=0, blk=0]
	WRITE Block-1... [ds=3, err=0, res=0, file=0, blk=1]
	WRITE Block-2... [ds=3, err=0, res=0, file=0, blk=2]
	MTWEOF [ds=3, err=0, res=0, file=1, blk=2]
	CLOSE
	# ./tapetest -R $TAPE -S -r Block-1 -r Block-2 -C
	OPEN(R) [ds=3, err=0, res=0, file=1, blk=-1]
	MTREW [ds=3, err=0, res=0, file=0, blk=0]
	READ Block-1[1024]... OK [ds=3, err=0, res=0, file=0, blk=1]
	READ Block-2[1024]... OK [ds=3, err=0, res=0, file=0, blk=2]
	CLOSE
	# chio move drive 0 slot 13
	# chio move slot 13 drive 0
	# ./tapetest -R $TAPE -r Block-1 -r Block-2 -C
	OPEN(R) [ds=3, err=6, res=0, file=0, blk=0]
	READ Block-1[1024]... OK [ds=3, err=0, res=0, file=0, blk=1]
	READ Block-2[1024]... OK [ds=3, err=0, res=0, file=0, blk=2]
	CLOSE
	# ./tapetest -W $TAPE -S -w Block-1 -w Block-2 -f -C
	OPEN(W) [ds=3, err=0, res=0, file=0, blk=2]
	MTREW [ds=3, err=0, res=0, file=0, blk=0]
	WRITE Block-1... [ds=3, err=0, res=0, file=0, blk=1]
	WRITE Block-2... [ds=3, err=0, res=0, file=0, blk=2]
	MTWEOF [ds=3, err=0, res=0, file=1, blk=2]
	CLOSE
	# chio move drive 0 slot 13
	# chio move slot 13 drive 0
	# ./tapetest -R $TAPE -r Block-1 -r Block-2 -C
>>> UNIT ATTENTION
	OPEN(R) [ds=3, err=6, res=0, file=0, blk=0]
>GOOD<	READ Block-1[1024]... OK [ds=3, err=0, res=0, file=0, blk=1]
	READ Block-2[1024]... OK [ds=3, err=0, res=0, file=0, blk=2]
	CLOSE
	# exit

	Script done on Tue Feb  5 13:41:34 2019

	Patch:

begin 644 st-bugfix.diff.gz
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
$M`T``#G?
`
end

>Unformatted:
 	
 	


Home | Main Index | Thread Index | Old Index