next up previous contents
Next: Podsumowanie Up: Systemy operacyjne - instrukcje Previous: Algorytm block_read   Spis rzeczy

Algorytm block_write

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:

  1. struct inode *inode - jest to i-węzeł czytanego pliku
  2. struct file *filp - dotyczy struktury w tablicy plików
  3. char *buf - bufor z danymi do zapisu
  4. unsigned long count - liczba bajtów do zapisu

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;
}


next up previous contents
Next: Podsumowanie Up: Systemy operacyjne - instrukcje Previous: Algorytm block_read   Spis rzeczy
2001-12-18