El controlador (driver) st proporciona la interfaz para una
variedad de dispositivos de cinta magnética SCSI. Actualmente, toma
el control de todos los dispositivos detectados de tipo “acceso
secuencial”. El controlador st emplea el número mayor
de dispositivo 9.
Cada dispositivo utiliza ocho números menores de
dispositivo. Los cinco bits más bajos en los números menores
se asignan secuencialmente en el orden en que se detectan. En la
versión 2.6 del núcleo, los bits por encima de los 8 menores
se unen a los cinco menores para formar el número de la cinta. Los
números menores se pueden agrupar en dos conjuntos de cuatro
números: los números menores de dispositivo (con
autorebobinado) principales, n, y los números de dispositivo
“sin rebobinado”, (n+128). A los dispositivos abiertos
que utilicen el número de dispositivo principal se les enviará
una orden REWIND cuando se cierren. A los dispositivos abiertos que
utilicen el número de dispositivo “sin rebobinado” no
se les enviará esa orden. (Dese cuenta que usar un dispositivo con
autorebobinado para posicionar la cinta con, por ejemplo, mt no produce el
resultado deseado: la cinta se rebobina después de la orden mt y la
orden siguiente comienza desde el principio de la cinta).
Dentro de cada grupo, hay disponibles cuatro números
menores para definir dispositivos con diferentes características
(tamaño de bloque, compresión, densidad, etc.). Cuando el
sistema arranca, sólo está disponible el primer dispositivo.
Los otros tres se activan cuando se definen las carcterísticas por
defecto (ver más abajo). (Cambiando las constantes en tiempo de
compilación, es posible cambiar el equilibrio entre el número
máximo de unidades de cinta y el número de números
menores para cada unidad. La asignación por defecto permite controlar
32 dispositivos de cinta. Por ejemplo, es posible controlar hasta 64
unidades de cinta con 2 números menores para diferentes
opciones).
Normalmente los dispositivos se crean con:
mknod -m 666 /dev/st0 c 9 0
mknod -m 666 /dev/st0l c 9 32
mknod -m 666 /dev/st0m c 9 64
mknod -m 666 /dev/st0a c 9 96
mknod -m 666 /dev/nst0 c 9 128
mknod -m 666 /dev/nst0l c 9 160
mknod -m 666 /dev/nst0m c 9 192
mknod -m 666 /dev/nst0a c 9 224
No existe el dispositivo de bloque correspondiente.
El controlador usa un buffer interno que tiene que ser lo
suficientemente grande para contener, al menos, un bloque de la cinta. En
los núcleos anteriores al 2.1.121, el buffer se reserva como un
bloque contiguo. Esto limita el tamaño de bloque al mayor bloque
contiguo de memoria que el código de asignación de memoria del
núcleo puede proporcionar. Actualmente, el límite es de
128 kB para arquitecturas de 32 bits y 256 kB para
arquitecturas de 64 bits. En núcleos posteriores el controlador
reserva el buffer en varias partes si es necesario. Por defecto, el
número máximo de partes es de 16. Esto significa que el
tamaño máximo de bloques es muy grande (2 MB si es
posible una asignación de 16 bloques de 128 kB).
El tamaño del buffer interno del controlador viene
determinado por una constante durante la compilación que se puede
modificar con una opción de inicio del núcleo. Aparte de esto,
el controlador intenta reservar un buffer temporal mayor en tiempo de
ejecución si es necesario. Sin embargo, la asignación en
tiempo de ejecución de grandes bloques contiguos de memoria puede
fallar y es aconsejable no confiar demasiado en la asignación
dinámica de buffers con núcleos anteriores al 2.1.121 (esto se
aplica también a la carga por demanda del controlador con kerneld o
kmod).
El controlador no soporta específicamente ninguna marca o
modelo de unidad de cinta. Después del arranque del sistema se
definen las opciones de los dispositivos de cinta a partir del firmware de
la unidad. Por ejemplo, si el firmware de la unidad selecciona un modo de
bloque fijo, el dispositivo de cinta usa el modo de bloque fijo. Las
opciones se pueden cambiar con llamadas explícitas a ioctl(2)
y permanecen activas cuando el dispositivo se cierra y se vuelve a abrir. La
configuración de las opciones afecta tanto al dispositivo con
auto-rebobinado como sin rebobinado.
Se pueden indicar diferentes opciones para los diferentes
dispositos dentro del subgrupo de cuatro. Las opciones entran en vigor
cuando el dispositivo se abre. Por ejemplo, el administrador del sistema
puede definir un dispositivo que escribe en modo de bloque fijo con un
tamaño de bloque concreto y otro que escribe en modo de bloque
variable (si la unidad de cinta soporta ambos modos).
El controlador puede trabajar con particiones de cinta si
la unidad puede hacerlo. (Dese cuenta que las particiones de cinta no tienen
nada que ver con las particiones de disco. Una cinta particionada se puede
ver como varias cintas lógicas dentro de un mismo medio). El soporte
de particiones se debe habilitar con ioctl(2). La posición de
cinta se conserva dentro de cada partición durante los cambios de
partición. La partición usada para las operaciones de cinta
subsiguientes se selecciona con ioctl(2). El cambio de
partición se ejecuta junto con la siguiente operación de cinta
para evitar movimientos de cinta innecesarios. El número
máximo de particiones en una cinta es definido por una constante en
tiempo de compilación (originalmente cuatro). El controlador contiene
un ioctl(2) que puede formatear una cinta con una o dos
particiones.
El dispositivo /dev/tape se crea normalmente como un enlace
físico o simbólico al dispositivo de cinta predeterminado en
el sistema.
A partir de la versión 2.6.2 del núcleo, el
controlador realiza la exportación de los dispositivos conectados y
algunos parámetros asignados a ellos en el directorios sysfs
/sys/class/scsi_tape
El controlador soporta tanto el funcionamiento en modo de bloque
fijo como en modo de bloque variable (si la unidad lo soporta). En el modo
de bloque fijo la unidad escribe bloques del tamaño especificado y el
tamaño de bloque no depende de la cantidad de bytes de las llamadas
al sistema de escritura. En el modo de bloque variable se escribe un bloque
de cinta para cada llamada de escritura y el número de bytes
determina el tamaño del bloque de cinta correspondiente. Dese cuenta
que los bloques en la cinta no contienen ninguna información sobre el
modo de escritura: cuando se lee, lo único importante es usar
órdenes que acepten los tamaños de los bloques en la
cinta.
En el modo de bloque variable la cantidad de bytes leídos
no tiene que coincidir exactamente con el tamaño de bloque de la
cinta. Si la cantidad de bytes es mayor que el siguiente bloque de la cinta,
el controlador devuelve los datos y la función devuelve el
tamaño real de bloque. Si el tamaño de bloque es mayor que la
cantidad de bytes, se emite un mensaje de error.
En el modo de bloque fijo, la cantidad de bytes a leer puede ser
arbitraria si se habilita el uso de buffers, o un múltiplo del
tamaño de bloque de la cinta si se deshabilita el uso de buffers. Los
núcleos anteriores al 2.1.121 permiten escrituras con cantidades de
bytes arbitrarias si se habilita el uso de buffers. En todos los otros casos
(un núcleo anterior al 2.1.121 con uso de buffers deshabilitado o un
núcleo nuevo) la cantidad de bytes a escribir debe ser un
múltiplo del tamaño de bloque de la cinta.
En la versión 2.6 del núcleo, el controlador
intentará usar transferencias directas entre el buffer y el
dispositivo. Si esto no es posible, se emplea el buffer interno del
controlador. El hecho de no poder emplear transferencias directas puede
deberse a una alíneación incorrecta del buffer del usuario
(configurado en 512 bytes por defecto pero el controlador HBA puede
modificarlo), a que una o más páginas del buffer del usuario
sea inaccesibles por parte del adaptador SCSI, etc...
Automáticamente se escribe una marca de fichero en la cinta
si la última operación de cinta antes de cerrar era un
escritura.
Cuando se encuentra una marca de fichero durante las lecturas,
ocurre lo siguiente. Si quedan datos en el buffer cuando se encuentra la
marca de fichero, se devuelven los datos del buffer. La próxima
lectura devuelve cero bytes. La siguiente lectura devuelve datos del
siguiente fichero. El final de los datos grabados se indica devolviendo cero
bytes para dos lecturas consecutivas. La tercera lectura devuelve un
error.
El controlador admite tres peticiones ioctl(2). Las
peticiones no reconocidas por el controlador st se pasan al
controlador SCSI. Las definiciones de abajo son de
/usr/include/linux/mtio.h:
Esta petición toma un argumento de tipo (struct
mtop *). No todas las unidades de cinta admiten todas las
operaciones. El controlador retorna un error EIO si la unidad rechaza
una operación.
/* Estructura para MTIOCTOP - orden de op. de cinta mag.: */
struct mtop {
short mt_op; /* operationes definidas abajo */
int mt_count; /* cuántas de ellas */
};
Operaciones de Cinta Magnética para el uso normal de una
cinta:
- MTBSF
- Espacio atrás sobre mt_count marcas de archivo.
- MTBSFM
- Espacio atrás sobre mt_count marcas de fichero. Reposiciona
la cinta a la parte EOT de la última marca de fichero.
- MTBSR
- Espacio atrás sobre mt_count registros (bloques de
cinta).
- MTBSS
- Espacio atrás sobre mt_count marcas de conjunto.
- MTCOMPRESSION
- Habilita la compresión de los datos de la cinta dentro de la unidad
si mt_count no es cero y deshabilita la compresión si
mt_count es cero. Esta orden usa el MODO página 15 (`MODE
page 15') soportado por la mayoría de DATs.
- MTEOM
- Ir al fin del material grabado (para añadir ficheros).
- MTERASE
- Borra la cinta. En núcleos 2.6, se hará un borrado breve
(simplemente marcando la cinta como vacía) si el argumento es cero.
En cualquier otro caso, se hace un borrado largo (borrar todo).
- MTFSF
- Espacio atrás sobre mt_count marcas de archivo.
- MTFSFM
- Espacio atrás sobre mt_count marcas de fichero. Reposiciona
la cinta a la parte BOT de la última marca de fichero.
- MTFSR
- Espacio atrás sobre mt_count registros (bloques de
cinta).
- MTFSS
- Espacio atrás sobre mt_count marcas de conjunto.
- MTLOAD
- Ejecuta la orden SCSI de carga. Se dispone de un caso especial para
algunos autocargadores HP. Si mt_count es la constante
MT_ST_HPLOADER_OFFSET más un número, el número
se envia a la unidad para controlar al autocargador.
- MTLOCK
- Bloquea la tapa de la unidad de cinta.
- MTMKPART
- Formatea la cinta en una o dos particiones. Si mt_count es
positivo, da el tamaño de la primera partición y la segunda
partición contiene el resto de la cinta. Si mt_count es
cero, la cinta se formatea en una partición. A partir de Linux 4.6,
un valor negativo de mt_count define el tamaño de la
partición 0 siendo el resto de la cinta la partición 1. El
orden físico de las particiones depende del disco.Esta orden no
está permitida para una unidad a menos que se habilite el soporte
de particiones para la unidad (consulte MT_ST_CAN_PARTITIONS
más adelante).
- MTNOP
- No op.—vuelca el búfer del controlador como efecto
colateral. Debería emplearse antes de leer el estado con
MTIOCGET.
- MTOFFL
- Rebobina y apaga la unidad.
- MTRESET
- Pone la unidad en el estado inicial.
- MTRETEN
- Retensiona la cinta.
- MTREW
- Rebobina.
- MTSEEK
- Busca y va al número de bloque especificado en mt_count.
Esta operación requiere bien una unidad SCSI-2 que admita la orden
LOCATE (dirección específica del dispositivo), bien
una unidad SCSI-1 compatible con Tandberg (Tandberg, Archive Viper,
Wangtek, ... ). El número de bloque debería ser uno
previamente devuelto por MTIOCPOS si se utilizan direcciones
específicas del dispositivo.
- MTSETBLK
- Establece la longitud de bloque de la unidad al valor especificado en
mt_count. Una longitud de bloque cero pone la unidad en modo de
tamaño de bloque variable.
- MTSETDENSITY
- Pone la densidad de la cinta según el código en
mt_count. Los códigos de densidad soportados por una unidad
se pueden encontrar en la documentación de la unidad.
- MTSETPART
- La partición activa se cambia a mt_count. Las particiones se
numeran a partir de cero. Esta orden no se permite para una unidad a menos
que se habilite el soporte de particiones para la unidad (ver
MT_ST_CAN_PARTITIONS más abajo).
- MTUNLOAD
- Ejecuta la orden SCSI de descarga (no expulsa la cinta).
- MTUNLOCK
- Desbloquea la tapa de la unidad de cinta.
- MTWEOF
- Escribe mt_count marcas de archivo.
- MTWSM
- Escribe mt_count marcas de conjunto.
Operaciones de Cinta Magnética para configurar las opciones
del dispositivo (a realizar por el administrador):
- MTSETDRVBUFFER
- Establece varias opciones de la unidad y el controlador según los
bits codificados en mt_count. Éstas consisten en el modo de
uso de buffers de la unidad, varias opciones booleanas del controlador, el
umbral de escritura del buffer, valores por defecto del tamaño de
bloque y de densidad y plazos de tiempo (sólo a partir de la
versión 2.1 de Linux). Una única operación puede
afectar a un único elemento de la lista de debajo (los booleanos
cuentan como un elemento).
- Un valor que tenga ceros en los 4 bits más altos se empleará
para establecer el modo de tamponamiento de la unidad. Los modos de
tamponamiento son:
- 0
- La unidad no informará del estado GOOD en órdenes de
escritura hasta que los bloques de datos se escriban realmente en el
material magnético.
- 1
- La unidad puede devolver un estado GOOD en órdenes de
escritura tan pronto como todos los datos se hayan transferido al
búfer interno de la unidad.
- 2
- La unidad puede devolver un estado GOOD en órdenes de
escritura tan pronto como (a) todos los datos se hayan transferido al
búfer interno del controlador, y (b) todos los datos en
búferes, provinientes de iniciadores diferentes, hayan sido bien
escritos en el material magnético.
- Para controlar el umbral de escritura, el valor en mt_count debe
incluir la constante MT_ST_WRITE_THRESHOLD aplicándole el
operador de bits O inclusivo con un número de bloque en los 28 bits
de más bajo orden. El número de bloque se refiere a bloques
de 1024 bytes, no al tamaño de bloque físico de la cinta. El
umbral no puede exceder el tamaño del búfer interno del
controlador (consulte DESCRIPCIÓN anteriormente).
- Para activar y desactivar las opciones booleanas el valor en
mt_count debe incluir una de las constantes MT_ST_BOOLEANS,
MT_ST_SETBOOLEANS, MT_ST_CLEARBOOLEANS o
MT_ST_BOOLEANS operada con un O lógico inclusivo a nivel de
bits con cualquier combinación de las siguientes opciones,
según se desee. Usando MT_ST_BOOLEANS se pueden asignar a
las opciones los valores definidos en los bits correspondientes. Con
MT_ST_SETBOOLEANS se pueden configurar las opciones de forma
selectiva y selectivamente borradas con MT_ST_DEFBOOLEANS.
- Las opciones por defecto para un dispositivo de cinta se configuran con
MT_ST_DEFBOOLEANS. Un dispositivo de cinta no activo (por ejemplo,
un dispositivo con número menor 32 o 160) se activa cuando sus
opciones por defecto se definen por primera vez. Un dispositivo activado
herenda del dispositivo activado durante el arranque las opciones no
configuradas explícitamente.
- Las opciones booleanas son:
- MT_ST_BUFFER_WRITES
(Por omisión: verdad)
- Todas las operaciones de escritura van a través de búferes
en el modo de bloque fijo. Si esta opción es falsa y la unidad
emplea un tamaño de bloque fijo, entonces todas las operaciones de
escritura deben ser un múltiplo del tamaño de bloque. Esta
opción debe ponerse como falsa para escribir confiablemente
archivos multivolúmenes.
- MT_ST_ASYNC_WRITES
(Por omisión: verdad)
- Cuando esta opción es verdad, las operaciones de escritura regresan
inmediatamente sin esperar que los datos se transfieran a la unidad si los
datos caben en el búfer del controlador. El umbral de escritura
determina cuán lleno debe estar el búfer antes de que se
dé una nueva orden de escritura SCSI. Cualquier error devuelto por
la unidad se mantendrá en espera hasta la siguiente
operación. Esta opción debe ponerse como falsa para escribir
confiablemente archivos multivolúmenes.
- MT_ST_READ_AHEAD
(Por omisión: verdad)
- Esta opción hace que el controlador proporcione un búfer
para la lectura, y lectura por adelantado en el modo de bloque fijo. Si
esta opción es falsa y la unidad emplea un tamaño de bloque
fijo, entonces todas las operaciones de lectura deben ser para un
múltiplo del tamaño de bloque.
- MT_ST_TWO_FM
(Por omisión: falso)
- Esta opción modifica el comportamiento del controlador cuando un
fichero se cierra. La acción normal es escribir una simlpe marca de
fichero. Si la opción es verdad el controlador escribirá dos
marcas de fichero y hará un espacio atrás sobre el
segundo.
- Nota: Esta opción no debería ponerse a verdad para unidades
de cinta QIC puesto que son incapaces de sobreescribir una marca de
fichero. Estas unidades detectan el fin de datos grabados mirando si hay
cinta en blanco en vez de dos marcas de fichero consecutivas. La
mayoría de las otras unidades actuales también detectan el
final de los datos grabados y el uso de dos marcas de fichero es
normalmente necesario sólo al intercambiar cintas con algunos otros
sistemas.
- MT_ST_DEBUGGING
(Por omisión: falso)
- Esta opción activa varios mensajes de depuración del
controlador (sólo es efectiva si se compiló la unidad con
DEBUG definida a un valor no cero).
- MT_ST_FAST_EOM
(Por omisión: falso)
- Esta opción hace que la operación MTEOM se
envíe directamente a la unidad, acelerando potencialmente la
operación pero haciendo que el controlador pierda la pista del
número de fichero en curso normalmente devuelto por la
petición MTIOCGET. Si MT_ST_FAST_EOM es falso el
controlador responderá a una petición MTEOM saltando
hacia adelante sobre los ficheros.
- MT_ST_AUTO_LOCK
(Por omisión: falso)
- Cuando esta opción es verdadera, la tapa de la unidad se bloquea
cuando se abre el dispositivo y se desbloquea cuando se cierra.
- MT_ST_DEF_WRITES
(Por omisión: falso)
- Las opciones de cinta (tamaño de bloque, modo, compresión,
etc.) pueden cambiar al cambiar de un dispositivo ligado a una unidad a
otro dispositivo ligado a la misma unidad dependiendo de cómo se
definan los dispositivos. Esta opción define cuándo es el
controlador el que fuerza los cambios usando órdenes SCSI y
cúando se confía en las capacidades del autodetección
de las unidades. Si esta opción es falsa, el controlador
envía inmediatamente órdenes SCSI cuando se cambia el
dispositivo. Si la opción es verdad, no se envían
órdenes SCSI hasta que se solicite una escritura. En este caso se
permite al firmware de la unidad detectar la estructura de la cinta al
leer y sólo se usan las órdenes SCSI para asegurarse de que
una cinta se escribe según la especificación correcta.
- MT_ST_CAN_BSR
(Por omisión: falso)
- Algunas veces, cuando se usa lectura por adelantado, se debe retrocer la
cinta a la posición correcta cuando se cierra el dispositivo y,
para este propósito, se utiliza la orden SCSI para retrocer sobre
los registros. Algunas unidades más antiguas no pueden procesar
esta orden de manera fiable y se puede usar esta opción para mandar
al controlador no usar la orden. El resultado final es que, con lectura
por adelantado y el modo de bloque fijo, la cinta podría no estar
correctamente posicionada dentro de un archivo cuando el dispositivo se
cierra. En la versión 2.6 del núcleo, por defecto es
verdadero para discos con soporte para SCSI-3.
- MT_ST_NO_BLKLIMS
(Por omisión: falso)
- Algunas unidades no aceptan la orden SCSI READ BLOCK LIMITS. Si se
usa esto, el controlador no usará la orden. El inconveniente es que
el controlador no puede comprobar antes de enviar órdenes si el
tamaño de bloque seleccionado es aceptable por la unidad.
- MT_ST_CAN_PARTITIONS
(Por omisión: falso)
- Esta opción habilita el soporte de varias particiones dentro de una
cinta. La opción se aplica a todos los dispositivos ligados a la
unidad.
- MT_ST_SCSI2LOGICAL
(Por omisión: falso)
- Esta opción obliga al controlador a usar las direcciones
lógicas de bloques definidas en el estándar SCSI-2 al
realizar la búsqueda y comunicar operaciones (tanto con la
órden MTSEEK como con MTIOCPOS y al cambiar la
partición de la cinta). En otro caso, se usan las direcciones
específicas del dispositivo. Es muy recomendable activar esta
opción si la unidad soporta direcciones lógicas ya que
también cuentan marcas de fichero. Hay algunos dispositivos que
sólo soportan direcciones lógicas de bloque.
- MT_ST_SYSV
(Por omisión: falso)
- Cuando se habilita esta opción, los dispositivos de cinta usan la
semántica de System V. En caso contrario, se usa la
semántica BSD. La diferencia más importante entre ambas
semánticas es qué ocurre cuando un dispositivo utilizado
para lectura se cierra: en la semántica System V la cinta se avanza
hasta pasar la siguiente marca de fichero si esto no ha ocurrido ya al
usar el dispositivo. En la semántica BSD la posición de la
cinta no cambia.
- MT_NO_WAIT
(Por omisión: falso)
- Activa el modo inmediato para algunas órdenes. Esto es que no
espera a su finalizacion (por ejemplo: el rebobinado).
Un ejemplo:
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);
El tamaño de bloque por defecto para un dispositivo se
puede configurar con MT_ST_DEF_BLKSIZE y el código de densidad
por defecto se puede configurar con MT_ST_DEFDENSITY. Los valores
para los parámetros se operan con un O lógico con el
código de operación.
Con los núcleos 2.1.x y posteriores, los valores de los
plazos de tiempo (timeout) se pueden configurar con la suborden
MT_ST_SET_TIMEOUT operado con un O lógico con el plazo de
tiempo en segundos. El plazo largo de tiempo (usado para los rebobinados y
otras órdenes que pueden tardar mucho tiempo) se puede configurar con
MT_ST_SET_LONG_TIMEOUT. Los valores por defecto del núcleo son
muy grandes para asegurarse de que una órden exitosa no será
cancelada para ninguna unidad. Debido a esto, el controlador puede parecer
atascado aun cuando sólo esté esperando a que se cumpla el
plazo de tiempo. Estas órdenes se pueden usar para configurar
más valores útiles para una unidad específica. Los
plazos de tiempo configurados para un dispostivo se aplican a todos los
dispositivos ligados a la misma unidad.
A partir de las versiones 2.4.19 y 2.5.43 de Linux, el controlador
incluye un bit de estado que indica si la unidad necesita ser limpiada. El
método que usará para transmitir información sobre su
limpieza se define mediante la orden secundaria MT_ST_SEL_CLN. Si su
valor es cero, el bit de limpieza siempre estará a cero. Si el valor
es uno, se emplea TapeAlert definido en el standard SCSI-3 (pendiente de
implementar). Los valores 2–17 están reservados. Si los
menores 8 bits son >=18, se emplean bits de la extesión sense. Los
bits 9–16 definen una máscara que define los bits a mirar y
los bits 17–23 definen el patrón de bits que debe buscarse. Si
el patrón es cero, uno o más bits dentro de la máscara
indican una petición de limpieza. Si el patrón es distinto de
cero, debe concordar con el byte de la máscara sense.
Esta petición toma un argumento de tipo (struct
mtget *).
/* estructura para MTIOCGET - orden estado de cinta mag */
struct mtget {
long mt_type;
long mt_resid;
/* los ss. registros son dependientes del dispositivo */
long mt_dsreg;
long mt_gstat;
long mt_erreg;
/* Los ss. 2 campos no se usan siempre */
daddr_t mt_fileno;
daddr_t mt_blkno;
};
- mt_type
- El fichero de cabecera define muchos valores para mt_type, pero el
controlador actual informa sólo de los tipos genéricos
MT_ISSCSI1 (cinta genérica SCSI-1) y MT_ISSCSI2
(cinta genérica SCSI-2).
- mt_resid
- contiene el número de partición actual de la cinta.
- mt_dsreg
- informa de los valores actuales de la unidad para el tamaño de
bloque (en los 24 bits más bajos) y para la densidad (en los 8 bits
más altos). Estos campos están definidos por
MT_ST_BLKSIZE_SHIFT, MT_ST_BLKSIZE_MASK,
MT_ST_DENSITY_SHIFT y MT_ST_DENSITY_MASK.
- mt_gstat
- da información de estado genérica (independiente del
dispositivo). El fichero de cabecera define macros para comprobar estos
bits de estado:
- GMT_EOF(x)
- La cinta está posicionada justo tras una marca de fichero (siempre
falso tras una operación MTSEEK).
- GMT_BOT(x)
- La cinta está posicionada al principio del primer archivo (siempre
falso tras una operación MTSEEK).
- GMT_EOT(x)
- Una operación de cinta ha alcanzado el Final de Cinta
físico.
- GMT_SM(x)
- La cinta está posicionada actualmente en una marca de conjunto
(siempre falso tras una operación MTSEEK).
- GMT_EOD(x)
- La cinta está posicionada al final de datos grabados.
- GMT_WR_PROT(x)
- La unidad está protegida contra escritura. Para algunas unidades
esto también puede significar que no admite escribir en el tipo de
medio físico actual.
- GMT_ONLINE(x)
- El último open(2) encontró a la unidad con una cinta
puesta y lista para la operación.
- GMT_D_6250(x)
- GMT_D_1600(x)
- GMT_D_800(x)
- Esta información de estado “genérica” informa
de la densidad actual para unidades de cinta de 9 pistas y ½
pulgadas solamente.
- GMT_DR_OPEN(x)
- La unidad no tiene una cinta puesta.
- GMT_IM_REP_EN(x)
- Modo de informe inmediato. Este bit se activa si no hay garantías
de que los datos se hayan escrito físicamente en la cinta cuando la
llamada de escritura termina. Se le asigna el valor cero sólo
cuando el controlador no usa buffers para los datos y la unidad no
está configurada para usar buffers de datos.
- GMT_CLN(x)
- La unidad necesita ser limpiada. Implementado a partir de las versiones
2.4.19 y 2.5.43 del núcleo.
- mt_erreg
- El único campo definido en mt_erreg es el número de
errores recuperados en los 16 bits de más bajo orden (como se
define por MT_ST_SOFTERR_SHIFT y MT_ST_SOFTERR_MASK). Debido
a inconsistencias en la forma en que las unidades informan de errores
recuperados, este número a menudo no es mantenido (la
mayoría de las unidades no informan, por defecto, de errores leves
pero esto se puede cambiar con una orden SCSI MODE SELECT).
- mt_fileno
- devuelve el número de fichero actual (empezando por cero). Este
valor se pone a -1 cuando el número de fichero se desconoce (p. ej.
después de MTBSS o MTSEEK).
- mt_blkno
- da el número de bloque (empezando por cero) dentro del fichero
actual. Este valor se pone a -1 cuando el número de bloque se
desconoce (p. ej. después de MTBSF, MTBSS o
MTSEEK).
Esta petición toma un argumento de tipo (struct
mtpos *) y devuelve la noción que tiene el controlador del
número de bloque de cinta actual, que no es el mismo que
mt_blkno devuelto por MTIOCGET. Esta unidad debe ser de tipo
SCSI-2 y debe admitir la orden READ POSITION (dirección
específica del dispositivo) o una unidad SCSI-1 compatible Tandberg
(Tandberg, Archive Viper, Wangtek, ... ).
/* estructura para MTIOCPOS - orden obtener posición cinta mag. */
struct mtpos {
long mt_blkno; /* número de bloque en curso */
};