Skip site navigation (1)Skip section navigation (2)

FreeBSD Manual Pages

  
 
  

home | help
SA(4)			    Kernel Interfaces Manual			 SA(4)

NAME
       sa -- SCSI Sequential Access device driver

SYNOPSIS
       device sa

DESCRIPTION
       The  sa	driver provides	support	for all	SCSI devices of	the sequential
       access class that are attached to the system through a  supported  SCSI
       Host Adapter.  The sequential access class includes tape	and other lin-
       ear access devices.

       A  SCSI Host adapter must also be separately configured into the	system
       before a	SCSI sequential	access device can be configured.

MOUNT SESSIONS
       The sa driver is	based around the concept of a "mount  session",	 which
       is  defined  as the period between the time that	a tape is mounted, and
       the time	when it	is unmounted.  Any parameters set during a mount  ses-
       sion  remain  in	 effect	 for the remainder of the session or until re-
       placed.	The tape can be	unmounted, bringing the	session	to a close  in
       several ways.  These include:

       1.   Closing  a	`rewind	device', referred to as	sub-mode 00 below.  An
	    example is /dev/sa0.

       2.   Using the MTOFFL ioctl(2) command, reachable through the `offline'
	    command of mt(1).

       It should be noted that tape devices are	exclusive open devices,	except
       in the case where a control mode	device is opened.  In the latter case,
       exclusive access	is only	sought when needed (e.g., to set parameters).

SUB-MODES
       The sub-modes differ in the action taken	when the device	is closed:

       /dev/sa*
	     A close will rewind the device; if	the  tape  has	been  written,
	     then  a file mark will be written before the rewind is requested.
	     The device	is unmounted.

       /dev/nsa*
	     A close will leave	the tape mounted.  If the tape was written to,
	     a file mark will be written.  No  other  head  positioning	 takes
	     place.  Any further reads or writes will occur directly after the
	     last read,	or the written file mark.

       /dev/esa*
	     A	close  will  rewind the	device.	 If the	tape has been written,
	     then a file mark will be written before the rewind	is  requested.
	     On	 completion  of	 the  rewind an	unload command will be issued.
	     The device	is unmounted.

BLOCKING MODES
       SCSI tapes may run in either `variable' or  `fixed'  block-size	modes.
       Most  QIC-type  devices	run in fixed block-size	mode, where most nine-
       track tapes and many new	cartridge formats allow	 variable  block-size.
       The difference between the two is as follows:

       Variable	 block-size: Each write	made to	the device results in a	single
       logical record written to the tape.  One	can never read or  write  part
       of a record from	tape (though you may request a larger block and	read a
       smaller	record); nor can one read multiple blocks.  Data from a	single
       write is	therefore read by a single read.  The block size used  may  be
       any  value  supported  by  the  device, the SCSI	adapter	and the	system
       (usually	between	1 byte and 64 Kbytes, sometimes	more).

       When reading a variable record/block from the tape, the head  is	 logi-
       cally considered	to be immediately after	the last item read, and	before
       the  next item after that.  If the next item is a file mark, but	it was
       never read, then	the next process to read will immediately hit the file
       mark and	receive	an end-of-file notification.

       Fixed block-size: Data written by the user is passed to the tape	 as  a
       succession  of  fixed size blocks.  It may be contiguous	in memory, but
       it is considered	to be a	series of independent blocks.  One  may	 never
       write an	amount of data that is not an exact multiple of	the blocksize.
       One may read and	write the same data as a different set of records.  In
       other  words, blocks that were written together may be read separately,
       and vice-versa.

       If one requests more blocks than	remain in the file, the	drive will en-
       counter the file	mark.  As there	is some	data to	return	(unless	 there
       were no records before the file mark), the read will succeed, returning
       that  data.   The  next read will return	immediately with a value of 0.
       (As above, if the file mark is never read,  it  remains	for  the  next
       process to read if in no-rewind mode.)

