Le pilote de périphérique st fournit une
interface vers un grand nombre de lecteurs de bandes SCSI. Actuellement, ce
pilote prend le contrôle de tous les périphériques
détectés de type « accès
séquentiel ». Le pilote st utilise un
numéro majeur valant 9.
Chaque périphérique utilise huit numéros
mineurs. Les 5 bits de poids faible des numéros mineurs sont
assignés séquentiellement dans l'ordre de détection.
Avec le noyau 2.6, les bits au-delà des 8 bits de poids faible sont
concaténés aux 5 bits de poids faible pour former le
numéro de lecteur de bande. Les numéros mineurs peuvent
être groupés en deux ensembles de quatre
numéros : les numéros mineurs principaux des
périphériques (avec rembobinage automatique), n, et les
numéros mineurs des périphériques sans rembobinage
automatique (n+ 128). Les périphériques ouverts avec le
numéro principal recevront une commande REWIND à la
fermeture. Les périphériques ouverts avec le numéro
« no-rewind » ne la recevront pas. (Notez
qu'essayer de positionner la bande d'un périphérique avec
rembobinage automatique en utilisant par exemple mt, ne produit pas le
résultat désiré : la bande est à nouveau
rembobinée après l'utilisation de la commande mt et la
commande suivante prend effet dès le début de la bande.
Au sein de chaque groupe, 4 numéros mineurs sont
disponibles pour définir des périphériques avec des
caractéristiques différentes (taille de bloc, compression,
densité, etc.). Lorsque le système démarre, seul le
premier périphérique est disponible. Les 3 autres sont
activés lorsque les caractéristiques par défaut sont
définies (voir plus bas). (En modifiant les constantes à la
compilation, on peut modifier la répartition entre le nombre maximal
de lecteurs de bandes et le nombre de numéros mineurs par lecteur.
Les allocations par défaut permettent de contrôler 32 lecteurs
de bandes. Par exemple, il est possible de contrôler jusqu'à
64 lecteurs avec deux numéros mineurs pour les options
différentes.)
Les fichiers spéciaux sont créés typiquement
ainsi :
mknod -m 660 /dev/st0 c 9 0
mknod -m 660 /dev/st0l c 9 32
mknod -m 660 /dev/st0m c 9 64
mknod -m 660 /dev/st0a c 9 96
mknod -m 660 /dev/nst0 c 9 128
mknod -m 660 /dev/nst0l c 9 160
mknod -m 660 /dev/nst0m c 9 192
mknod -m 660 /dev/nst0a c 9 224
Il n'existe pas de périphériques blocs
correspondants.
Le pilote utilise une mémoire tampon interne qui doit
être assez grande pour contenir au moins un bloc de données de
la bande. Dans les noyaux avant le 2.1.121, le tampon était
alloué sous forme de bloc continu. Cela limitait la taille de bloc au
plus grand espace contigu allouable par le noyau. Cette limite est
actuellement de 128 Ko pour les architectures 32 bits et
256 Ko pour les 64 bits. Dans les noyaux plus récents,
le pilote alloue la mémoire tampon en plusieurs parties disjointes si
nécessaire. Par défaut, le nombre maximal de parties est 16.
Ceci signifie que la taille maximale de bloc est très grande
(2 Mo si l'allocation de 16 blocs de 128 Ko
réussit).
La taille de la mémoire tampon interne est
déterminée par une constante à la compilation du noyau,
que l'on peut supplanter par une option au démarrage du
système. De plus, le pilote essaie d'allouer un tampon temporaire
plus grand lors de son exécution si cela s'avère
nécessaire. Toutefois l'allocation à l'exécution de
grands blocs contigus peut échouer, et il vaut mieux ne pas compter
dessus avec les noyaux antérieurs au 2.1.121 (cela s'applique
également au chargement de module à la demande avec kerneld ou
kmod).
Le pilote ne gère pas spécifiquement un type ou une
marque de lecteur de bandes. Après le démarrage du
système, les options du périphérique sont
définies par le microcode du périphérique. Par exemple,
si celui-ci réclame un mode de blocs fixes, le lecteur de bandes
utilisera ce mode. Les options peuvent être modifiées par des
appels ioctl(2) explicites et restent effectives lorsque le
périphérique est fermé puis réouvert. La
configuration des options affecte aussi bien les périphériques
avec rembobinage automatique que ceux sans.
Des options différentes peuvent être fournies pour
différents périphériques au sein du sous-groupe de
quatre. Les options prennent effet à l'ouverture du
périphérique. Par exemple, l'administrateur peut
définir un périphérique qui écrit des blocs
fixes d'une certaine taille, et un qui écrit avec des blocs de
longueur variable (si le périphérique accepte les deux
modes).
Le pilote gère les partitions de bandes si elles
sont acceptées par le lecteur. (Notez que les partitions de bande
n'ont rien à voir avec les partitions de disques. Une bande
partitionnée peut être vue comme un ensemble de bandes
logiques dans le même support). La gestion des partitions doit
être activé par un ioctl(2). L'emplacement de la bande
est sauvegardé au sein de chaque partition au cours des changements
de partitions. La partition utilisée pour les opérations
ultérieures est sélectionnée avec un ioctl(2).
Le changement de partition est effectué au moment de la suivante
opération bande afin d'éviter les mouvements inutiles de la
bande. Le nombre maximal de partitions sur une bande est défini par
une constante à la compilation (4 par défaut). Le pilote
contient un ioctl(2) qui peut formater une bande avec une ou deux
partitions.
Le fichier spécial de périphérique
/dev/tape est généralement un lien symbolique ou un
matériel vers le lecteur de bandes par défaut.
Depuis le noyau 2.6.2, le pilote exporte dans le répertoire
de sysfs /sys/class/scsi_tape les périphériques
attachés et certains de leurs paramètres.
Le pilote accepte un fonctionnement aussi bien dans un mode de
blocs fixes que dans un mode de blocs de longueur variable (si c'est
accepté par le lecteur). En mode de blocs fixes, le
périphérique écrit les blocs de la taille
indiquée et la taille des blocs ne dépend pas de la
quantité de données transmises lors de l'appel système.
Dans le mode de longueur variable, un bloc de données est
écrit à chaque appel système write et le nombre
d'octets transmis indique la taille du bloc correspondant sur la bande.
Notez que les blocs de la bande ne contiennent aucune information sur le
mode d'écriture utilisé : la seule chose importante est
d'utiliser lors de la lecture une commande qui accepte la taille des blocs
de la bande.
En mode variable, le nombre d'octets à lire n'a pas besoin
de correspondre exactement à la taille du bloc de la bande. Si le
nombre demandé est plus grand que la taille du bloc suivant sur la
bande, l'appel système renverra la quantité de données
effectivement lues. Si la taille de bloc est plus grande que le nombre
demandé, l'appel système renverra les données
demandées et le reste du bloc est abandonné.
En mode fixe, le nombre d'octets demandé peut être
arbitraire, si la mémoire tampon est activée, ou un multiple
de la taille de bloc, si ce tampon est désactivé. Les noyaux
antérieurs au 2.1.121 permettent l'écriture avec un nombre
quelconque si les mémoires tampons sont activées. Dans tous
les autres cas (les noyaux antérieurs au 2.1.121 sans mémoire
tampon ou les noyaux plus récents), le nombre d'octets à
écrire doit être un multiple de la taille des blocs.
Dans le noyau 2.6, le pilote essaie de transférer les
données directement entre la mémoire tampon de l'utilisateur
et le périphérique. Si cela n'est pas possible, la
mémoire tapon interne au pilote de périphérique est
utilisée. Les raisons de ne pas utiliser des transferts directs sont
entre autres un mauvais alignement de la mémoire tampon de
l'utilisateur (par défaut 512 octets mais cela peut
être changé par le pilote HBA), l'adaptateur SCSI ne peut pas
atteindre un ou plusieurs blocs de la mémoire tampon de
l'utilisateur, etc.
Une marque « filemark » est
automatiquement écrit sur la bande si la dernière
opération avant fermeture était une écriture.
En lecture, une marque « filemark »
provoque les événements suivants : s'il reste des
données dans le tampon lorsqu'on trouve la marque, les données
en mémoire sont renvoyées ; la lecture suivante renvoie
zéro octet ; la lecture suivante renvoie les données du
fichier suivant ; la fin des données enregistrées est
signalée par un retour de zéro octet pour deux appels
successifs en lecture. Enfin, le troisième appel renvoie une
erreur.
Le pilote gère trois requêtes ioctl(2). Les
requêtes non reconnues par st sont transmises au
contrôleur SCSI. Les définitions ci-dessous sont
extraites de /usr/include/linux/mtio.h :
Cette requête prend un paramètre de type (struct
mtop *). Certains contrôleurs ne gèrent pas toutes
les opérations. Le pilote renvoie une erreur EIO si le
périphérique n'accepte pas l'opération.
/* Structure MTIOCTOP - pour les opérations sur bande : */
struct mtop {
short mt_op; /* opérations définies ci-dessous */
int mt_count; /* nombre d'opérations */
};
Opérations sur bande magnétique lors d'une
utilisation normale :
- MTBSF
- Reculer la bande de mt_count filemarks.
- MTBSFM
- Reculer la bande de mt_count filemarks. Repositionner la bande sur
le côté EOT de la dernière marque.
- MTBSR
- Reculer la bande de mt_count enregistrements (blocs bande).
- MTBSS
- Reculer la bande de mt_count setmarks.
- MTCOMPRESSION
- Valider la compression des données sur bande dans le lecteur si
mt_count est non nul, désactiver la compression si
mt_count est nul. Cette commande utilise la page MODE 15
supportée par la plupart des DAT.
- MTEOM
- Aller à la fin des enregistrements (ajouter des fichiers).
- MTERASE
- Efface la bande. Avec un noyau 2.6, un effacement rapide (bande
marquée vide) est effectué si le paramètre est
zéro. Sinon, un effacement long (effacement complet) est
effectué.
- MTFSF
- Avancer la bande de mt_count filemarks.
- MTFSFM
- Avancer la bande de mt_count filemarks. Positionner la bande du
côté BOT de la dernière marque.
- MTFSR
- Avancer de mt_count enregistrements (blocs bande).
- MTFSS
- Avancer de mt_count setmarks.
- MTLOAD
- Exécuter la commande de chargement SCSI. Un cas particulier est
prévu pour certains chargeurs automatiques HP. Si mt_count
correspond à la somme de la constante MT_ST_HPLOADER_OFFSET
et d'un nombre, ce dernier est envoyé au pilote pour
contrôler le chargeur automatique.
- MTLOCK
- Verrouiller la porte du lecteur de bande.
- MTMKPART
- Formater la bande en une ou deux partitions. Si mt_count n'est pas
nul, il correspond à la taille de la première partition, et
la seconde partition correspond au reste de la bande. Si mt_count
est nul, la bande n'est formatée qu'en une seule partition. Cette
commande n'est autorisée que si le support de partitionnement est
activé pour le lecteur (voir MT_ST_CAN_PARTITIONS plus
bas).
- MTNOP
- Ne rien faire - Vider les tampons du pilote - À utiliser avant de
lire l'état avec MTIOCGET.
- MTOFFL
- Rembobiner la bande et éteindre le lecteur.
- MTRESET
- Réinitialiser le lecteur.
- MTRETEN
- Retendre la bande.
- MTREW
- Rembobiner la bande.
- MTSEEK
- Rechercher sur la bande le bloc numéro mt_count. Cette
opération nécessite soit un contrôleur SCSI-2 qui
supporte la commande LOCATE (adresse spécifique au
périphérique), soit un lecteur SCSI-1 compatible Tandberg
(Tandberg, Archive Viper, Wangtek, ... ). Le numéro de bloc devrait
toujours être un numéro renvoyé
précédemment par MTIOCPOS si les adresses
spécifiques au lecteur sont utilisées.
- MTSETBLK
- Définit la longueur de blocs du lecteur à la valeur
spécifiée dans mt_count. Une longueur de bloc nulle
place le lecteur dans le mode de blocs de tailles variables.
- MTSETDENSITY
- Définit la densité de la bande à celle codée
dans mt_count. Les codes des densités acceptées par
un lecteur sont disponibles dans la documentation de celui-ci.
- MTSETPART
- La partition active devient celle indiquée par mt_count. Les
partitions sont numérotées depuis zéro. Cette
commande n'est autorisée que si la gestion du partitionnement est
activée pour le lecteur (voir MT_ST_CAN_PARTITIONS plus
bas).
- MTUNLOAD
- Exécuter la commande de déchargement SCSI (n'éjecte
pas la bande).
- MTUNLOCK
- Déverrouiller la porte du lecteur de bande.
- MTWEOF
- Écrire mt_count filemarks.
- MTWSM
- Écrire mt_count setmarks.
Fonctions de configuration du lecteur de bande magnétique
(pour le superutilisateur) :
- MTSETDRVBUFFER
- Définit diverses options du pilote ou du lecteur en fonction des
bits codés dans mt_count. Ces options concernent le type de
tampon du lecteur, des options booléennes du pilote, le seuil
d'écriture du tampon, les valeurs par défaut des tailles de
blocs et de densité, ainsi que les délais de réponse
(pour les noyaux 2.1 et ultérieurs). Une fonction n'agit que sur un
seul des éléments de la liste ci-dessus à la fois
(l'ensemble des booléens constitue un élément).
- Une valeur ayant ses 4 bits de poids forts à 0 sera
utilisée pour indiquer le type de tampon du lecteur. Les types de
tampon sont :
- 0
- Le contrôleur ne renverra pas l'état BON en
écriture avant que les données ne soient réellement
écrites sur le support.
- 1
- Le contrôleur peut renvoyer l'état BON en
écriture dès que les données ont été
transmises aux tampons internes du lecteur de bande.
- 2
- Le contrôleur peut renvoyer l'état BON en
écriture dès que les données ont été
transmises aux tampons internes du lecteur de bande, si toutes les
écritures précédentes des tampons sur le support se
sont déroulées correctement.
- Pour contrôler le seuil d'écriture, on doit inclure dans
mt_count la constante MT_ST_WRITE_THRESHOLD associée
avec le nombre de blocs dans les 28 bits de poids faibles par un OU
binaire « | ». Le nombre de blocs concerne des
blocs de 1024 octets, et non pas la taille physique des blocs sur la
bande. Le seuil ne peut pas excéder la taille des tampons internes
du contrôleur. (voir DESCRIPTION, plus bas).
- Pour valider ou invalider les options booléennes, la valeur
mt_count doit inclure l'une des constantes MT_ST_BOOLEANS,
MT_ST_SETBOOLEANS, MT_ST_CLEARBOOLEANS ou
MT_ST_DEFBOOLEANS associées par un OU binaire avec
une combinaison des options décrites ci-dessous. Avec
MT_ST_BOOLEANS les options sont définies avec les valeurs
indiquées. Avec MT_ST_SETBOOLEANS les options sont
activées sélectivement et inhibées avec
MT_ST_DEFBOOLEANS.
-
- Les options par défaut pour un contrôleur de bande sont
choisies avec MT_ST_DEFBOOLEANS. Un périphérique non
actif (par exemple avec un numéro mineur de 32 ou 160) est
activé lorsque les options par défaut sont définies
pour la première fois. Un périphérique actif
hérite des options non définis explicitement du
périphérique actif au démarrage.
-
- Les options booléennes sont :
- MT_ST_BUFFER_WRITES
(Défaut : vrai)
- Les opérations d'écriture en mode de bloc fixes sont mises
en cache. Si cette option est invalidée, et si l'enregistreur
utilise une longueur de bloc fixe, toutes les opérations
d'écriture doivent se faire avec une longueur multiple de celle du
bloc. Cette option doit être fausse pour créer des archives
multivolumes fiables.
- MT_ST_ASYNC_WRITES
(Défaut : vrai)
- Quand cette option est validée, les opérations
d'écriture retournent immédiatement si les données
tiennent dans le tampon du pilote, sans attendre que celles-ci soient
effectivement transmises au lecteur de bande. Le seuil du tampon
d'écriture détermine le taux de remplissage du tampon avant
d'effectuer une commande SCSI. Toute erreur renvoyée par le
périphérique sera conservée jusqu'à
l'opération suivante. Cette option doit être fausse pour
créer des archives multivolumes fiables.
- MT_ST_READ_AHEAD
(Défaut : vrai)
- Cette option indique au pilote de fournir un cache en lecture, ainsi
qu'une lecture anticipée des données en mode de blocs fixes.
Si cette option est invalidée, et que le lecteur utilise une taille
de blocs fixes, toutes les opérations de lecture doivent se faire
avec une taille multiple de celle du bloc.
- MT_ST_TWO_FM
(Défaut : faux)
- Cette option modifie le comportement du pilote quand un fichier est
fermé. L'attitude normale consiste à écrire une seule
filemark, néanmoins si cette option est validée, le pilote
écrira deux filemarks et replacera la tête au-dessus de la
seconde.
- Note : Cette option ne doit pas être utilisée avec
les lecteurs de bandes QIC car ils ne sont pas capables d'écraser
une filemark. Ces lecteurs détectent la fin des données
enregistrées en cherchant de la bande vierge à la place des
deux filemarks consécutives habituelles. La plupart des autres
lecteurs courants détectent également la présence de
bande vierge, aussi l'utilisation des deux filemarks n'est
généralement utile que lors d'échange de bandes avec
d'autres systèmes.
- MT_ST_DEBUGGING
(Défaut : faux)
- Cette option valide les divers messages de débogage du pilote, si
celui-ci a été compilé avec la constante DEBUG
ayant une valeur non nulle).
- MT_ST_FAST_EOM
(Défaut : faux)
- Cette option indique que les opérations MTEOM doivent
être envoyées directement au lecteur, ce qui peut
accélérer les opérations, mais aussi faire perdre au
pilote le compte des pistes du fichier en cours, normalement
renvoyé par la requête MTIOCGET. Si
MT_ST_FAST_EOM est fausse, le contrôleur répondra
à une requête MTEOM en sautant en avant de fichiers
en fichiers.
- MT_ST_AUTO_LOCK
(Défaut : faux)
- Lorsque cette option est vraie, la porte du lecteur est verrouillée
lorsque le fichier périphérique est ouvert, et
déverrouillée lorsque le périphérique est
refermé.
- MT_ST_DEF_WRITES
(Défaut : faux)
- Les options de bande (taille de bloc, mode, compression...) peuvent varier
lorsque l'on passe d'un périphérique lié à un
lecteur à un autre périphérique correspondant au
même lecteur. Cette option définit si les changements sont
fournis au pilote en utilisant les commandes SCSI, et si les
capacités d'auto-détection du lecteur sont fiables. Si
l'option est fausse, le pilote envoie les commandes SCSI
immédiatement lorsque le périphérique change. Si
cette option est vraie, les commandes SCSI ne sont pas envoyées
avant une demande d'écriture. Dans ce cas, le micro-code est
habilité à détecter la structure de la bande lors de
la lecture, et les commandes SCSI ne sont utilisées que pour
être sûrs que la bande est écrite correctement.
- MT_ST_CAN_BSR
(Défaut : faux)
- Lorsque la lecture anticipée est utilisée, la bande doit
parfois être ramenée en arrière en position correcte
lors de la fermeture du périphérique, et on utilise alors la
commande SCSI pour sauter en arrière par-dessus les
enregistrements. Certains anciens lecteurs ne traitent pas correctement
cette commande, et cette option permet d'en avertir le pilote. Le
résultat final est qu'une bande avec blocs fixes et lecture
anticipée peut être mal positionnée dans un fichier
lors de la fermeture du périphérique. Avec un
noyau 2.6, l'option est activée par défaut pour les
lecteurs qui gèrent la norme SCSI-3.
- MT_ST_NO_BLKLIMS
(Défaut : faux)
- Certains lecteurs n'acceptent pas la commande SCSI READ BLOCK
LIMITS de lecture des limites de blocs. Si l'on utilise cette option,
le pilote n'invoque pas cette commande. L'inconvénient est que le
pilote ne peut pas vérifier, avant d'envoyer des commandes, si la
taille de bloc choisie est acceptée par le lecteur.
- MT_ST_CAN_PARTITIONS
(Défaut : faux)
- Cette option active le support des partitions multiples sur une bande.
Cette option s'applique à tous les périphériques
liés au lecteur.
- MT_ST_SCSI2LOGICAL
(Défaut : faux)
- Cette option indique au pilote d'utiliser les adresses de blocs logiques
définies dans le standard SCSI-2, lors d'opérations de
positionnement et de lecture de la position (aussi bien lors des commandes
MTSEEK et MTIOCPOS que lors des changements de partitions).
Sinon il utilise les adresses spécifiques au
périphérique. Il est très recommandé d'activer
cette option si le lecteur supporte les adresses logiques car elles
contiennent également les filemarks. Il existe d'ailleurs quelques
lecteurs qui ne supportent que les adresses logiques.
- MT_ST_SYSV
(Défaut : faux)
- Lorsque cette option est activée, les périphériques
de bande utilisent les sémantiques System V. Dans le cas
contraire, ils utilisent la sémantique BSD. La différence
principale est le comportement lors de la fermeture d'un
périphérique en lecture. Avec System V, la bande est
positionnée en avant à la suite de la filemark suivante si
cela n'a pas déjà eu lieu lors de la lecture. Dans la
sémantique BSD, la position ne change pas.
- MT_NO_WAIT
(Défaut : faux)
- Active le mode immédiat (i.e. n'attend pas la fin de la commande)
pour certaines commandes comme le rembobinage.
Un exemple :
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);
-
- La taille de bloc par défaut pour un périphérique
peut être configurée avec MT_ST_DEF_BLKSIZE et le
code de densité par défaut avec MT_ST_DEFDENSITY. Les
valeurs des paramètres sont associées par un OU logique avec
le code opératoire.
-
- Avec les noyaux 2.1.x et ultérieurs, la valeur de délai
maximum peut être fournie avec la sous-commande
MT_ST_SET_TIMEOUT associée par OU avec le délai en
seconde. Le délai long (utilisé pour les rembobinages ou les
commandes pouvant durer longtemps) peut être configuré avec
MT_ST_SET_LONG_TIMEOUT. Les valeurs par défaut du noyau sont
très longues afin de s'assurer qu'une commande valide n'est jamais
interrompue pour dépassement de délai, et ceci quel que soit
le lecteur. À cause de cela, le pilote peut parfois sembler
gelé alors qu'il est en attente de dépassement de
délai. Ces commandes permettent donc de définir des valeurs
plus pratiques pour un lecteur donné. Les délais
définis pour un périphérique s'appliquent à
tous les périphériques liés au même
lecteur.
-
- A partir des noyaux 2.4.19 et 2.5.43, le pilote gère un bit
d'état qui indique si le lecteur demande un nettoyage. La
méthode utilisée par le lecteur pour renvoyer l'information
sur le nettoyage est définie en utilisant la sous-commande
MT_ST_SEL_CLN. Si la valeur est zéro, le bit du nettoyage
vaut toujours zéro. Si la valeur est 1, la donnée TapeAlert
définie dans le standard SCSI-3 est utilisée (pas encore
implémenté). Les valeurs 2 à 17 sont
réservées. Si les 8 bits de poids faible donnent une valeur
supérieure à 18, les bits des données
« extended sense » sont utilisés. Les
bits 9 à 16 forment un masque pour sélectionner les bits
à observer et les bits 17 à 23 indiquent un motif de bits
à rechercher. Si le motif de bits est nul, un bit ou plus sous le
masque indique la requête de nettoyage. Si le motif est non nul, le
motif doit correspondre à l'octet des données
« sense » masqué.
Cette requête prend un paramètre du type (struct
mtget *).
/* Structure pour MTIOCGET - État de la bande magnétique */
struct mtget {
long mt_type;
long mt_resid;
/* Les registres suivants dépendent du matériel */
long mt_dsreg;
long mt_gstat;
long mt_erreg;
/* Ces deux derniers champs sont parfois inutilisés */
daddr_t mt_fileno;
daddr_t mt_blkno;
};
- mt_type
- Le fichier d'en-tête définit plusieurs valeurs pour
mt_type, mais le pilote actuel renvoie uniquement les types
génériques MT_ISSCSI1 (lecteur SCSI-1
générique) et MT_ISSCSI2 (lecteur SCSI-2
générique).
- mt_resid
- Contient le numéro de partition courante.
- mt_dsreg
- Renvoie la configuration actuelle de la longueur de bloc (dans les 24 bits
de poids faibles) et la densité (dans les 8 bits de poids forts).
Ces champs sont définis par MT_ST_BLKSIZE_SHIFT,
MT_ST_BLKSIZE_MASK, MT_ST_DENSITY_SHIFT, et
MT_ST_DENSITY_MASK.
- mt_gstat
- Renvoie des informations génériques d'état
(indépendants du périphérique). Le fichier
d'en-tête définit les macros suivantes pour tester les bits
d'état :
GMT_EOF(x) : La bande est
positionnée juste après une filemark (toujours faux
après une opération MTSEEK).
GMT_BOT(x) : La bande est
positionnée juste au début du premier fichier (toujours faux
après une opération MTSEEK).
GMT_EOT(x) : Une opération a
atteint la fin physique de la bande (End Of Tape).
GMT_SM(x) : La bande est
positionnée sur une setmark (toujours faux après une
opération MTSEEK).
GMT_EOD(x) : La bande est
positionnée à la fin des données
enregistrées.
GMT_WR_PROT(x) : La bande est
protégée en écriture. Pour certains enregistreurs, ceci
signifie qu'ils ne supportent pas l'écriture sur ce type de
bande.
GMT_ONLINE(x) : La dernière
opération open(2) a trouvé le lecteur prêt
à agir, avec une bande à l'intérieur.
GMT_D_6250(x), GMT_D_1600(x),
GMT_D_800(x) : Ces informations
“génériques” d'état renvoient la
densité actuelle des lecteurs de bandes 9-pistes ½"
seulement.
GMT_DR_OPEN(x) : Le lecteur ne contient
pas de bande.
GMT_IM_REP_EN(x) : Mode de rapport
immédiat. Ce bit est activé lorsqu'il n'y a aucune assurance
que les données aient été physiquement écrites
sur la bande lors du retour de l'appel système. Le bit est à
zéro seulement lorsque le lecteur ne cache pas les données et
que le pilote est configuré pour ne pas faire de cache non plus.
GMT_CLN(x) : Le lecteur a demandé
un nettoyage. Implémenté depuis les noyaux 2.4.19 et
2.5.43.
- mt_erreg
- Le seul champ défini dans mt_erreg est le nombre d'erreurs
corrigées, dans les 16 bits de poids faibles (comme défini
par les masques MT_ST_SOFTERR_SHIFT et MT_ST_SOFTERR_MASK).
À cause d'incompatibilités dans les méthodes
utilisées par les lecteurs pour rendre compte des corrections
d'erreur, cette valeur n'est pas toujours fournie (la plupart des lecteurs
ne renvoient pas, par défaut, les erreurs corrigées, mais
cela peut être modifié avec la commande SCSI MODE
SELECT).
- mt_fileno
- Renvoie le numéro du fichier en cours (commençant à
0). La valeur est mise à -1 si le numéro du fichier est
inconnu (par exemple, après un MTBSS ou un
MTSEEK).
- mt_blkno
- Renvoie le numéro de bloc (commençant à 0) à
l'intérieur du fichier en cours. Cette valeur est mise à -1
quand le numéro de bloc est inconnu (par exemple, après un
MTBSF, un MTBSS, ou un MTSEEK).
Cette requête prend un paramètre du type (struct
mtpos *) et renvoie une valeur spécifique au lecteur,
correspondant au numéro de bloc en cours, et qui n'est pas la
même que mt_blkno renvoyée par MTIOCGET. Ce
lecteur doit être un modèle SCSI-2 qui supporte la commande
READ POSITION ou un lecteur SCSI-1 compatible Tandberg (Tandberg,
Archive Viper, Wangtek, ...).
/* Structure pour MTIOCPOS - Commande pour obtenir la position */
struct mtpos {
long mt_blkno; /* numéro du bloc courant */
};