blk_dev_struct
wskaznik na
posortowana liste zadan (nie mylic z zadaniami). Kazde zadanie opisane jest
przez dluga strukture request
zdefiniowana w pliku
include/linux/blkdev.h
.
struct request {
volatile int rq_status;
kdev_t rq_dev;
int cmd;
int errors;
unsigned long sector;
unsigned long nr_sectors;
unsigned long current_nr_sectors;
char * buffer;
struct semaphore * sem;
struct buffer_head * bh;
struct buffer_head * bhtail;
struct request * next;
}
rq_status
rq_dev
cmd
errors
sector, nr_sectors
current_nr_sectors
buffer
bh, bhtail
sem
Zadania dla wszystkich urzadzen blokowych znajduja sie w tablicy
all_requests
o wielkosci 64 elementow, z czego 2/3 moze byc
zajete przez zadania zapisu. Proces, ktory chce zlecic urzadzeniu operacje
wejscia-wyjscia, a nie znajdzie wolnej pozycji w tablicy all_requests
zawiesza sie na kolejce wait_for_request
.
Po wstawieniu do tablicy, kazde nowe zadanie wstawiane jest na liste zadan dla
konkretnego programu obslugi urzadzenia. Tak zwany Algorytm windy
(
Elevator algorithm) wstawia zadanie na wlasciwe miejsce utrzymujac liste
posortowana leksykograficznie po numerach drugorzednych urzadzenia, do ktorego
zadanie jest skierowane (numery glowne urzadzen w obrebie kolejki sa takie same),
i po pierwszym sektorze, ktorego zadanie dotyczy. W starszych wersjach Linuxa
zadania czytania umieszczane byly przed zadaniami zapisu, stwierdzono jednak
lepsze dzialanie systemu przy rownorzednym traktowaniu operacji.
ll_rw_block
zdefiniowana w pliku
drivers/block/ll_rw_blk.c
jest uzywana przez wszystkie urzadzenia
blokowe, a sluzy do spelniania skierowanych do nich zadan. Zanim opisze ja
dokladniej, przedstawie pomocnicze funkcje uzywane do utworzenia nowego zadania
i wstawienia go do kolejki.
add_request
all_requests
na wlasciwe miejsce w kolejce zadan urzadzenia.
DEFINICJA:
void add_request( struct blk_dev_struct * dev,
/* wskaznik na strukture opisujaca urzadzenie */
struct request * req )
/* wskaznik na strukture opisujaca zadanie */
{
wylacz przerwania (cli);
zaznacz bufor zadania jako czysty (mark_buffer_clean);
if( w kolejce urzadzenia nie ma zadan )
{
wstaw zadanie na poczatek kolejki;
wywolaj procedure str|3l:!؛8)SƩe376B"38ZL X-
Oa];'3@/+Z9[ڌFDŽX@x4ks0K|;7F)[E=\SD'lU#jϛ_mjtX
%7)jܦٽ9%q1ZBaDB2`ńǵD0\INQ9Gj.-C:z
\Бxx RrndR39ڄ槪?nY,̊"qAG1ѼI\\G]
&zH*]'[U~~X4
/"$i6D=58lVo˱~2łk.SBGk60AP"WsĚԽe7^4LF5a?90)dW3"$.3Z
sXRLww:=OE?s&G& tB?GRɬsZH
XWھNl3kU+vsuuz7Ks%Źp@KNܚI!烂! Z,sx^DPdw\ռ7.>wGD8ĄN9Rhys,HVkZ3gkEIVM!E?c4+JHd8t*i @]fSVUa>ghCi`{>7cqO)I(cxHA>GW0Q3Zܾ\em+9K0Dm̠"pCg$Xkdgc"Sꘛ63dV 5oB#sEF?PEZA1AV%t*۸vb%jN{[0DL]Q#" b{6++E|wh`U*c:c.ŠӖpKh$B:5Ǣ)|(AcJ$35%FA$5߂.C88o`nLLO ]q 6y;MZ2>[ v%$fWFB+:Lp-h(`;0pֆx&G4~e?pO?;'X@ճ膣W_Q(
Nrb;,D ^-!ӷϚ{6wKSIinqB#3(,%(.4O3'-/\Cxj IIZIP2
A7'9Y
I"?܂I&J*(d8|ߩB8NU!~l | HnlCǠmn%]d0~ z.T*
o鲥r >%
F/GR%qʧ (%aY-v=ng^+\D9WՁqd,wz@2>-T}}Ěi1c4Cc
ڏ{K'K>h}:y m
"Ǔ"5!MK%e&aYelDPg
gj\Avp0-luR?knzC3g]rx0i2ZŷHKEo2ܰPQ<:P3:Mh0;2?jY:ы;scevb<]Pft.* C9u#+n@(=l`
V>ۗ.[R)@psyTsςAq;IiO'g?^B6132JImNz?&".7҄NywakwOXbTeEC13Y }Z#֘L͔5c5
i
j}5HZZLQОs(5>p>Z?F
!)GXN!`]};Iq-n||j$^I$PU PY?Ld1JVªEAET`DSKI`AQYPPQUW-4E,H*$Th($PD0b"1bEDQ
E*ۉEE~E
iJp0i`[
2O0)T84S
QUdm(XbTD}%,0_4aE=IC8r*łJ|ƀ`
U~~#@`r (3,W#C?0A/N'8$8u@ br!Zv~kQ)RμVzOاAgH7H/UT_蹵!Ҟ'מCf#]jGTRfzkLliy+_" dP
ϴ[&M($"D˅~OmiÖV5ɪ9y_>;(hjM03k?%6x?D=Tk${v0kU߭h{3CAiW/T/S0A
-waQW&Law;Z_L2fBK~m