BLOCK SIZES
       By default, the driver will NOT accept reads or writes to a tape	device
       that  are  larger  than may be written to or read from the mounted tape
       using a single write or read request.  Because of this, the application
       author may have confidence that his wishes are respected	 in  terms  of
       the  block  size	 written  to  tape.  For example, if the user tries to
       write a 256KB block to the tape,	but the	controller can handle no  more
       than  128KB, the	write will fail.  The previous FreeBSD behavior, prior
       to FreeBSD 10.0,	was to break up	large reads  or	 writes	 into  smaller
       blocks when going to the	tape.  The problem with	that behavior, though,
       is  that	 it  hides  the	actual on-tape block size from the application
       writer, at least	in variable block mode.

       If the user would like his large	reads and writes broken	up into	 sepa-
       rate pieces, he may set the following loader tunables.  Note that these
       tunables	 WILL  GO AWAY in FreeBSD 11.0.	 They are provided for transi-
       tion purposes only.

       kern.cam.sa.allow_io_split

	   This	variable, when set to 1, will  configure  all  sa  devices  to
	   split large buffers into smaller pieces when	needed.

       kern.cam.sa.%d.allow_io_split

	   This	 variable,  when set to	1, will	configure the given sa unit to
	   split large buffers into multiple pieces.  This will	 override  the
	   global setting, if it exists.

       There  are several sysctl(8) variables available	to view	block handling
       parameters:

       kern.cam.sa.%d.allow_io_split

	   This	variable allows	the user to see, but not modify,  the  current
	   I/O	split  setting.	 The user is not permitted to modify this set-
	   ting	so that	there is no chance of behavior changing	for the	appli-
	   cation while	a tape is mounted.

       kern.cam.sa.%d.maxio

	   This	variable shows the maximum I/O size in bytes that  is  allowed
	   by  the combination of kernel tuning	parameters (MAXPHYS, DFLTPHYS)
	   and the capabilities	of the controller that is attached to the tape
	   drive.  Applications	may look at this value	for  a	guide  on  how
	   large an I/O	may be permitted, but should keep in mind that the ac-
	   tual	 maximum  may  be restricted further by	the tape drive via the
	   SCSI	READ BLOCK LIMITS command.

       kern.cam.sa.%d.cpi_maxio

	   This	variable shows the maximum I/O	size  supported	 by  the  con-
	   troller,  in	 bytes,	 that is reported via the CAM Path Inquiry CCB
	   (XPT_PATH_INQ).  If this is 0, that means that the  controller  has
	   not reported	a maximum I/O size.

