Sterownik st udostępnia interfejs do
różnego rodzaju napędów taśm
magnetycznych SCSI. Obecnie sterownik przejmuje kontrolę nad
wszystkimi wykrytymi urządzeniami typu
„sequential-access” (dostępu sekwencyjnego).
Sterownikowi st przydzielony został numer główny
9.
Każde urządzenie ma osiem numerów
podrzędnych. Na pięciu najniższych bitach numeru
podrzędnego reprezentowane są przydzielone kolejno numery
urządzeń (kolejność detekcji). Numery
podrzędne można pogrupować w dwóch zbiorach po
cztery numery: główne numery podrzędne
(urządzenia z przewijaniem), n, oraz numery
urządzeń „bez przewijania”, (n+ 128).
Urządzenie otwarte przy wykorzystaniu głównego numeru
podrzędnego otrzyma polecenie REWIND podczas jego zamykania.
Urządzenia otwierane przy wykorzystaniu numeru urządzenia
„bez przewijania” nie otrzymają takiego rozkazu (trzeba
zauważyć, że używanie urządzenia
„bez przewijania” do pozycjonowania taśmy, na
przykład za pomocą mt, nie prowadzi do
pożądanego efektu: taśma jest przewijana po wydaniu
polecenia mt i następne polecenie zaczyna od początku
taśmy).
W każdej grupie dostępne są cztery numery
podrzędne, definiujące urządzenia o
różnej charakterystyce (rozmiar bloku, kompresja,
gęstość itp.). Podczas startu systemu dostępne
jest tylko pierwsze urządzenie. Aktywacja pozostałych trzech
następuje po zdefiniowaniu ich domyślnych charakterystyk
(patrz niżej). (Zmieniając wartości stałych
podczas kompilacji, możliwa jest zmiana równowagi
pomiędzy maksymalną liczbą napędów
taśm a liczbą numerów podrzędnych dla
każdego napędu. Domyślna alokacja powala na sterowanie
32 napędami taśm. Na przykład, można
sterować nie więcej niż 64 napędami taśm,
posiadając po dwa numery podrzędne dla różnych
opcji.)
Pliki urządzeń są zwykle tworzone za
pomocą poleceń:
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
Brak jest odpowiadających urządzeń
blokowych.
Sterownik używa wewnętrznego bufora o rozmiarze
dostatecznie dużym, by pomieścił co najmniej jeden blok
taśmy. Przed Linuksem 2.1.121 bufor ten jest przydzielany jako jeden
ciągły blok pamięci. Ogranicza to rozmiar bloku na
taśmie do największego ciągłego bloku
pamięci, który może zostać przydzielony przez
procedurę przydzielania pamięci w jądrze. Obecnie
ograniczenie to wynosi 128 kB dla architektur 32-bitowych i
256 kB dla architektur 64-bitowych. W nowszych jądrach
sterownik przydziela, jeśli trzeba, pamięć dla bufora w
kilku częściach. Domyślna maksymalna liczba
fragmentów wynosi 16. Oznacza to, że maksymalny rozmiar bloku
jest bardzo duży (2 MB, jeśli uda się
przydzielić 16 bloków po 128 kB).
Rozmiar wewnętrznego bufora sterownika jest
określony przez stałą czasu kompilacji, ale
można go zmienić za pomocą opcji startowej
jądra. Dodatkowo, sterownik próbuje przydzielać
większy bufor tymczasowy, jeśli zajdzie taka potrzeba w
trakcie pracy. Jednakże, przydzielanie podczas pracy dużych
ciągłych bloków pamięci może się
nie udać i zaleca się nie polegać za bardzo na
przydzielaniu buforów dynamicznych przed Linuksem 2.1.121 (dotyczy to
także ładowania na żądanie sterownika za
pomocą kerneld lub kmod).
Ten sterownik nie zawiera żadnej specyficznej
obsługi dla taśm wybranego producenta, czy modelu. Po starcie
systemu opcje urządzenia taśmowego są określane
na podstawie firmware napędu. Na przykład, jeśli
firmware napędu wybiera tryb o stałej długości
bloku, urządzenie taśmowe również używa
trybu o stałej długości bloku. Opcje te można
zmienić za pomocą jawnych wywołań
ioctl(2) i zmiany te pozostają aktywne, gdy urządzenie
zostanie zamknięte i ponownie otwarte. Ustawione opcje dotyczą
zarówno urządzeń z przewijaniem, jak i bez
przewijania.
Można podawać różne opcje dla
różnych urządzeń w ramach podgrupy czterech
urządzeń. Opcje są ustawiane dla urządzenia, gdy
jest otwierane. Na przykład, administrator systemu może
zdefiniować jedno urządzenie zapisujące w trybie o
stałej długości bloku i jedno zapisujące w
trybie o zmiennej długości bloku (jeśli napęd
obsługuje obydwa tryby).
Sterownik obsługuje strefy taśm, jeśli
są one obsługiwane przez napęd. (Trzeba tu
zwrócić uwagę, że strefy taśm nie
mają nic wspólnego z partycjami dysków [po angielsku w
obu przypadkach „partitions” - przyp. tłum.].
Taśma podzielona na strefy może być widziana jako kilka
logicznych taśm na jednym nośniku). Obsługę
stref trzeba włączyć za pomocą ioctl(2).
Przy zmianach stref zachowywane jest położenie na
taśmie w obrębie każdej ze stref. Strefę,
której mają dotyczyć następne operacje wybiera
się za pomocą ioctl(2). Przełączanie
stref odbywa się łącznie z następną
operacją na taśmie, aby uniknąć niepotrzebnego
przewijania taśmy. Maksymalna liczba stref na taśmie
określona jest przez stałą czasu kompilacji
(pierwotnie: cztery). Sterownik zawiera ioctl(2) pozwalający
sformatować taśmę z jedną lub dwiema
strefami.
Urządzenie /dev/tape jest zwykle dowiązaniem
zwykłym lub symbolicznym do domyślnego urządzenia
reprezentującego taśmę magnetyczną w danym
systemie.
Od Linuksa 2.6.2, sterownik eksportuje do katalogu sysfs
/sys/class/scsi_tape dołączone urządzenia i
część parametrów przypisanych do
urządzenia.
Sterownik może pracować zarówno w trybie o
stałej, jak i o zmiennej długości bloku (jeśli
napęd obsługuje oba tryby). W trybie o stałej
długości bloku napęd zapisuje bloki określonej
długości i rozmiar bloku nie zależy od liczby
bajtów, która została podana systemowej funkcji zapisu.
W trybie o zmiennej długości bloku zapisywany jest jeden blok
przy każdym wywołaniu funkcji zapisu, a liczba bajtów
podanych tej funkcji określa rozmiar odpowiedniego bloku na
taśmie. Należy tu zwrócić uwagę, ze bloki
na taśmie nie zawierają informacji o trybie zapisu:
jedyną ważną rzeczą podczas odczytu jest
używanie poleceń akceptujących rozmiary bloków
znajdujących się na taśmie.
W trybie o zmiennej długości bloku
ilość odczytywanych bajtów nie musi dokładnie
odpowiadać długości bloku na taśmie.
Jeśli liczba bajtów jest większa niż
następny blok na taśmie, sterownik zwróci dane, a
funkcja zwróci rozmiar bieżącego bloku. Jeśli
długość bloku jest większa niż liczba
bajtów, zwrócony zostanie błąd.
W trybie o stałej długości bloku
ilość odczytywanych bajtów może być
dowolna, gdy włączone jest buforowanie. Musi natomiast
być wielokrotnością długości bloku, gdy
buforowanie jest wyłączone. Przed Linuksem 2.1.121
jądra pozwalały na zapis dowolnej liczby bajtów przy
włączonym buforowaniu. Natomiast w pozostałych
przypadkach (przed Linuksem 2.1.121 z wyłączonym buforowaniem
oraz nowsze jądra) liczba zapisywanych bajtów musi być
wielokrotnością długości bloku na
taśmie.
W Linuksie 2.6, sterownik stara się używać
bezpośrednich transferów pomiędzy buforem
użytkownika a urządzeniem. Jeśli nie jest to
możliwe, używany jest wewnętrzny bufor sterownika.
Powodem, dla którego transfer bezpośredni nie jest
użyty, może być niepoprawne wyrównanie bufora
użytkownika (domyślne wynosi 512 bajtów, ale
może być zmienione w sterowniku HBA),
niedostępność jednej lub więcej stron bufora
użytkownika dla adaptera SCSI itp.
Znacznik pliku jest zapisywany na taśmie automatycznie,
jeśli ostatnią operacją na tej taśmie przed jej
zamknięciem był zapis.
Gdy podczas odczytu napotkany zostanie znacznik pliku, dzieje
się co następuje. Jeśli w chwili natrafienia na
znacznik pliku w buforze były dane, zostaną zwrócone
dane z bufora. Następny odczyt zwróci zero bajtów.
Kolejne odczyty zwrócą dane z następnego pliku. Koniec
zapisanych danych jest sygnalizowany zwróceniem zerowej liczby
bajtów przez dwa kolejne wywołania funkcji odczytu. Trzeci
odczyt zwróci błąd.
Sterownik obsługuje trzy wywołania funkcji
ioctl(2). Wywołania nierozpoznawane przez sterownik i
st są przekazywane do sterownika SCSI. Poniższe
definicje pochodzą z pliku /usr/include/linux/mtio.h:
To wywołanie wymaga argumentu typu (struct
mtop *). Nie wszystkie napędy obsługują
wszystkie polecenia. Jeśli napęd odrzuca polecenie, sterownik
przekazuje wartość EIO.
/* Struktura dla polecenia MTIOCTOP dla taśmy magnetycznej: */
struct mtop {
short mt_op; /* operacje zdefiniowane poniżej */
int mt_count; /* liczba powtórzeń operacji */
};
Operacje na taśmie magnetycznej:
- MTBSF
- Przesunięcie do tyłu o mt_count znaczników
pliku.
- MTBSFM
- Przesunięcie do tyłu o mt_count znaczników
pliku. Ustawienie taśmy po stronie EOT (końca taśmy)
ostatniego znacznika pliku.
- MTBSR
- Przesunięcie do tyłu o mt_count rekordów
(bloków taśmy).
- MTBSS
- Przesunięcie do tyłu o mt_count znaczników
(setmarks).
- MTCOMPRESSION
- Włączenie kompresji danych na taśmie dla danego
napędu, gdy mt_count jest niezerowe,
wyłączenie kompresji, gdy mt_count jest zerem.
Polecenie to korzysta z MODE page 15 obsługiwanego przez
większość urządzeń DAT.
- MTEOM
- Przesunięcie do końca zapisanej części
nośnika (w celu dogrania plików).
- MTERASE
- Usunięcie zapisu z taśmy. W Linuksie 2.6 szybkie usuwanie
(oznaczenie taśmy jako pustej) jest wykonywane, gdy argumentem jest
zero. W przeciwnym wypadku przeprowadzane jest długie usuwanie
(usuwanie wszystkiego).
- MTFSF
- Przesunięcie do przodu o mt_count znaczników
pliku.
- MTFSFM
- Przesunięcie do przodu o mt_count znaczników pliku.
Ustawienie taśmy po stronie BOT (początku taśmy)
ostatniego znacznika pliku.
- MTFSR
- Przesunięcie do przodu o mt_count rekordów
(bloków taśmy).
- MTFSS
- Przesunięcie do przodu o mt_count znaczników
(setmarks).
- MTLOAD
- Wykonanie polecenia SCSI „load” (załadowanie
taśmy). Szczególny przypadek dotyczący
wyłącznie niektórych automatycznie
ładujących napędów HP: gdy mt_count
jest równe stałej MT_ST_HPLOADER_OFFSET
powiększonej o pewną liczbę, to ta liczba jest
przesyłana do napędu dla celów sterowania
automatycznym załadowaniem.
- MTLOCK
- Zablokowanie kieszeni napędu taśm.
- MTMKPART
- Sformatowanie taśmy na jedną lub dwie strefy. Gdy
mt_count jest dodatnie, określa rozmiar strefy 1, a strefa 0
obejmuje resztę taśmy. Gdy mt_count jest zerem,
taśma jest formatowana jako jedna strefa. Od Linuksa 4.6, ujemne
mt_count określa rozmiar strefy 0, a reszta taśmy
zawiera strefę 1. Fizyczna kolejność stref
zależy od napędu. Polecenie to nie jest dozwolone dla
napędów, dla których nie włączono
obsługi stref (zobacz MT_ST_CAN_PARTITIONS
poniżej).
- MTNOP
- Brak operacji — jako efekt uboczny opróżnia bufor
sterownika. Powinno się tego używać przed odczytaniem
stanu za pomocą MTIOCGET.
- MTOFFL
- Przewinięcie taśmy i odłączenie
napędu.
- MTRESET
- Inicjalizacja napędu.
- MTRETEN
- Wyrównanie napięcia taśmy.
- MTREW
- Przewinięcie.
- MTSEEK
- Wyszukanie na taśmie bloku o numerze podanym w mt_count. Ta
operacja wymaga albo sterownika SCSI-2, który obsługuje
polecenie LOCATE (adres specyficzny dla urządzenia) albo
urządzenia SCSI-1 zgodnego z Tandberg (Tandberg, Archive Viper,
Wangtek, ... ). Numer bloku powinien być równy
zwróconemu poprzednio przez MTIOCPOS, gdy używany
jest adres specyficzny dla urządzenia.
- MTSETBLK
- Ustawienie długości bloku sterownika równej
wartości podanej w mt_count. Długość
równa 0 wprowadza napęd w tryb bloków o zmiennej
długości.
- MTSETDENSITY
- Ustawienie gęstości zapisu taśmy zakodowanej w
mt_count. Kody określające
gęstość zapisu obsługiwane przez dany
napęd można znaleźć w jego dokumentacji.
- MTSETPART
- Przełączenie aktywnej strefy na mt_count. Strefy
są numerowane od zera. Polecenie to nie jest dozwolone dla
napędów, dla których nie włączono
obsługi stref (zobacz MT_ST_CAN_PARTITIONS
poniżej).
- MTUNLOAD
- Wykonanie polecenia SCSI „unload” (nie wysuwa
taśmy).
- MTUNLOCK
- Odblokowanie kieszeni napędu taśm.
- MTWEOF
- Zapisanie mt_count znaczników pliku.
- MTWSM
- Zapisanie mt_count znaczników (setmarks).
Polecenia ustawiające opcje dla napędów
taśm magnetycznych (mogą być wydawane tylko przez
administratora):
- MTSETDRVBUFFER
- Ustawienie różnych opcji napędu i sterownika, zgodnie
z wartościami pól bitowych przekazanych w mt_count.
Dotyczy to sposobu buforowania przez sterownik, zestawu logicznych
parametrów sterownika oraz progu zapisu bufora, domyślnej
długości bloku i gęstości oraz czasów
przeterminowania (tylko od Linuksa 2.1). Pojedyncze działanie
może zmienić ustawienia tylko dla jednej pozycji z
poniższej listy (parametry logiczne są traktowane jako jedna
całość).
- Wartość, której 4 najwyższe bity są
równe 0 zostanie wykorzystana do ustawienia trybu buforowania
napędu. Do wyboru są następujące tryby:
- 0
- Napęd nie będzie sygnalizować stanu GOOD po
poleceniach zapisu, dopóki dane nie zostaną zapisane
fizycznie na nośniku.
- 1
- Napęd może sygnalizować stan GOOD po
poleceniach zapisu, gdy tylko wszystkie dane zostaną umieszczone w
wewnętrznym buforze napędu.
- 2
- Napęd może sygnalizować stan GOOD po
poleceniach zapisu, gdy tylko (a) wszystkie dane zostaną
przesłane do wewnętrznego bufora napędu i (b)
wszystkie buforowane dane (z innych poleceń) zostaną
pomyślnie zapisane na nośniku.
- Aby kontrolować próg zapisu, wartość
mt_count musi zawierać stałą
MT_ST_WRITE_THRESHOLD dodaną za pomocą bitowego OR do
liczby bloków w 28 najniższych bitach. Liczba bloków
odnosi się do 1024-bajtowych bloków, a nie bloków o
fizycznym rozmiarze bloku dla danego urządzenia. Próg zapisu
nie może przekroczyć rozmiaru wewnętrznego bufora
napędu (patrz OPIS powyżej).
- Aby ustawić lub usunąć opcje logiczne,
wartość mt_count musi zawierać jedną ze
stałych MT_ST_BOOLEANS, MT_ST_SETBOOLEANS,
MT_ST_CLEARBOOLEANS lub MT_ST_DEFBOOLEANS dodaną za
pomocą bitowego OR do dowolnej kombinacji poniższych opcji.
Użycie MT_ST_BOOLEANS powoduje nadanie wszystkim opcjom
wartości podanych na odpowiednich polach bitowych. Przy
MT_ST_SETBOOLEANS ustawione zostaną tylko wybrane opcje,
natomiast przy MT_ST_DEFBOOLEANS tylko wybrane opcje zostaną
usunięte.
- Za pomocą MT_ST_DEFBOOLEANS ustawiane są
domyślne opcje dla urządzenia taśmowego. Nieaktywne
urządzenia taśmowe (np. urządzenia o numerze
podrzędnym 32 lub 160) są aktywowane po pierwszym ustawieniu
dla nich domyślnych opcji. Aktywowane urządzenie dziedziczy
od urządzenia aktywowanego podczas startu systemu opcje,
które nie zostały jawnie podane.
- Dostępne są następujące opcje logiczne:
- MT_ST_BUFFER_WRITES
(Domyślnie: włączona)
- Buforowanie wszystkich operacji zapisu w trybie o stałej
długości bloku. Jeśli ta opcja jest
wyłączona i napęd używa stałej
długości bloku, wtedy wszystkie operacje zapisu muszą
dotyczyć wielokrotności długości bloku. Opcja
ta powinna być wyłączona, jeśli chcemy w
sposób pewny zapisywać archiwa składające
się z wielu wolumenów.
- MT_ST_ASYNC_WRITES
(Domyślnie: włączona)
- Gdy opcja ta jest włączona, wtedy operacje zapisu
przekazują sterowanie natychmiast, bez oczekiwania na
przesłanie informacji do napędu, jeśli tylko dane
mieszczą się w buforze sterownika. Stopień
wypełnienia bufora, przy którym zostanie wydane polecenie
zapisu SCSI, jest określony przez próg zapisu. Wszystkie
błędy zgłoszone przez napęd będą
wstrzymane aż do następnej operacji. Opcja ta powinna
być wyłączona, jeśli chcemy w sposób
pewny zapisywać archiwa składające się z wielu
wolumenów.
- MT_ST_READ_AHEAD
(Domyślnie: włączona)
- Opcja ta powoduje zapewnienie przez sterownik buforowania i odczytu
wyprzedzającego w trybie o stałej długości
bloku. Jeśli ta opcja jest wyłączona i napęd
używa bloków o stałej długości, wtedy
wszystkie operacje odczytu muszą dotyczyć
wielokrotności długości bloku.
- MT_ST_TWO_FM
(Domyślnie: wyłączona)
- Opcja ta zmienia zachowanie sterownika w momencie zamknięcia pliku.
Zwykle towarzyszy temu zapisanie pojedynczego znacznika końca
pliku. Jeśli opcja jest włączona, sterownik zapisze
dwa znaczniki i cofnie się przed drugi.
- Uwaga: Ta opcja nie powinna być włączona w przypadku
napędów QIC, ponieważ nie są one w stanie
nadpisać danych na znaczniku pliku. Napędy te
wykrywają koniec zapisanych danych poprzez sprawdzenie, czy
taśma jest pusta, zamiast stwierdzania dwóch kolejnych
znaczników końca pliku. Większość
innych współczesnych napędów
również wykrywa koniec zapisanych danych, więc
posługiwanie się dwoma znacznikami końca pliku jest
niezbędne jedynie przy wymianie taśm z niektórymi
innymi systemami.
- MT_ST_DEBUGGING
(Domyślnie: wyłączona)
- Ta opcja włącza wypisywanie przez sterownik
komunikatów diagnostycznych (skuteczne tylko gdy sterownik
został skompilowany ze zdefiniowaną niezerową
wartością DEBUG).
- MT_ST_FAST_EOM
(Domyślnie: wyłączona)
- Włączenie tej opcji powoduje, że polecenia
MTEOM są przesyłane bezpośrednio do
napędu, potencjalnie przyspieszając operację, lecz
jednocześnie powodując utratę przez sterownik
informacji o aktualnym położeniu taśmy - numerze
pliku, zwykle przekazywanego jako wynik zapytania MTIOCGET.
Jeśli opcja MT_ST_FAST_EOM jest wyłączona,
sterownik będzie odpowiadał na polecenie MTEOM
przewijaniem taśmy plik po pliku.
- MT_ST_AUTO_LOCK
(Domyślnie: wyłączona)
- Jeśli ta opcja jest włączona, to kieszeń
napędu będzie blokowana po otwarciu pliku urządzenia,
a odblokowywana po jego zamknięciu.
- MT_ST_DEF_WRITES
(Domyślnie: wyłączona)
- Opcje taśmy (długość bloku, tryb, kompresja
itp.) mogą ulec zmianie przy przełączaniu z jednego
urządzenia skojarzonego z napędem na inne urządzenia
skojarzone z tym samym napędem, w zależności od
definicji tych urządzeń. Ta opcja określa, kiedy
sterownik powinien wymusić zmiany wysyłając polecenia
SCSI oraz kiedy należy polegać na
właściwościach autodetekcyjnych urządzenia.
Jeśli opcja ta jest wyłączona, sterownik
będzie wysyłać polecenia SCSI natychmiast po zmianie
urządzenia. Jeśli jest ona włączona, polecenia
SCSI nie zostaną wysłane dopóki nie pojawi się
żądanie zapisu. W tym przypadku firmware napędu
może dokonywać podczas odczytu autodetekcji struktury
taśmy, a polecenia SCSI mają na celu jedynie zapewnienie,
aby zapis na taśmie odbywał się zgodnie z
właściwą specyfikacją.
- MT_ST_CAN_BSR
(Domyślnie: wyłączona)
- Gdy wykorzystywany jest odczyt wyprzedzający, taśma musi
być czasami cofnięta do właściwej pozycji.
Dzieje się to, gdy urządzenie jest zamykane i wykorzystywane
jest w tym celu polecenie SCSI cofania o zadaną ilość
rekordów. Niektóre starsze napędy nie potrafią
wykonać tego polecenia w sposób pewny i opcja ta
służy to zabronienia napędowi używania tych
poleceń. Końcowym efektem jest nieprawidłowe
pozycjonowanie taśmy po zamknięciu urządzenia przy
włączonym odczycie wyprzedzającym w trybie o
stałej długości bloku. W Linuksie 2.6
domyślnie wartość jest włączona w
przypadku napędów obsługujących SCSI-3.
- MT_ST_NO_BLKLIMS
(Domyślnie: wyłączona)
- Niektóre napędy nie obsługują polecenia SCSI
READ BLOCK LIMITS. Jeśli opcja ta jest
włączona, sterownik nie używa tego polecenia.
Wadą jest brak możliwości sprawdzenia przez sterownik
przed wysłaniem polecenia, czy zadana długość
bloku jest akceptowana przez napęd.
- MT_ST_CAN_PARTITIONS
(Domyślnie: wyłączona)
- Opcja ta włącza obsługę kilku stref na jednej
taśmie. Dotyczy ona wszystkich urządzeń skojarzonych
z napędem.
- MT_ST_SCSI2LOGICAL
(Domyślnie: wyłączona)
- Ta opcja poleca sterownikowi używanie logicznych adresów
bloków zdefiniowanych w standardzie SCSI-2 podczas wykonywania
operacji wyszukiwania (seek) oraz „tell” (dla poleceń
MTSEEK i MTIOCPOS oraz przy zmianie strefy taśmy). W
przeciwnym razie używane są adresy specyficzne dla
urządzenia. Włączenie tej opcji jest wysoce zalecane,
jeśli napęd obsługuje adresy logiczne, gdyż
zliczają one również znaczniki plików.
Niektóre napędy obsługują
wyłącznie logiczne adresy bloków.
- MT_ST_SYSV
(Domyślnie: wyłączona)
- Gdy ta opcja jest włączona, urządzenia taśmowe
używają semantyki Systemu V. W przeciwnym razie
używana jest semantyka BSD. Najważniejsza
różnica pomiędzy tymi semantykami polega na tym, co
się dzieje, gdy urządzenie używane do odczytu jest
zamykane: w semantyce Systemu V taśma jest przewijana do przodu
poza najbliższy znacznik pliku, jeśli nie stało
się to wcześniej. W semantyce BSD pozycja taśmy nie
jest zmieniana.
- MT_NO_WAIT
(Domyślnie: wyłączona)
- Włącza tryb natychmiastowy niektórych poleceń,
np. rewind — nie czeka na zakończenie polecenia.
Przykład:
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);
Domyślny rozmiar bloku dla urządzenia można
ustawić przy użyciu MT_ST_DEF_BLKSIZE, a
domyślny kod gęstości można ustawić przy
użyciu MT_ST_DEFDENSITY. Wartości tych
parametrów powinny być dodane za pomocą bitowej
alternatywy (OR) kodu operacji.
W Linuksie 2.1.x i późniejszych wartości
czasu przeterminowania (timeout) można ustawić przy
użyciu podpolecenia MT_ST_SET_TIMEOUT dodanego za
pomocą bitowego OR do czasu przeterminowania w sekundach.
Długie czasy przeterminowania (wykorzystywane przy poleceniach
przewijania i niektórych innych trwających długo)
można ustawić przy użyciu
MT_ST_SET_LONG_TIMEOUT. Domyślne wartości jądra
są bardzo długie, aby zapewnić, że
pomyślnie wykonywane polecenie nie zostanie przeterminowane przez
żaden napęd. Z tego powodu niniejszy sterownik może
sprawiać wrażenie zawieszonego, nawet gdy jedynie czeka on na
przeterminowanie operacji. Polecenia te mogą
służyć do ustawienia bardziej praktycznych
wartości dla konkretnego napędu. Czasy przeterminowania
ustawione dla jednego urządzenia dotyczą wszystkich
urządzeń skojarzonych z tym samym napędem.
Od Linuksa 2.4.19 i 2.5.43, sterownik obsługuje bit
statusu, wskazujący czy sterownik żąda czyszczenia.
Metoda używana przez napęd do zwrócenia informacji o
czyszczeniu jest ustawiona za pomocą podpolecenia
MT_ST_SEL_CLN. Jeśli wartość wynosi 0, to bit
czyszczenia wynosi zawsze zero. Przy wartości jeden, używane
są dane TapeAlert zdefiniowane w standardzie SCSI-3 (jeszcze nie
zaimplementowane). Wartości 2–17 są zastrzeżone.
Jeśli najniższe osiem bitów wynosi >=18, to
używane są bity z rozszerzonych danych próbkowania.
Bity 9–16 określają maskę do wybrania
bitów, które mają być wyszukiwane, a bity
17–23 określają wzorzec bitowy do wyszukiwania.
Jeśli wzorzec bitowy wynosi 0, to jeden lub więcej
bitów pod maską oznacza żądanie czyszczenia.
Jeśli wzorzec jest niezerowy, musi od pasować do maskowanego
bajtu danych próbkowania.
To polecenie wykorzystuje argument typu (struct
mtget *).
/* struktura dla MTIOCGET - odczytanie stanu taśmy magn. */
struct mtget {
long mt_type;
long mt_resid;
/* Następne rejestry są specyficzne dla urządzenia */
long mt_dsreg;
long mt_gstat;
long mt_erreg;
/* Kolejne dwa pola nie zawsze są używane */
daddr_t mt_fileno;
daddr_t mt_blkno;
};
- mt_type
- Plik nagłówkowy definiuje wiele możliwych
wartości mt_type, lecz bieżący sterownik
raportuje jedynie typy podstawowe MT_ISSCSI1 (Generic SCSI-1 tape)
oraz MT_ISSCSI2 (Generic SCSI-2 tape).
- mt_resid
- zawiera numer strefy bieżącej taśmy.
- mt_dsreg
- raportuje bieżące ustawienia długości bloku (w
najniższych 24 bitach) oraz gęstości zapisu (w 8
najwyższych bitach). Pola są zdefiniowane przez
MT_ST_BLKSIZE_SHIFT, MT_ST_BLKSIZE_MASK,
MT_ST_DENSITY_SHIFT i MT_ST_DENSITY_MASK.
- mt_gstat
- raportuje podstawowe (niezależne od urządzenia) informacje o
stanie. Plik nagłówkowy zawiera definicje makrodefinicji do
testowania przekazywanych bitów stanu:
- GMT_EOF(x)
- Taśma została ustawiona tuż za znacznikiem pliku
(zawsze nieprawdziwe po poleceniu MTSEEK).
- GMT_BOT(x)
- Taśma została ustawiona na początku pierwszego pliku
(zawsze nieprawdziwe po poleceniu MTSEEK).
- GMT_EOT(x)
- Wykonanie polecenia spowodowało osiągnięcie
fizycznego końca nośnika.
- GMT_SM(x)
- Taśma jest aktualnie ustawiona na znaczniku (setmark) (zawsze
nieprawdziwe po poleceniu MTSEEK).
- GMT_EOD(x)
- Taśma jest ustawiona na końcu zapisanych danych.
- GMT_WR_PROT(x)
- Napęd jest chroniony przed zapisem. W przypadku niektórych
urządzeń może to również
oznaczać, że napęd nie obsługuje zapisu na
bieżącym typie nośnika.
- GMT_ONLINE(x)
- Ostatnie wykonanie funkcji open(2) zastało napęd
gotowy do działania z odpowiednio umiejscowionym
nośnikiem.
- GMT_D_6250(x)
- GMT_D_1600(x)
- GMT_D_800(x)
- Ta „podstawowa” informacja o stanie urządzenia
zawiera również ustawienia gęstości zapisu,
lecz jedynie dla 9-ścieżkowych ½"
urządzeń.
- GMT_DR_OPEN(x)
- Brak taśmy w napędzie.
- GMT_IM_REP_EN(x)
- Tryb natychmiastowego raportowania. To pole bitowe jest ustawiane na 1,
gdy nie ma gwarancji, że dane zostały fizycznie zapisane na
taśmie do chwili zakończenia funkcji zapisu. Natomiast jest
ustawiane na zero tylko wtedy, gdy sterownik nie buforuje danych i
napęd został ustawiony na ich niebuforowanie.
- GMT_CLN(x)
- Napęd zażądał czyszczenia. Zaimplementowane od
Linuksa 2.4.19 i 2.5.43.
- mt_erreg
- Jedyne pole zdefiniowane w mt_erreg to licznik naprawionych
błędów, który znajduje się w 16 niskich
bitach (jak to zdefiniowano przez MT_ST_SOFTERR_SHIFT i
MT_ST_SOFTERR_MASK). Z powodu niezgodności w sposobie
zgłaszania naprawionych błędów przez
napędy, licznik ten często nie jest obsługiwany
(większość napędów domyślnie nie
zgłasza naprawionych błędów, ale można
to zmienić poleceniem SCSI "MODE SELECT").
- mt_fileno
- podaje bieżący numer pliku (licząc od zera). W
przypadku gdy numer pliku nie jest znany (np. po MTBSS lub
MTSEEK), przekazywana jest wartość -1.
- mt_blkno
- raportuje numer bloku (licząc od zera) wewnątrz
bieżącego pliku. Gdy numer bloku nie jest znany (np. po
poleceniach MTBSF, MTBSS lub MTSEEK), przekazywana
jest wartość -1.
To polecenie używa argumentu typu (struct
mtpos *) i podaje bieżący numer bloku taśmy
(w sensie, w jakim go rozumie napęd), co nie jest
równoważne z mt_blkno przekazywanym przez
MTIOCGET. Musi to być urządzenie SCSI-2, które
obsługuje polecenie READ POSITION (adres specyficzny dla
urządzenia) lub urządzenie SCSI-1 zgodne z Tandberg (Tandberg,
Archive Viper, Wangtek, ...).
/* struktura dla MTIOCPOS - odczytanie położenia taśmy magn. */
struct mtpos {
long mt_blkno; /* numer bieżącego bloku */
};