1 .\" Copyright (c) 2008, Sun Microsystems, Inc. All Rights Reserved
   2 .\" Copyright 2018, Joyent, Inc.
   3 .\" The contents of this file are subject to the terms of the
   4 .\" Common Development and Distribution License (the "License").
   5 .\" You may not use this file except in compliance with the License.
   6 .\"
   7 .\" You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
   8 .\" or http://www.opensolaris.org/os/licensing.
   9 .\" See the License for the specific language governing permissions
  10 .\" and limitations under the License.
  11 .\"
  12 .\" When distributing Covered Code, include this CDDL HEADER in each
  13 .\" file and include the License file at usr/src/OPENSOLARIS.LICENSE.
  14 .\" If applicable, add the following below this CDDL HEADER, with the
  15 .\" fields enclosed by brackets "[]" replaced with your own identifying
  16 .\" information: Portions Copyright [yyyy] [name of copyright owner]
  17 .Dd August 31, 2018
  18 .Dt MTIO 7I
  19 .Os
  20 .Sh NAME
  21 .Nm mtio
  22 .Nd general magnetic tape interface
  23 .Sh SYNOPSIS
  24 .In sys/types.h
  25 .In sys/ioctl.h
  26 .In sys/mtio.h
  27 .Sh DESCRIPTION
  28 1/2", 1/4", 4mm, and 8mm magnetic tape drives all share the same general
  29 character device interface.
  30 .Pp
  31 There are two types of tape records: data records and end-of-file (EOF)
  32 records.
  33 .Sy EOF
  34 records are also known as tape marks and file marks.
  35 A record is separated by interrecord (or tape) gaps on a tape.
  36 .Pp
  37 End-of-recorded-media (EOM) is indicated by two
  38 .Sy EOF
  39 marks on 1/2\(dq tape; by one
  40 .Sy EOF
  41 mark on 1/4\(dq, 4mm, and 8mm cartridge tapes.
  42 .Ss "1/2\(dq Reel Tape"
  43 Data bytes are recorded in parallel onto the 9-track tape.
  44 Since it is a
  45 variable-length tape device, the number of bytes in a physical record may vary.
  46 .Pp
  47 The recording formats available (check specific tape drive) are 800
  48 .Sy BPI ,
  49 1600
  50 .Sy BPI ,
  51 6250
  52 .Sy BPI ,
  53 and data compression.
  54 Actual storage capacity is a function of the recording format and the length of the tape reel.
  55 For example, using a 2400 foot tape, 20 Mbyte can be stored using 800
  56 .Sy BPI ,
  57 40 Mbyte using 1600
  58 .Sy BPI ,
  59 140 Mbyte using 6250
  60 .Sy BPI ,
  61 or up to 700 Mbyte using data compression.
  62 .Ss "1/4\(dq Cartridge Tape"
  63 Data is recorded serially onto 1/4\(dq cartridge tape.
  64 The number of bytes per
  65 record is determined by the physical record size of the device.
  66 The I/O request
  67 size must be a multiple of the physical record size of the device.
  68 For
  69 .Sy QIC-11 ,
  70 .Sy QIC-24 ,
  71 and
  72 .Sy QIC-150
  73 tape drives, the block size is 512 bytes.
  74 .Pp
  75 The records are recorded on tracks in a serpentine motion.
  76 As one track is
  77 completed, the drive switches to the next and begins writing in the opposite
  78 direction, eliminating the wasted motion of rewinding.
  79 Each file, including the last, ends with one file mark.
  80 .Pp
  81 Storage capacity is based on the number of tracks the drive is capable of
  82 recording.
  83 For example, 4-track drives can only record 20 Mbyte of data on a
  84 450 foot tape; 9-track drives can record up to 45 Mbyte of data on a tape of
  85 the same length.
  86 .Sy QIC-11
  87 is the only tape format available for 4-track
  88 tape drives.
  89 In contrast, 9-track tape drives can use either
  90 .Sy QIC-24
  91 or
  92 .Sy QIC-11 .
  93 Storage capacity is not appreciably affected by using either format.
  94 .Sy QIC-24
  95 is preferable to
  96 .Sy QIC-11
  97 because it records a
  98 reference signal to mark the position of the first track on the tape, and each
  99 block has a unique block number.
 100 .Pp
 101 The
 102 .Sy QIC-150
 103 tape drives require
 104 .Sy DC-6150
 105 (or equivalent) tape cartridges for writing.
 106 However, they can read other tape cartridges in
 107 .Sy QIC-11 ,
 108 .Sy QIC-24 ,
 109 or
 110 .Sy QIC-120
 111 tape formats.
 112 .Ss "8mm Cartridge Tape"
 113 Data is recorded serially onto 8mm helical scan cartridge tape.
 114 Since it is a
 115 variable-length tape device, the number of bytes in a physical record may
 116 vary.
 117 The recording formats available (check specific tape drive) are standard
 118 2Gbyte, 5Gbyte, and compressed format.
 119 .Ss "4mm DAT Tape"
 120 Data is recorded either in Digital Data Storage (DDS) tape format or in Digital
 121 Data Storage, Data Compressed (DDS-DC) tape format.
 122 Since it is a
 123 variable-length tape device, the number of bytes in a physical record may vary.
 124 The recording formats available are standard 2Gbyte and compressed format.
 125 .Ss "Persistent Error Handling"
 126 Persistent error handling is a modification of the current error handling
 127 behaviors, BSD and SVR4.
 128 With persistent error handling enabled, all tape
 129 operations after an error or exception will return immediately with an error.
 130 Persistent error handling can be most useful with asynchronous tape operations
 131 that use the
 132 .Xr aioread 3C
 133 and
 134 .Xr aiowrite 3C
 135 functions.
 136 .Pp
 137 To enable persistent error handling, the ioctl
 138 .Dv MTIOCPERSISTENT
 139 must be issued.
 140 If this ioctl succeeds, then persistent error handling is enabled and
 141 changes the current error behavior.
 142 This ioctl will fail if the device driver
 143 does not support persistent error handling.
 144 .Pp
 145 With persistent error handling enabled, all tape operations after an exception
 146 or error will return with the same error as the first command that failed; the
 147 operations will not be executed.
 148 An exception is some event that might stop
 149 normal tape operations, such as an End Of File (EOF) mark or an End Of Tape
 150 (EOT) mark.
 151 An example of an error is a media error.
 152 The
 153 .Dv MTIOCLRERR
 154 ioctl must be issued to allow normal tape operations to continue and to clear
 155 the error.
 156 .Pp
 157 Disabling persistent error handling returns the error behavior to normal SVR4
 158 error handling, and will not occur until all outstanding operations are
 159 completed.
 160 Applications should wait for all outstanding operations to complete
 161 before disabling persistent error handling.
 162 Closing the device will also
 163 disable persistent error handling and clear any errors or exceptions.
 164 .Pp
 165 The
 166 .Sx Read Operation
 167 and
 168 .Sx Write Operation
 169 subsections contain more pertinent information reguarding persistent error handling.
 170 .Ss "Read Operation"
 171 The
 172 .Xr read 2
 173 function reads the next record on the tape.
 174 The record size is passed back as the number of bytes read, provided it is not
 175 greater than the number requested.
 176 When a tape mark or end of data is read, a zero byte count is
 177 returned; all successive reads after the zero read will return an error and
 178 .Va errno
 179 will be set to
 180 .Er EIO .
 181 To move to the next file, an
 182 .Dv MTFSF
 183 ioctl can be issued before or after the read causing the error.
 184 This error
 185 handling behavior is different from the older
 186 .Sy BSD
 187 behavior, where another read will fetch the first record of the next tape file.
 188 If the
 189 .Sy BSD
 190 behavior is required, device names containing the letter
 191 .Ql b
 192 (for
 193 .Sy BSD
 194 behavior) in the final component should be used.
 195 If persistent error handling
 196 was enabled with either the BSD or SVR4 tape device behavior, all operations
 197 after this read error will return
 198 .Er EIO
 199 errors until the
 200 .Dv MTIOCLRERR
 201 ioctl is issued.
 202 An
 203 .Dv MTFSF
 204 ioctl can then he issued.
 205 .Pp
 206 Two successful successive reads that both return zero byte counts indicate
 207 .Sy EOM
 208 on the tape.
 209 No further reading should be performed past the
 210 .Sy EOM .
 211 .Pp
 212 Fixed-length I/O tape devices require the number of bytes read to be a multiple
 213 of the physical record size.
 214 For example, 1/4\(dq cartridge tape devices only read
 215 multiples of 512 bytes.
 216 If the blocking factor is greater than 64,512 bytes
 217 (minphys limit), fixed-length I/O tape devices read multiple records.
 218 .Pp
 219 Most tape devices which support variable-length I/O operations may read a range
 220 of 1 to 65,535 bytes.
 221 If the record size exceeds 65,535 bytes, the driver reads
 222 multiple records to satisfy the request.
 223 These multiple records are limited to
 224 65,534 bytes.
 225 Newer variable-length tape drivers may relax the above limitation
 226 and allow applications to read record sizes larger than 65,534.
 227 Refer to the
 228 specific tape driver man page for details.
 229 .Pp
 230 Reading past logical
 231 .Sy EOT
 232 is transparent to the user.
 233 A read operation
 234 should never hit physical EOT.
 235 .Pp
 236 Read requests that are lesser than a physical tape record are not allowed.
 237 Appropriate error is returned.
 238 .Ss "Write Operation"
 239 The
 240 .Xr write 2
 241 function writes the next record on the tape.
 242 The record has
 243 the same length as the given buffer.
 244 .Pp
 245 Writing is allowed on 1/4" tape at either the beginning of tape or after the
 246 last written file on the tape.
 247 With the Exabyte 8200, data may be appended only
 248 at the beginning of tape, before a filemark, or after the last written file on
 249 the tape.
 250 .Pp
 251 Writing is not so restricted on 1/2\(dq, 4mm, and the other 8mm cartridge tape
 252 drives.
 253 Care should be used when appending files onto 1/2\(dq reel tape devices,
 254 since an extra file mark is appended after the last file to mark the
 255 .Sy EOM .
 256 This extra file mark must be overwritten to prevent the creation of a null file.
 257 To facilitate write append operations, a space to the
 258 .Sy EOM
 259 ioctl is provided.
 260 Care should be taken when overwriting records; the erase head is just
 261 forward of the write head and any following records will also be erased.
 262 .Pp
 263 Fixed-length I/O tape devices require the number of bytes written to be a
 264 multiple of the physical record size.
 265 For example, 1/4\(dq cartridge tape devices
 266 only write multiples of 512 bytes.
 267 .Pp
 268 Fixed-length I/O tape devices write multiple records if the blocking factor is
 269 greater than 64,512 bytes (minphys limit).
 270 These multiple writes are limited to
 271 64,512 bytes.
 272 For example, if a write request is issued for 65,536 bytes using
 273 a 1/4\(dq cartridge tape, two writes are issued; the first for 64,512 bytes and
 274 the second for 1024 bytes.
 275 .Pp
 276 Most tape devices which support variable-length I/O operations may write a
 277 range of 1 to 65,535 bytes.
 278 If the record size exceeds 65,535 bytes, the driver
 279 writes multiple records to satisfy the request.
 280 These multiple records are
 281 limited to 65,534 bytes.
 282 As an example, if a write request for 65,540 bytes is
 283 issued, two records are written; one for 65,534 bytes followed by another
 284 record for 6 bytes.
 285 Newer variable-length tape drivers may relax the above
 286 limitation and allow applications to write record sizes larger than 65,534.
 287 effer to the specific tape driver man page for details.
 288 .Pp
 289 When logical
 290 .Sy EOT
 291 is encountered during a write, that write operation
 292 completes and the number of bytes successfully transferred is returned (note
 293 that a 'short write' may have occurred and not all the requested bytes would
 294 have been transferred.
 295 The actual amount of data written will depend on the
 296 type of device being used).
 297 The next write will return a zero byte count.
 298 A third write will successfully transfer some bytes (as indicated by the
 299 returned byte count, which again could be a short write); the fourth will
 300 transfer zero bytes, and so on, until the physical
 301 .Sy EOT
 302 is reached and all writes will
 303 fail with
 304 .Er EIO .
 305 .Pp
 306 When logical
 307 .Sy EOT
 308 is encountered with persistent error handling enabled,
 309 the current write may complete or be a short write.
 310 The next write will return a zero byte count.
 311 At this point an application should act appropriately for
 312 end of tape cleanup or issue yet another write, which will return the error
 313 .Er ENOSPC .
 314 After clearing the exception with
 315 .Dv MTIOCLRERR ,
 316 the next write will succeed (possibly short), followed by another zero byte
 317 write count, and then another
 318 .Er ENOSPC
 319 error.
 320 .Pp
 321 Allowing writes after
 322 .Sy EOT
 323 has been encountered enables the flushing of buffers.
 324 However, it is strongly recommended to terminate the writing and close
 325 the file as soon as possible.
 326 .Pp
 327 Seeks are ignored in tape I/O.
 328 .Ss "Close Operation"
 329 Magnetic tapes are rewound when closed, except when the "no-rewind" devices
 330 have been specified.
 331 The names of no-rewind device files use the letter
 332 .Ql n
 333 as the end of the final component.
 334 The no-rewind version of
 335 .Pa /dev/rmt/0l
 336 is
 337 .Pa /dev/rmt/0ln .
 338 In case of error for a no-rewind device, the next open rewinds the device.
 339 .Pp
 340 If the driver was opened for reading and a no-rewind device has been specified,
 341 the close advances the tape past the next filemark (unless the current file
 342 position is at
 343 .Sy EOM ) ,
 344 leaving the tape correctly positioned to read the first record of the next file.
 345 However, if the tape is at the first record of a
 346 file it doesn't advance again to the first record of the next file.
 347 These semantics are different from the older
 348 .Sy BSD
 349 behavior.
 350 If
 351 .Sy BSD
 352 behavior is required where no implicit space operation is executed on close,
 353 the non-rewind device name containing the letter
 354 .Ql b
 355 (for
 356 .Sy BSD
 357 behavior) in the final component should be specified.
 358 .Pp
 359 If data was written, a file mark is automatically written by the driver upon
 360 close.
 361 If the rewinding device was specified, the tape will be rewound after
 362 the file mark is written.
 363 If the user wrote a file mark prior to closing, then
 364 no file mark is written upon close.
 365 If a file positioning ioctl, like rewind,
 366 is issued after writing, a file mark is written before repositioning the tape.
 367 .Pp
 368 All buffers are flushed on closing a tape device.
 369 Hence, it is strongly recommended that the application wait for all buffers to
 370 be flushed before closing the device.
 371 This can be done by writing a filemark via
 372 .Dv MTWEOF ,
 373 even with a zero count.
 374 .Pp
 375 Note that for 1/2\(dq reel tape devices, two file marks are written to mark the
 376 .Sy EOM
 377 before rewinding or performing a file positioning ioctl.
 378 If the user
 379 wrote a file mark before closing a 1/2\(dq reel tape device, the driver will
 380 always write a file mark before closing to insure that the end of recorded
 381 media is marked properly.
 382 If the non-rewinding device was specified, two file
 383 marks are written and the tape is left positioned between the two so that the
 384 second one is overwritten on a subsequent
 385 .Xr open 2
 386 and
 387 .Xr write 2 .
 388 .Pp
 389 If no data was written and the driver was opened for
 390 .Sy WRITE-ONLY
 391 access, one or two file marks are written, thus creating a null file.
 392 .Pp
 393 After closing the device, persistent error handling will be disabled and any
 394 error or exception will be cleared.
 395 .Sh IOCTLS
 396 Not all devices support all
 397 .Sy ioctls .
 398 The driver returns an
 399 .Er ENOTTY
 400 error on unsupported ioctls.
 401 .Pp
 402 The following structure definitions for magnetic tape
 403 .Xr ioctl 2
 404 commands are from
 405 .In sys/mtio.h .
 406 .Pp
 407 The minor device byte structure is:
 408 .Bd -literal
 409 15      7      6          5          4         3          2       1   0
 410 ________________________________________________________________________
 411 Unit #       BSD      Reserved   Density   Density   No rewind    Unit #
 412 Bits 7-15   behavior              Select    Select    on Close    Bits 0-1
 413 .Ed
 414 .Bd -literal
 415 /*
 416  * Layout of minor device byte:
 417  */
 418 #define MTUNIT(dev)   (((minor(dev) & 0xff80) >> 5) + (minor(dev) & 0x3))
 419 #define MT_NOREWIND     (1 <<2)
 420 #define MT_DENSITY_MASK (3 <<3)
 421 #define MT_DENSITY1     (0 <<3)   /* Lowest density/format */
 422 #define MT_DENSITY2     (1 <<3)
 423 #define MT_DENSITY3     (2 <<3)
 424 #define MT_DENSITY4     (3 <<3)   /* Highest density/format */
 425 #define MTMINOR(unit)   (((unit & 0x7fc) << 5) + (unit & 0x3))
 426 #define MT_BSD  (1 <<6)         /* BSD behavior on close */
 427 
 428 /* Structure for MTIOCTOP - magnetic tape operation command */
 429 
 430 struct mtop {
 431   short   mt_op;       /* operation */
 432   daddr_t mt_count;    /* number of operations */
 433 };
 434 
 435 /* Structure for MTIOCLTOP - magnetic tape operation command */
 436 Works exactly like MTIOCTOP except passes 64 bit mt_count values.
 437 struct mtlop {
 438         short           mt_op;
 439         short           pad[3];
 440         int64_t         mt_count;
 441 };
 442 .Ed
 443 .Pp
 444 The following operations of
 445 .Dv MTIOCTOP
 446 and
 447 .Dv MTIOCLTOP
 448 ioctls are supported:
 449 .Pp
 450 .Bl -tag -width MTIOCGETERROR -compact -offset 2n
 451 .It Dv MTWEOF
 452 Write an end-of-file record
 453 .It Dv MTFSF
 454 Forward space over file mark
 455 .It Dv MTBSF
 456 Backward space over file mark (1/2", 8mm only)
 457 .It Dv MTFSR
 458 Forward space to inter-record gap
 459 .It Dv MTBSR
 460 Backward space to inter-record gap
 461 .It Dv MTREW
 462 Rewind
 463 .It Dv MTOFFL
 464 Rewind and take the drive off-line
 465 .It Dv MTNOP
 466 No operation, sets status only
 467 .It Dv MTRETEN
 468 Retension the tape (cartridge tape only)
 469 .It Dv MTERASE
 470 Erase the entire tape and rewind
 471 .It Dv MTEOM
 472 Position to EOM
 473 .It Dv MTNBSF
 474 Backward space file to beginning of file
 475 .It Dv MTSRSZ
 476 Set record size
 477 .It Dv MTGRSZ
 478 Get record size
 479 .It Dv MTTELL
 480 Get current position
 481 .It Dv MTSEEK
 482 Go to requested position
 483 .It Dv MTFSSF
 484 Forward to requested number of sequential file marks
 485 .It Dv MTBSSF
 486 Backward to requested number of sequential file marks
 487 .It Dv MTLOCK
 488 Prevent media removal
 489 .It Dv MTUNLOCK
 490 Allow media removal
 491 .It Dv MTLOAD
 492 Load the next tape cartridge into the tape drive
 493 .It Dv MTIOCGETERROR
 494 Retrieve error records from the st driver
 495 .El
 496 .Bd -literal -offset 2n
 497 /* structure for MTIOCGET - magnetic tape get status command */
 498 
 499 struct  mtget {
 500   short mt_type;        /* type of magtape device */
 501 
 502   /* the following two registers are device dependent */
 503   short  mt_dsreg;      /* "drive status" register */
 504   short  mt_erreg;      /* "error" register */
 505 
 506   /* optional error info.  */
 507   daddr_t   mt_resid;   /* residual count */
 508   daddr_t   mt_fileno;  /* file number of current position */
 509   daddr_t   mt_blkno;   /* block number of current position */
 510   ushort_t  mt_flags;
 511   short     mt_bf;      /* optimum blocking factor */
 512 };
 513 
 514 /* structure for MTIOCGETDRIVETYPE - get tape config data command */
 515 struct mtdrivetype_request {
 516   int  size;
 517   struct  mtdrivetype   *mtdtp;
 518 };
 519 struct mtdrivetype {
 520   char    name[64];                  /* Name, for debug */
 521   char    vid[25];                   /* Vendor id and product id */
 522   char    type;                      /* Drive type for driver */
 523   int     bsize;                     /* Block size */
 524   int     options;                   /* Drive options */
 525   int     max_rretries;              /* Max read retries */
 526   int     max_wretries;              /* Max write retries */
 527   uchar_t densities[MT_NDENSITIES];  /* density codes,low->hi */
 528   uchar_t default_density;           /* Default density chosen */
 529   uchar_t speeds[MT_NSPEEDS];        /* speed codes, low->hi */
 530   ushort_t non_motion_timeout;       /* Seconds for non-motion */
 531   ushort_t io_timeout;               /* Seconds for data to from tape */
 532   ushort_t rewind_timeout;           /* Seconds to rewind */
 533   ushort_t space_timeout;            /* Seconds to space anywhere */
 534   ushort_t load_timeout;             /* Seconds to load tape and ready */
 535   ushort_t unload_timeout;           /* Seconds to unload */
 536   ushort_t erase_timeout;            /* Seconds to do long erase */
 537 };
 538 .Ed
 539 .Bd -literal -offset 2n
 540 /* structure for MTIOCGETPOS and MTIOCRESTPOS - get/set tape position */
 541 /*
 542  * eof/eot/eom codes.
 543  */
 544  typedef enum {
 545        ST_NO_EOF,
 546        ST_EOF_PENDING,         /* filemrk pending */
 547        ST_EOF,                 /* at filemark */
 548        ST_EOT_PENDING,         /* logical eot pend.  */
 549        ST_EOT,                 /* at logical eot */
 550        ST_EOM,                 /* at physical eot */
 551        ST_WRITE_AFTER_EOM      /* flag allowing writes after EOM */
 552 } pstatus;
 553 
 554 typedef enum { invalid, legacy, logical } posmode;
 555 
 556 typedef struct tapepos {
 557    uint64_t lgclblkno;  /* Blks from start of partition */
 558    int32_t fileno;      /* Num. of current file */
 559    int32_t blkno;       /* Blk  number in current file */
 560    int32_t partition;   /* Current partition */
 561    pstatus eof;         /* eof states */
 562    posmode pmode;       /* which pos. data is valid */
 563    char    pad[4];
 564 } tapepos_t;
 565 .Ed
 566 .Pp
 567 .Bd -ragged -compact
 568 If the
 569 .Fa pmode
 570 is legacy,
 571 .Fa fileno
 572 and
 573 .Fa blkno
 574 fields are valid.
 575 .Pp
 576 If the
 577 .Fa pmode
 578 is logical,
 579 .Fa lgclblkno
 580 field is valid.
 581 .Ed
 582 .Pp
 583 The
 584 .Dv MTWEOF
 585 ioctl is used for writing file marks to tape.
 586 Not only does
 587 this signify the end of a file, but also usually has the side effect of
 588 flushing all buffers in the tape drive to the tape medium.
 589 A zero count
 590 .Dv MTWEOF
 591 will just flush all the buffers and will not write any file marks.
 592 Because a successful completion of this tape operation will guarantee that all
 593 tape data has been written to the tape medium, it is recommended that this tape
 594 operation be issued before closing a tape device.
 595 .Pp
 596 When spacing forward over a record (either data or
 597 .Sy EOF ) ,
 598 the tape head is
 599 positioned in the tape gap between the record just skipped and the next record.
 600 When spacing forward over file marks (EOF records), the tape head is positioned
 601 in the tape gap between the next
 602 .Sy EOF
 603 record and the record that follows it.
 604 .Pp
 605 When spacing backward over a record (either data or
 606 .Sy EOF ) ,
 607 the tape head is positioned in the tape gap immediately preceding the tape
 608 record where the tape head is currently positioned.
 609 When spacing backward over file marks (EOF records), the tape head is
 610 positioned in the tape gap preceding the
 611 .Sy EOF .
 612 Thus the next read would fetch the
 613 .Sy EOF .
 614 .Pp
 615 Record skipping does not go past a file mark; file skipping does not go past
 616 the
 617 .Sy EOM .
 618 After an
 619 .Dv MTFSR
 620 <huge number> command, the driver leaves
 621 the tape logically positioned
 622 .Em before
 623 the
 624 .Sy EOF .
 625 A related feature is that
 626 .Sy EOF Ns s
 627 remain pending until the tape is closed.
 628 For example, a program
 629 which first reads all the records of a file up to and including the \fBEOF\fR
 630 and then performs an
 631 .Dv MTFSF
 632 command will leave the tape positioned just
 633 after that same
 634 .Sy EOF ,
 635 rather than skipping the next file.
 636 .Pp
 637 The
 638 .Dv MTNBSF
 639 and
 640 .Dv MTFSF
 641 operations are inverses.
 642 Thus, an
 643 .Dq Dv MTFSF \(mi1
 644 is equivalent to an
 645 .Dq Dv MTNBSF 1 .
 646 An
 647 .Dq Dv MTNBSF 0
 648 is the same as
 649 .Dq Dv MTFSF 0 ;
 650 both position the tape device at the beginning of the current file.
 651 .Pp
 652 .Dv MTBSF
 653 moves the tape backwards by file marks.
 654 The tape position will end
 655 on the beginning of the tape side of the desired file mark.
 656 An
 657 .Dq Dv MTBSF 0
 658 will position the tape at the end of the current file, before the filemark.
 659 .Pp
 660 .Dv MTBSR
 661 and
 662 .Dv MTFSR
 663 operations perform much like space file operations,
 664 except that they move by records instead of files.
 665 Variable-length I/O devices
 666 (1/2\(dq reel, for example) space actual records; fixed-length I/O devices space
 667 physical records (blocks).
 668 1/4\(dq cartridge tape, for example, spaces 512 byte
 669 physical records.
 670 The status ioctl residual count contains the number of files
 671 or records not skipped.
 672 .Pp
 673 .Dv MTFSSF
 674 and
 675 .Dv MTBSSF
 676 space forward or backward, respectively, to the next
 677 occurrence of the requested number of file marks, one following another.
 678 If there are more sequential file marks on tape than were requested, it spaces
 679 over the requested number and positions after the requested file mark.
 680 Note that not all drives support this command and if a request is sent to a
 681 drive that does not,
 682 .Er ENOTTY
 683 is returned.
 684 .Pp
 685 .Dv MTOFFL
 686 rewinds and, if appropriate, takes the device off-line by unloading the tape.
 687 It is recommended that the device be closed after offlining
 688 and then re-opened after a tape has been inserted to facilitate portability to
 689 other platforms and other operating systems.
 690 Attempting to re-open the device
 691 with no tape will result in an error unless the
 692 .Dv O_NDELAY
 693 flag is used.
 694 .Po
 695 See
 696 .Xr open 2 .
 697 .Pc
 698 .Pp
 699 The
 700 .Dv MTRETEN
 701 retension ioctl applies only to 1/4\(dq cartridge tape devices.
 702 It is used to restore tape tension, improving the tape's soft error rate after
 703 extensive start-stop operations or long-term storage.
 704 .Pp
 705 .Dv MTERASE
 706 rewinds the tape, erases it completely, and returns to the
 707 beginning of tape.
 708 Erasing may take a long time depending on the device and/or
 709 tapes.
 710 For time details, refer to the drive specific manual.
 711 .Pp
 712 .Dv MTEOM
 713 positions the tape at a location just after the last file written
 714 on the tape.
 715 For 1/4\(dq cartridge and 8mm tape, this is after the last file mark
 716 on the tape.
 717 For 1/2\(dq reel tape, this is just after the first file mark but
 718 before the second (and last) file mark on the tape.
 719 Additional files can then
 720 be appended onto the tape from that point.
 721 .Pp
 722 Note the difference between
 723 .Dv MTBSF
 724 (backspace over file mark) and
 725 .Dv MTNBSF
 726 (backspace file to beginning of file).
 727 The former moves the tape
 728 backward until it crosses an
 729 .Sy EOF
 730 mark, leaving the tape positioned
 731 .Em before
 732 the file mark.
 733 The latter leaves the tape positioned
 734 .Em after
 735 the file mark.
 736 Hence,
 737 .Dq Dv MTNBSF n
 738 is equivalent to
 739 .Dq Dv MTBSF (n+1)
 740 followed by
 741 .Dq Dv MTFSF 1 .
 742 The 1/4\(dq cartridge tape devices do not support
 743 .Dv MTBSF .
 744 .Pp
 745 .Dv MTSRSZ
 746 and
 747 .Dv MTGRSZ
 748 are used to set and get fixed record lengths.
 749 The
 750 .Dv MTSRSZ
 751 ioctl allows variable length and fixed length tape drives that
 752 support multiple record sizes to set the record length.
 753 The
 754 .Fa mt_count
 755 field of the
 756 .Vt mtop
 757 struct is used to pass the record size to/from the
 758 .Xr st 7D
 759 driver.
 760 A value of
 761 .Ql 0
 762 indicates variable record size.
 763 The
 764 .Dv MTSRSZ
 765 ioctl makes a variable-length tape device behave like a
 766 fixed-length tape device.
 767 Refer to the specific tape driver man page for
 768 details.
 769 .Pp
 770 .Dv MTLOAD
 771 loads the next tape cartridge into the tape drive.
 772 This is generally only used with stacker and tower type tape drives which handle
 773 multiple tapes per tape drive.
 774 A tape device without a tape inserted can be
 775 opened with the
 776 .Dv O_NDELAY
 777 flag, in order to execute this operation.
 778 .Pp
 779 .Dv MTIOCGETERROR
 780 allows user-level applications to retrieve error records
 781 from the
 782 .Xr st 7D
 783 driver.
 784 An error record consists of the SCSI command cdb
 785 which causes the error and a
 786 .Xr scsi_arq_status 9S
 787 structure if available.
 788 The user-level application is responsible for allocating and releasing the
 789 memory for
 790 .Fa mtee_cdb_buf
 791 and
 792 .Fa scsi_arq_status of each
 793 .Vt mterror_entry .
 794 Before issuing the ioctl, the
 795 .Fa mtee_arq_status_len
 796 value should be at least equal to
 797 .Ql sizeof (struct scsi_arq_status) .
 798 If more sense data than the size of
 799 .Xr scsi_arq_status 9S
 800 is desired, the
 801 .Fa mtee_arq_status_len
 802 may be larger than
 803 .Ql sizeof (struct scsi_arq_status)
 804 by the amount of additional extended sense data desired.
 805 The
 806 .Fa es_add_len
 807 field of
 808 .Xr scsi_extended_sense 9S
 809 can be used to determine the amount of valid sense data returned by the device.
 810 .Pp
 811 The
 812 .Dv MTIOCGET
 813 get status
 814 .Xr ioctl 2
 815 call returns the drive ID
 816 .Pq Fa mt_type ,
 817 sense key error
 818 .Pq Fa mt_erreg ,
 819 file number
 820 .Pq Fa mt_fileno ,
 821 optimum blocking factor
 822 .Pq Fa mt_bf
 823 and record number
 824 .Pq Fa mt_blkno
 825 of the last error.
 826 The residual count
 827 .Pq Fa mt_resid
 828 is set to the number of bytes not transferred or files/records not spaced.
 829 The flags word
 830 .Pq Fa mt_flags
 831 contains information indicating if the device is SCSI, if the device is a reel
 832 device and whether the device supports absolute file positioning.
 833 The
 834 .Fa mt_flags
 835 also indicates if the device is requesting cleaning media be used, whether the
 836 device is capable of reporting the requirement of cleaning media and if the
 837 currently loaded media is WORM (Write Once Read Many) media.
 838 .Pp
 839 Note \(em When tape alert cleaning is managed by the st driver, the tape
 840 target driver may continue to return a
 841 .Dq drive needs cleaning
 842 status unless an
 843 .Dv MTIOCGE
 844 .Xr ioct 2
 845 call is made while the cleaning media is in the drive.
 846 .Pp
 847 The
 848 .Dv MTIOCGETDRIVETYPE
 849 get drivetype ioctl call returns the name of the
 850 tape drive as defined in
 851 .Pa st.conf
 852 .Pq Fa name ,
 853 Vendor
 854 .Sy ID
 855 and model
 856 .Pq Fa product ,
 857 .Sy ID
 858 .Pq Fa vid ,
 859 type of tape device
 860 .Pq Fa type ,
 861 block size
 862 .Pq Fa size ,
 863 drive options
 864 .Pq Fa options ,
 865 maximum read retry count
 866 .Pq Fa max_rretries ,
 867 maximum write retry count
 868 .Pq Fa max_wretries ,
 869 densities supported by the drive
 870 .Pq Fa densities ,
 871 and default density of the tape drive
 872 .Pq Fa default_density .
 873 .Pp
 874 The
 875 .Dv MTIOCGETPOS
 876 ioctl returns the current tape position of the drive.
 877 It is returned in struct tapepos as defined in
 878 .Pa /usr/include/sys/scsi/targets/stdef.h .
 879 .Pp
 880 The
 881 .Dv MTIOCRESTPOS
 882 ioctl restores a saved position from the
 883 .Dv MTIOCGETPOS .
 884 .Ss "Persistent Error Handling IOCTLs and Asynchronous Tape Operations"
 885 .Bl -tag -width MTIOCPERSISTENTSTATUS -compact
 886 .It Dv MTIOCPERSISTENT
 887 enables/disables persistent error handling
 888 .It Dv MTIOCPERSISTENTSTATUS
 889 queries for persistent error handling
 890 .It Dv MTIOCLRERR
 891 clears persistent error handling
 892 .It Dv MTIOCGUARANTEEDORDER
 893 checks whether driver guarantees order of I/O's
 894 .El
 895 .Pp
 896 The
 897 .Dv MTIOCPERSISTENT
 898 ioctl enables or disables persistent error handling.
 899 It takes as an argument a pointer to an integer that turns it either on or off.
 900 If the ioctl succeeds, the desired operation was successful.
 901 It will wait for
 902 all outstanding I/O's to complete before changing the persistent error handling
 903 status.
 904 For example,
 905 .Bd -literal -offset 2n
 906 int on = 1;
 907 ioctl(fd, MTIOCPERSISTENT, &on);
 908 int off = 0;
 909 ioctl(fd, MTIOCPERSISTENT, &off);
 910 .Ed
 911 .Pp
 912 The
 913 .Dv MTIOCPERSISTENTSTATUS
 914 ioctl enables or disables persistent error
 915 handling.
 916 It takes as an argument a pointer to an integer inserted by the
 917 driver.
 918 The integer can be either 1 if persistent error handling is
 919 .Sq on ,
 920 or 0 if persistent error handling is
 921 .Sq off .
 922 It will not wait for outstanding I/O's.
 923 For example,
 924 .Bd -literal -offset 2n
 925 int query;
 926 ioctl(fd, MTIOCPERSISTENTSTATUS, &query);
 927 .Ed
 928 .Pp
 929 The
 930 .Dv MTIOCLRERR
 931 ioctl clears persistent error handling and allows tape
 932 operations to continual normally.
 933 This ioctl requires no argument and will
 934 always succeed, even if persistent error handling has not been enabled.
 935 It will wait for any outstanding I/O's before it clears the error.
 936 .Pp
 937 The
 938 .Dv MTIOCGUARANTEEDORDER
 939 ioctl is used to determine whether the driver
 940 guarantees the order of I/O's.
 941 It takes no argument.
 942 If the ioctl succeeds, the driver will support guaranteed order.
 943 If the driver does not support guaranteed order, then it should not be used
 944 for asynchronous I/O with
 945 .Xr libaio 3lib .
 946 It will wait for any outstanding I/O's before it returns.
 947 For example,
 948 .Bd -literal -offset 2n
 949 ioctl(fd, MTIOCGUARANTEEDORDER)
 950 .Ed
 951 .Pp
 952 See the
 953 .Sx Persistent Error Handling
 954 subsection above for more information on persistent error handling.
 955 .Ss "Asynchronous and State Change IOCTLS"
 956 .Bl -tag -width 1n
 957 .It Dv MTIOCSTATE
 958 This ioctl blocks until the state of the drive, inserted or ejected, is
 959 changed.
 960 The argument is a pointer to a
 961 .Vt enum mtio_state ,
 962 whose possible enumerations are listed below.
 963 The initial value should be either the last reported state of the drive, or
 964 .Dv MTIO_NONE .
 965 Upon return, the
 966 enum pointed to by the argument is updated with the current state of the drive.
 967 .Bd -literal -offset 2n
 968 enum mtio_state {
 969     MTIO_NONE      /* Return tape's current state */
 970     MTIO_EJECTED   /* Tape state is "ejected" */
 971     MTIO_INSERTED  /* Tape state is "inserted" */
 972 };
 973 .Ed
 974 .El
 975 .Pp
 976 When using asynchronous operations, most ioctls will wait for all outstanding
 977 commands to complete before they are executed.
 978 .Ss "IOCTLS for Multi-initiator Configurations"
 979 .Bl -tag -width MTIOCFORCERESERVE -compact
 980 .It Dv MTIOCRESERVE
 981 reserve the tape drive
 982 .It Dv MTIOCRELEASE
 983 revert back to the default behavior of reserve on open/release on close
 984 .It Dv MTIOCFORCERESERVE
 985 reserve the tape unit by breaking reservation held by another host
 986 .El
 987 .Pp
 988 The
 989 .Dv MTIOCRESERVE
 990 ioctl reserves the tape drive such that it does not
 991 release the tape drive at close.
 992 This changes the default behavior of releasing the device upon close.
 993 Reserving the tape drive that is already reserved has no effect.
 994 For example,
 995 .Bd -literal -offset 2n
 996 ioctl(fd, MTIOCRESERVE);
 997 .Ed
 998 .Pp
 999 The
1000 .Dv MTIOCRELEASE
1001 ioctl reverts back to the default behavior of reserve on
1002 open/release on close operation, and a release will occur during the next
1003 close.
1004 Releasing the tape drive that is already released has no effect.
1005 For example,
1006 .Bd -literal -offset 2n
1007 ioctl(fd, MTIOCRELEASE);
1008 .Ed
1009 .Pp
1010 The
1011 .Dv MTIOCFORCERESERVE
1012 ioctl breaks a reservation held by another host, interrupting any I/O in
1013 progress by that other host, and then reserves the tape unit.
1014 This ioctl can be executed only with super-user privileges.
1015 It is recommended to open the tape device in
1016 .Dv O_NDELAY
1017 mode when this ioctl needs to be executed, otherwise the open will fail if
1018 another host indeed has it reserved.
1019 For example,
1020 .Bd -literal -offset 2n
1021 ioctl(fd, MTIOCFORCERESERVE);
1022 .Ed
1023 .Ss "IOCTLS for Handling Tape Configuration Options"
1024 .Bl -tag -width MTIOCREADIGNOREEOFS
1025 .It Dv MTIOCSHORTFMK
1026 enables/disables support for writing short filemarks.
1027 This is specific to Exabyte drives.
1028 .It Dv MTIOCREADIGNOREILI
1029 enables/disables suppress incorrect length indicator (SILI) support during reads
1030 .It Dv MTIOCREADIGNOREEOFS
1031 enables/disables support for reading past two EOF marks which otherwise indicate
1032 End-Of-recording-Media (EOM) in the case of 1/2\(dq reel tape drives
1033 .El
1034 .Pp
1035 The
1036 .Dv MTIOCSHORTFMK
1037 ioctl enables or disables support for short filemarks.
1038 This ioctl is only applicable to Exabyte drives which support short filemarks.
1039 As an argument, it takes a pointer to an integer.
1040 If 0 (zero) is the specified integer, then long filemarks will be written.
1041 If 1 is the specified integer, then short filemarks will be written.
1042 The specified tape behavior will be in effect until the device is closed.
1043 .Pp
1044 For example:
1045 .Bd -literal -offset 2n
1046 int on = 1;
1047 int off = 0;
1048 /* enable short filemarks */
1049 ioctl(fd, MTIOSHORTFMK, &on);
1050 /* disable short filemarks */
1051 ioctl(fd, MTIOCSHORTFMK, &off);
1052 .Ed
1053 .Pp
1054 Tape drives which do not support short filemarks will return an
1055 .Va errno
1056 of
1057 .Er ENOTTY .
1058 .Pp
1059 The
1060 .Dv MTIOCREADIGNOREILI
1061 ioctl enables or disables the suppress incorrect
1062 length indicator (SILI) support during reads.
1063 As an argument, it takes a pointer to an integer.
1064 If 0 (zero) is the specified integer, SILI will not be
1065 used during reads and incorrect length indicator will not be suppressed.
1066 If 1 is the specified integer, SILI will be used during reads and incorrect
1067 length indicator will be suppressed.
1068 The specified tape behavior will be in effect until the device is closed.
1069 .Pp
1070 For example:
1071 .Bd -literal -offset 2n
1072 int on = 1;
1073 int off = 0;
1074 ioctl(fd, MTIOREADIGNOREILI, &on);
1075 ioctl(fd, MTIOREADIGNOREILI, &off);
1076 .Ed
1077 .Pp
1078 The
1079 .Dv MTIOCREADIGNOREEOFS
1080 ioctl enables or disables support for reading
1081 past double EOF marks which otherwise indicate End-Of-recorded-media (EOM) in
1082 the case of 1/2\(dq reel tape drives.
1083 As an argument, it takes a pointer to an integer.
1084 If 0 (zero) is the specified integer, then double EOF marks indicate
1085 End-Of-recodred-media (EOD).
1086 If 1 is the specified integer, the double EOF marks no longer indicate EOM,
1087 thus allowing applications to read past two EOF marks.
1088 In this case it is the responsibility of the application to detect
1089 end-of-recorded-media (EOM).
1090 The specified tape behavior will be in effect until the device is closed.
1091 .Pp
1092 For example:
1093 .Bd -literal -offset 2n
1094 int on = 1;
1095 int off = 0;
1096 ioctl(fd, MTIOREADIGNOREEOFS, &on);
1097 ioctl(fd, MTIOREADIGNOREEOFS, &off);
1098 .Ed
1099 .Pp
1100 Tape drives other than 1/2\(dq reel tapes will return an
1101 .Va errno
1102 of
1103 .Er ENOTTY .
1104 .Sh FILES
1105 .Pa /dev/rmt/ Ns Ao unit number Ac \
1106     Ns Ao density Ac \
1107     Ns Bo Ao BSD behavior Ac Bc \
1108     Ns Bo Ao no rewind Ac Bc
1109 .Pp
1110 Where
1111 .Aq density
1112 can be
1113 .Ql l ,
1114 .Ql m ,
1115 .Ql h ,
1116 .Ql u/c
1117 (low, medium, high, ultra/compressed, respectively), the
1118 .Aq BSD behavior
1119 option is
1120 .Ql b , and the
1121 .Aq no rewind
1122 option is
1123 .Ql n .
1124 .Pp
1125 For example,
1126 .Pa /dev/rmt/0hbn
1127 specifies unit 0, high density,
1128 .Sy BSD
1129 behavior and no rewind.
1130 .Sh EXAMPLES
1131 .Bl -inset
1132 .It Sy Example 1
1133 Tape Positioning and Tape Drives
1134 .Pp
1135 Suppose you have written three files to the non-rewinding 1/2\(dq tape device,
1136 .Pa /dev/rmt/0ln ,
1137 and that you want to go back and
1138 .Xr dd 1M
1139 the second file off the tape.
1140 The commands to do this are:
1141 .Bd -literal -offset 2n
1142 mt -F /dev/rmt/0lbn bsf 3
1143 mt -F /dev/rmt/0lbn fsf 1
1144 dd if=/dev/rmt/0ln
1145 .Ed
1146 .Pp
1147 To accomplish the same tape positioning in a C program, followed by a get
1148 status ioctl:
1149 .Bd -literal -offset 2n
1150 struct mtop mt_command;
1151 struct mtget mt_status;
1152 mt_command.mt_op = MTBSF;
1153 mt_command.mt_count = 3;
1154 ioctl(fd, MTIOCTOP, &mt_command);
1155 mt_command.mt_op = MTFSF;
1156 mt_command.mt_count = 1;
1157 ioctl(fd, MTIOCTOP, &mt_command);
1158 ioctl(fd, MTIOCGET, (char *)&mt_status);
1159 .Ed
1160 .Pp
1161 or
1162 .Bd -literal -offset 2n
1163 mt_command.mt_op = MTNBSF;
1164 mt_command.mt_count = 2;
1165 ioctl(fd, MTIOCTOP, &mt_command);
1166 ioctl(fd, MTIOCGET, (char *)&mt_status);
1167 .Ed
1168 .Pp
1169 To get information about the tape drive:
1170 .Bd -literal -offset 2n
1171 struct mtdrivetype mtdt;
1172 struct mtdrivetype_request mtreq;
1173 mtreq.size = sizeof(struct mtdrivetype);
1174 mtreq.mtdtp = &mtdt;
1175 ioctl(fd, MTIOCGETDRIVETYPE, &mtreq);
1176 .Ed
1177 .El
1178 .Sh SEE ALSO
1179 .Xr mt 1 ,
1180 .Xr tar 1 ,
1181 .Xr dd 1M ,
1182 .Xr open 2 ,
1183 .Xr read 2 ,
1184 .Xr write 2 ,
1185 .Xr aioread 3C ,
1186 .Xr aiowrite 3C ,
1187 .Xr ar.h 3HEAD ,
1188 .Xr st 7D
1189 .Pp
1190 .%T 1/4 Inch Tape Drive Tutorial