ST
Section: Linux Programmer\(aqs Manual (4)
Updated: January 31, 1995
Index
Return to Main Contents
NAME
st - SCSI tape device
SYNOPSIS
#include <sys/mtio.h>
int ioctl(int fd, int request [, (void *)arg3])
int ioctl(int fd, MTIOCTOP, (struct mtop *)mt_cmd)
int ioctl(int fd, MTIOCGET, (struct mtget *)mt_status)
int ioctl(int fd, MTIOCPOS, (struct mtpos *)mt_pos)
DESCRIPTION
The
st
driver provides the interface to a variety of SCSI tape devices.
Currently, the driver takes control of all detected devices of type
lqsequential-access.rq
The
st
driver uses major device number 9.
Each device uses two minor device numbers:
a principal minor device number,
n,
assigned sequentially in order of detection, and a lqno-rewindrq device
number,
(n+ 128).
Devices opened using the principal device number will be sent a
REWIND command when they are closed.
Devices opened using the lqno-rewindrq device number will not.
Options such as density or block size are not coded in the minor
device number.
These options must be set by explicit
ioctl()
calls and remain in effect when the device is closed and reopened.
Devices are typically created by:
-
mknod -m 660 /dev/st0 c 9 0
mknod -m 660 /dev/st1 c 9 1
mknod -m 660 /dev/nst0 c 9 128
mknod -m 660 /dev/nst1 c 9 129
There is no corresponding block device.
The character device provides buffering and read-ahead by default and
supports reads and writes of arbitrary size (limited by the
driveraqs internal buffer size, which defaults to 32768 bytes, but
can be changed either by using a kernel startup option or by changing
a compile-time constant).
Device
/dev/tape
is usually created as a hard or soft link to the default tape device
on the system.
IOCTLS
The driver supports three ioctl requests.
Requests not recognized by the
st
driver are passed to the
scsi
driver.
The definitions below are from
/usr/include/linux/mtio.h:
MTIOCTOP - Perform a tape operation
This request takes an argument of type
(struct mtop *).
Not all drives support all operations.
The driver returns an EIO error if the drive rejects an operation.
/* Structure for MTIOCTOP - mag tape op command: */
struct mtop {
short mt_op; /* operations defined below */
int mt_count; /* how many of them */
};
Magnetic Tape operations:
- MTBSF
-
Backward space over
mt_count
filemarks.
- MTBSFM
-
Backward space over
mt_count
filemarks.
Reposition the tape to the EOT side of the last filemark.
- MTBSR
-
Backward space over
mt_count
records (tape blocks).
- MTBSS
-
Backward space over
mt_count
setmarks.
- MTEOM
-
Go to the end of the recorded media (for appending files).
- MTERASE
-
Erase tape.
- MTFSF
-
Forward space over
mt_count
filemarks.
- MTFSFM
-
Forward space over
mt_count
filemarks.
Reposition the tape to the BOT side of the last filemark.
- MTFSR
-
Forward space over
mt_count
records (tape blocks).
- MTFSS
-
Forward space over
mt_count
setmarks.
- MTNOP
-
No op - flushes the driveraqs buffer as a side effect.
Should be used before reading status with MTIOCGET.
- MTOFFL
-
Rewind and put the drive off line.
- MTRESET
-
Reset drive.
- MTRETEN
-
Retension tape.
- MTREW
-
Rewind.
- MTSEEK
-
Seek to the tape block number specified in
mt_count.
This operation requires either a SCSI-2 drive that supports the LOCATE
command (device-specific address)
or a Tandberg-compatible SCSI-1 drive (Tandberg, Archive
Viper, Wangtek, ... ).
The block number should be one that was previously returned by
MTIOCPOS because the number is device-specific.
- MTSETBLK
-
Set the driveaqs block length to the value specified in
mt_count.
A block length of zero sets the drive to variable block size mode.
- MTSETDENSITY
-
Set the tape density to the code in
mt_count.
Some useful density codes are:
-
0x00 Implicit 0x11 QIC-525
0x04 QIC-11 0x12 QIC-1350
0x05 QIC-24 0x13 DDS
0x0F QIC-120 0x14 Exabyte EXB-8200
0x10 QIC-150 0x15 Exabyte EXB-8500
- MTWEOF
-
Write
mt_count
filemarks.
- MTWSM
-
Write
mt_count
setmarks.
- MTSETDRVBUFFER
-
Set various drive and driver options according to bits encoded in
mt_count.
These consist of the driveaqs buffering mode, 6 Boolean driver
options and the buffer write threshold.
These parameters are initialized only when the device is first
detected.
The settings persist when the device is closed and reopened.
A single operation can affect (a) just the buffering mode, (b) just
the Boolean options, or (c) just the write threshold.
-
A value having zeros in the high-order 4 bits will be used to set the
driveaqs buffering mode.
The buffering modes are:
-
- 0
-
The drive will not report GOOD status on write commands until the data
blocks are actually written to the medium.
- 1
-
The drive may report GOOD status on write commands as soon as all the
data has been transferred to the driveaqs internal buffer.
- 2
-
The drive may report GOOD status on write commands as soon as (a) all
the data has been transferred to the driveaqs internal buffer, and
(b) all buffered data from different initiators has been successfully
written to the medium.
-
To control the write threshold the value in
mt_count
must include the constant
MT_ST_WRITE_THRESHOLD logically ORed with a block count in the low 28
bits.
The block count refers to 1024-byte blocks, not the physical block
size on the tape.
The threshold cannot exceed the driveraqs internal buffer size (see
DESCRIPTION,
above).
-
To set and clear the Boolean options
the value in
mt_count
must include the constant MT_ST_BOOLEANS logically ORed with
whatever combination of the following options is desired.
Any options not specified will be set false.
The Boolean options are:
-
-
- MT_ST_BUFFER_WRITES (Default: true)
-
Buffer all write operations.
If this option is false and the drive uses a fixed block size, then
all write operations must be for a multiple of the block size.
This option must be set false to write reliable multi-volume archives.
- MT_ST_ASYNC_WRITES (Default: true)
-
When this options is true write operations return immediately without
waiting for the data to be transferred to the drive if the data fits
into the driveraqs buffer.
The write threshold determines how full the buffer must be before a
new SCSI write command is issued.
Any errors reported by the drive will be held until the next
operation.
This option must be set false to write reliable multi-volume archives.
- MT_ST_READ_AHEAD (Default: true)
-
This option causes the driver to provide read buffering and
read-ahead.
If this option is false and the drive uses a fixed block size, then
all read operations must be for a multiple of the block size.
- MT_ST_TWO_FM (Default: false)
-
This option modifies the driver behavior when a file is closed.
The normal action is to write a single filemark.
If the option is true the driver will write two filemarks and
backspace over the second one.
-
Note:
This option should not be set true for QIC tape drives since they are
unable to overwrite a filemark.
These drives detect the end of recorded data by testing for blank tape
rather than two consecutive filemarks.
- MT_ST_DEBUGGING (Default: false)
-
This option turns on various debugging messages from the driver
(effective only if the driver was compiled with DEBUG defined).
- MT_ST_FAST_EOM (Default: false)
-
This option causes the MTEOM operation to be sent directly to the
drive, potentially speeding up the operation but causing the driver to
lose track of the current file number normally returned by the
MTIOCGET request.
If MT_ST_FAST_EOM is false the driver will respond to an MTEOM request
by forward spacing over files.
- EXAMPLE
-
struct mtop mt_cmd;
mt_cmd.mt_op = MTSETDRVBUFFER;
mt_cmd.mt_count = MT_ST_BOOLEANS |
MT_ST_BUFFER_WRITES |
MT_ST_ASYNC_WRITES;
ioctl(fd, MTIOCTOP, &mt_cmd);
MTIOCGET - Get status
This request takes an argument of type
(struct mtget *).
The driver returns an EIO error if the drive rejects an operation.
/* structure for MTIOCGET - mag tape get status command */
struct mtget {
long mt_type;
long mt_resid;
/* the following registers are device dependent */
long mt_dsreg;
long mt_gstat;
long mt_erreg;
/* The next two fields are not always used */
daddr_t mt_fileno;
daddr_t mt_blkno;
};
- mt_type
-
The header file defines many values for
mt_type,
but the current driver reports only the generic types
MT_ISSCSI1 (Generic SCSI-1 tape) and MT_ISSCSI2 (Generic SCSI-2 tape).
- mt_resid
-
is always zero.
(Not implemented for SCSI tape drives.)
- mt_dsreg
-
reports the driveaqs current settings for block size (in the low 24
bits) and density (in the high 8 bits).
These fields are defined by MT_ST_BLKSIZE_SHIFT, MT_ST_BLKSIZE_MASK,
MT_ST_DENSITY_SHIFT, and MT_ST_DENSITY_MASK.
- mt_gstat
-
reports generic (device independent) status information.
The header file defines macros for testing these status bits:
-
-
GMT_EOF(x):
- The tape is positioned just after a filemark
(always false after an MTSEEK operation).
-
GMT_BOT(x):
- The tape is positioned at the beginning of the first file (always false
after an MTSEEK operation).
-
GMT_EOT(x):
- A tape operation has reached the physical End Of Tape.
-
GMT_SM(x):
- The tape is currently positioned at a setmark
(always false after an MTSEEK operation).
-
GMT_EOD(x):
- The tape is positioned at the end of recorded data.
-
GMT_WR_PROT(x):
- The drive is write-protected.
For some drives this can also mean that the drive does not support
writing on the current medium type.
-
GMT_ONLINE(x):
- The last
open()
found the drive with a tape in place and ready for operation.
-
GMT_D_6250(x), GMT_D_1600(x), GMT_D_800(x):
- This lqgenericrq status information reports the current
density setting for 9-track ½" tape drives only.
-
GMT_DR_OPEN(x):
- The drive does not have a tape in place.
-
GMT_IM_REP_EN(x):
- Immediate report mode (not supported).
- mt_erreg
-
The only field defined in
mt_erreg
is the recovered error count in the low 16 bits (as defined by
MT_ST_SOFTERR_SHIFT and MT_ST_SOFTERR_MASK).
Due to inconsistencies in the way drives report recovered errors, this
count is often not maintained.
- mt_fileno
-
reports the current file number (zero-based).
This value is set to -1 when the file number is unknown (e.g., after
MTBSS
or MTSEEK).
- mt_blkno
-
reports the block number (zero-based) within the current file.
This value is set to -1 when the block number is unknown (e.g., after
MTBSF,
MTBSS, or MTSEEK).
MTIOCPOS - Get tape position
This request takes an argument of type
(struct mtpos *)
and reports the driveaqs notion of the current tape block number,
which is not the same as
mt_blkno
returned by MTIOCGET.
This drive must be a SCSI-2 drive that supports the READ POSITION
command (device-specific address)
or a Tandberg-compatible SCSI-1 drive (Tandberg, Archive
Viper, Wangtek, ... ).
/* structure for MTIOCPOS - mag tape get position command */
struct mtpos {
long mt_blkno; /* current block number */
};
RETURN VALUE
- EIO
-
The requested operation could not be completed.
- ENOSPC
-
A write operation could not be completed because the tape reached
end-of-medium.
- EACCES
-
An attempt was made to write or erase a write-protected tape.
(This error is not detected during
open().)
- ENXIO
-
During opening, the tape device does not exist.
- EBUSY
-
The device is already in use or the driver was unable to allocate a
buffer.
- EOVERFLOW
-
An attempt was made to read or write a variable-length block that is
larger than the driveraqs internal buffer.
- EINVAL
-
An
ioctl()
had an illegal argument, or a requested block size was illegal.
- ENOSYS
-
Unknown
ioctl().
COPYRIGHT
Copyright © 1995 Robert K. Nichols.
Permission is granted to make and distribute verbatim copies of this
manual provided the copyright notice and this permission notice are
preserved on all copies.
Additional permissions are contained in the header of the source file.
SEE ALSO
mt(1)
Index
- NAME
-
- SYNOPSIS
-
- DESCRIPTION
-
- IOCTLS
-
- MTIOCTOP - Perform a tape operation
-
- MTIOCGET - Get status
-
- MTIOCPOS - Get tape position
-
- RETURN VALUE
-
- COPYRIGHT
-
- SEE ALSO
-
This document was created by
man2html,
using the manual pages.
Time: 12:22:54 GMT, March 22, 2025