FILE MARK HANDLING
       The  handling  of  file	marks  on write	is automatic.  If the user has
       written to the tape, and	has not	done a read since the last write, then
       a file mark will	be written to the tape when the	device is closed.   If
       a  rewind  is requested after a write, then the driver assumes that the
       last file on the	tape has been written, and ensures that	there are  two
       file  marks  written  to	the tape.  The exception to this is that there
       seems to	be a standard (which we	follow,	but  do	 not  understand  why)
       that  certain  types  of	 tape  do not actually write two file marks to
       tape, but when read, report a `phantom' file mark when the last file is
       read.  These devices include the	QIC family of devices.	(It  might  be
       that  this  set	of  devices is the same	set as that of fixed block de-
       vices.  This has	not been determined yet, and they are treated as sepa-
       rate behaviors by the driver at this time.)

PARAMETERS
       The sa driver supports a	number of parameters.  The user	can query  pa-
       rameters	 using	"mt param -l" (which uses the MTIOCPARAMGET ioctl) and
       the user	can set	 parameters  using  "mt	 param	-s"  (which  uses  the
       MTIOCPARAMSET  ioctl).	See  mt(1) and mtio(4) for more	details	on the
       interface.

       Supported parameters:

       sili   The default is 0.	 When set to 1,	it sets	the Suppress Incorrect
	      Length Indicator (SILI) bit on tape reads.  Tape drives normally
	      return sense data	(which contains	the residual) when the	appli-
	      cation  reads  a block that is not the same length as the	amount
	      of data requested.  The SILI bit suppresses that notification in
	      most cases.  See the SSC-5 spec (available at t10.org), specifi-
	      cally the	section	on the READ(6) command,	for more information.

       eot_warn
	      The default is 0.	 By default, the sa  driver  reports  entering
	      Programmable  Early Warning, Early Warning and End of Media con-
	      ditions by returning a write with	0 bytes	written, and errno set
	      to 0.  If	eot_warn is set	to 1, the sa driver will set errno  to
	      ENOSPC when it enters any	of the out of space conditions.

       protection.protection_supported
	      This is a	read-only parameter, and is set	to 1 if	the tape drive
	      supports protection information.

       protection.prot_method
	      If  protection  is supported, set	this to	the desired protection
	      method supported by the tape drive.  As of  SSC-5r03  (available
	      at t10.org), the protection method values	are:

	      0	   No protection.

	      1	   Reed-Solomon	CRC, 4 bytes in	length.

	      2	   CRC32C, 4 bytes in length.

       protection.pi_length
	      Length of	the protection information, see	above for lengths.

       protection.lbp_w
	      If set to	1, enable logical block	protection on writes.  The CRC
	      must  be	appended  to  the end of the block written to the tape
	      driver.  The tape	drive will verify the CRC when it receives the
	      block.

       protection.lbp_r
	      If set to	1, enable logical block	protection on reads.  The  CRC
	      will be appended to the end of the block read from the tape dri-
	      ver.  The	application should verify the CRC when it receives the
	      block.

       protection.rdbp
	      If  set  to  1,  enable  logical block protection	on the RECOVER
	      BUFFERED DATA command.  The sa driver does not currently use the
	      RECOVER BUFFERED DATA command.

TIMEOUTS
       The sa driver has a set of default timeouts for	SCSI  commands	(READ,
       WRITE,  TEST  UNIT READY, etc.) that will likely	work in	most cases for
       many tape drives.

       For newer tape drives that claim	to support the	SPC-4  standard	 (SCSI
       Primary	Commands  4) or	later standards, the sa	driver will attempt to
       use the REPORT SUPPORTED	OPERATION CODES	command	to fetch  timeout  de-
       scriptors  from	the  drive.  If	the drive does report timeout descrip-
       tors, the sa driver will	use the	drive's	recommended timeouts for  com-
       mands.

       The  timeouts  in  use are reported in units of thousandths of a	second
       via the kern.cam.sa.%d.timeout.*	sysctl(8) variables.

       To override either the default timeouts,	or the timeouts	recommended by
       the drive, you can set one of two sets of loader	 tunable  values.   If
       you  have  a  drive  that supports the REPORT SUPPORTED OPERATION CODES
       timeout descriptors (see	the camcontrol(8) opcodes  subcommand)	it  is
       generally  best	to use those values.  The global kern.cam.sa.timeout.*
       values will override the	timeouts for  all  sa  driver  instances.   If
       there  are  5 tape drives in the	system,	they'll	all get	the same time-
       outs.  The kern.cam.sa.%d.timeout.* values (where %d is the numeric  sa
       instance	 number)  will	override the global timeouts as	well as	either
       the default timeouts or the timeouts recommended	by the drive.

       To set timeouts after boot, the per-instance timeout values, for	 exam-
       ple: kern.cam.sa.0.timeout.read,	are available as sysctl	variables.

       If a tape drive arrives after boot, the global tunables or per-instance
       tunables	that apply to the newly	arrived	drive will be used.

       Loader tunables:

       kern.cam.sa.timeout.erase
       kern.cam.sa.timeout.locate
       kern.cam.sa.timeout.mode_select
       kern.cam.sa.timeout.mode_sense
       kern.cam.sa.timeout.prevent
       kern.cam.sa.timeout.read
       kern.cam.sa.timeout.read_position
       kern.cam.sa.timeout.read_block_limits
       kern.cam.sa.timeout.report_density
       kern.cam.sa.timeout.reserve
       kern.cam.sa.timeout.rewind
       kern.cam.sa.timeout.space
       kern.cam.sa.timeout.tur
       kern.cam.sa.timeout.write
       kern.cam.sa.timeout.write_filemarks

       Loader tunable values and sysctl(8) values:

       kern.cam.sa.%d.timeout.erase
       kern.cam.sa.%d.timeout.locate
       kern.cam.sa.%d.timeout.mode_select
       kern.cam.sa.%d.timeout.mode_sense
       kern.cam.sa.%d.timeout.prevent
       kern.cam.sa.%d.timeout.read
       kern.cam.sa.%d.timeout.read_position
       kern.cam.sa.%d.timeout.read_block_limits
       kern.cam.sa.%d.timeout.report_density
       kern.cam.sa.%d.timeout.reserve
       kern.cam.sa.%d.timeout.rewind
       kern.cam.sa.%d.timeout.space
       kern.cam.sa.%d.timeout.tur
       kern.cam.sa.%d.timeout.write
       kern.cam.sa.%d.timeout.write_filemarks

       As mentioned above, the timeouts	are set	and reported in	thousandths of
       a second, so be sure to account for that	when setting them.

IOCTLS
       The sa driver supports all of the ioctls	of mtio(4).

FILES
       /dev/[n][e]sa[0-9]  general form:
       /dev/sa0		   Rewind on close
       /dev/nsa0	   No rewind on	close
       /dev/esa0	   Eject on close (if capable)
       /dev/sa0.ctl	   Control mode	device (to examine state while another
			   program is accessing	the device, e.g.).

DIAGNOSTICS
       The sa driver supports injecting	End Of Media (EOM) notification	to aid
       application  development	and testing.  EOM is indicated to the applica-
       tion by returning the read or write with	0 bytes	written.  In addition,
       when EOM	is injected, the tape position status will be updated to  tem-
       porarily	 show  Beyond of the Programmable Early	Warning	(BPEW) status.
       To see BPEW status, use the MTIOCEXTGET ioctl, which is used by the "mt
       status" command.	 To inject an EOM notification,	set the

       kern.cam.sa.%d.inject_eom

       sysctl variable to 1.  One EOM notification will	be sent,  BPEW	status
       will  be	 set for one position query, and then the driver state will be
       reset to	normal.

SEE ALSO
       mt(1), cam(4), mtio(4)

AUTHORS
       The sa driver was written for the CAM SCSI subsystem by Justin T. Gibbs
       and Kenneth Merry.  Many	ideas were gleaned from	the st	device	driver
       written and ported from Mach 2.5	by Julian Elischer.

       The  owner  of  record  for  many years was Matthew Jacob.  The current
       maintainer is Kenneth Merry

BUGS
       This driver lacks many of the hacks required to	deal  with  older  de-
       vices.	Many older SCSI-1 devices may not work properly	with this dri-
       ver yet.

       Additionally, certain tapes (QIC	tapes mostly) that were	written	 under
       FreeBSD	2.X are	not automatically read correctly with this driver: you
       may need	to explicitly set variable block mode or set to	the  blocksize
       that  works  best  for your device in order to read tapes written under
       FreeBSD 2.X.

       Partitions are only supported for status	information and	location.   It
       would be	nice to	add support for	creating and editing tape partitions.

FreeBSD	15.0		       January 18, 2022				 SA(4)

Want to link to this manual page? Use this URL:
<https://man.freebsd.org/cgi/man.cgi?query=sa&sektion=4&manpath=FreeBSD+15.0-RELEASE+and+Ports>

home | help