Algorytm można znaleźć w pliku linux/fs/block_dev.c, jak również w załączniku nr2 do referatu.
block_write pobiera cztery parametry:
Jako wynik zwracana jest ilość zapisanych bajtów lub w przypadku błędu jego kod.
long block_write(struct inode *inode, struct file *filp, const char *buf, unsigned long count) {
deklaracja zmiennych;
pobranie z i-węzła numeru urządzenia;
sprawdzenie, czy urządzenie jest tylko do odczytu
jeśli tak to zwraca błąd
ustalenie wielkości bloku, pozycji w pliku i ilości bloków do zapisu;
//dopóki są dane do przeczytania
while(bajtów do przeczytania > 0)
{
jeżeli numer zapisywanego bloku jest większy niż wielkość urządzenia
w blokach to zwraca liczbę bajtów zapisanych lub zero
jeśli nie zapisano żadnych danych;
//żądanie przydziału bufora
bufor = getblk(numer urządzenia, numer bloku, wielkość bloku);
sprawdzenie, czy aktualny blok jest ostatnim do zapisu
jeśli tak to {
następuje żądanie przydziału buforów na bloki,
które były pobrane za pomocą funkcji getblk i
umieszczenie tych buforów w tablicy przydzielonych buforów;
czytanie bloków - użycie funkcji ll_rw_block;
jeśli wystąpi błąd podczas czytania to jest on zwracany;
zwolnienie wszystkich buforów prócz pierwszego - funkcja brelse;
}
zmniejszenie ilości bajtów do odczytu;
kopiowanie danych do bufora;
zaznaczenie bufora jako aktualnego za pomocą funkcji
mark_buffer_uptodate;
jeśli użyliśmy już wszystkich buforów - patrzymy na wielkość tablicy
przydzielonych buforów - to {
wystosowanie żądania zapisania buforów z tablicy za pomocą funkcji
ll_rw_block;
czekanie na zapis buforów - wait_on_buffer;
}
}
żądanie zapisu buforów z tablicy przydzielonych buforów;
czekanie na zapis;
jeśli wystąpił błąd zwróci kod błędu
wpp zwróci ilość przeczytanych bajtów;
}