Algorytm można znaleźć w pliku linux/fs/block_dev.c, jak również w załączniku nr1 do referatu.
block_read pobiera cztery parametry:
Jako wynik zwracana jest ilość odczytanych bajtów lub w przypadku błędu jego kod. Algorytm jest zoptymalizowany tak, aby zmaksymalizować użycie różnych buforów.
long block_read( struct inode *inode, struct file *filp, char *buf, unsigned long count ) {
deklaracja zmiennych;
pobranie z i-węzła numeru urządzenia;
ustalenie wielkości bloku;
ustalenie pozycji w pliku;
ustalenie pierwszego bloku i liczby bloków do odczytu;
zainicjowanie zmiennej oznaczającej ilość przeczytanych danych -
zwracana jako wynik;
zadeklarowanie tablicy wskaźników na nagłówki buforów;
do
//dopóki liczba bajtów do przeczytania jest większa od zera
{
aktualny = 1;
//w tym momencie tablica wskaźników na nagłówki buforów jest pusta
while(są bloki do odczytu)
{
zmniejszenie liczby bloków do odczytu;
// żądanie przydzielenia buforów na blok
//za pomocą getblk pobieramy nagłówki dla każdego bloku
getblk(numer urządzenia, numer bloku, wielkość bloku);
sprawdzenie, czy bufor zawiera aktualne dane;
jesli nie to
aktualny = 0;
dodanie nagłowka do tablicy;
jesli blok zawiera aktualne dane (tzn. zmienna aktualny == 1) to
//następuje opuszczenie pętli i przepisanie danych
//do wolnych buforów
if (aktualny = 1)
break;
}
jeśli w tablicy wskaźników do nagłówków są jakieś elementy
//to wystosuj żądanie wczytania danych wywołanie funkcji ll_rw_block
//która jako parametry pobiera
// a) flagę oznaczającą operację do wykonania
// b) liczbę buforów do wczytania
// c) tablicę wskaźników do nagłówków buforów
ll_rw_block(READ, liczba buforów, tablica wskaźników);
do
//dopóki liczba bhe nie wskazuje na NULL
{
ustawienie wskaźnika bhe na poczatku tablicy wskaźników;
// czekanie na wczytanie bufora
wait_on_buffer(bhe);
//sprawdzenie czy są aktualne dane
jeśli nie ma aktualnych danych to {
//wywołanie funkcji brelse(bufor)
zwolnienie bufora bhe;
liczba bajtów do odczytu = 0;
break;
}
przepisanie danych z bufora do przestrzeni użytkownika;
//wywołanie funkcji brelse(bufor)
zwolnienie bufora bhe;
zwieksz licznik przeczytanych bajtow;
przesunięcie wskaźnika bhe;
}
}
//wywołanie funkcji brelse(bufor)
zwolnienie pozostałych przydzielonych buforów;
//mamy z tym do czynienia w przypadku czytania z wyprzedzeniem,
//są to bufory z których dane nie zostały odczytane,
//gdyż wystąpił bład odczytu
jesli liczba przeczytanych bajtów jest równa zero to zwróć błąd
//return -EIO;
wpp zwróć liczbę przeczytanych bajtów
}